網站首頁 編程語言 正文
今天有寫文章的時間了,開心。延續上一篇的話題繼續,順便放上一篇的傳送門:點這里。
服務調用
既然服務注冊已經搞完了,那么現在就開始調用這些注冊好的服務。先做一下準備動作,把consul容器跑起來:
打開控制臺確認正常:
然后多跑幾個應用程序模擬多點部署:
程序跑完以后檢察一下服務列表:
戳進去看看:
一切準備就緒,完美。然后進入編碼環節。老規矩,直接上碼:
public static string Convert(string consulUri, string centerName, string reqUri) { ConsulClient client = new ConsulClient(x => { x.Address = new Uri(consulUri); x.Datacenter = centerName; }); //獲取consul中注冊的服務列表 var consulServiceList = client.Agent.Services().Result.Response; //統一請求地址 Uri uri = new Uri(reqUri); //取出分組名稱 string groupName = uri.Host; //匹配出對應的服務 var serviceList = consulServiceList.Where(x => x.Value.Service.ToLower().Equals(groupName.ToLower())).ToArray(); //隨機訪問策略 var service = serviceList[new Random().Next(serviceList.Length)].Value; return $"{uri.Scheme}://{service.Address}:{service.Port}{uri.PathAndQuery}"; }
上面是自行封裝的方法,作用很簡單:把通用的請求地址轉換為實際發起請求的地址,比如調用起來是這樣的:
string realUri = ConsulService.Convert("http://127.0.0.1:8700", "dc1", "http://shenzhen-ma/v1/client/base/index");
發現了么,分組名稱“shenzhen-ma”直接替代了具體的ip和端口。這樣做真的可以拿到請求結果么?隨便寫一個測試用的controller:
public async Task<IActionResult> Post() { string realUri = ConsulService.Convert("http://127.0.0.1:8700", "dc1", "http://shenzhen-ma/v1/client/base/index"); string result = await Service.Tool.HttpHelper.Get(realUri); return Ok(result); }
看請求結果:
5001應用程序請求到了5004的數據。多試幾下再看看:
很顯然,通過統一的請求地址,實際的請求分發到了不同的節點上。
復盤一波
到剛才,我已經完成了服務調用這個關鍵步驟。consul做了什么呢?它幫我們把統一的請求地址轉換成了真實發生作用的請求地址。未來如果增加了新的服務器,無需調整,它自己就能夠發現新的服務——這就是大家廣泛理解的服務發現。實際上,這個功能就賦予了我們動態增加節點的能力。能伸能縮,是微服務的一個重要特征。當然,因為沒有配置健康檢查,我的consul現在還不能自動移除不可用的服務,能伸不能縮,很尷尬。這個么,時間有限,放在下一篇文章去寫。這一篇文章能講清楚服務調用,并由此能理解什么是服務發現,我覺得就達標。
原文鏈接:https://www.cnblogs.com/muchengqingxin/p/15035171.html
相關推薦
- 2023-10-16 微信小程序瀏覽docx,pdf等文件在線預覽使用wx.openDocument
- 2022-07-14 C++深入淺出講解希爾排序算法的實現_C 語言
- 2022-04-15 利用Python實現數值積分的方法_python
- 2023-01-20 React?useMemo與useCallabck有什么區別_React
- 2023-06-20 python?中?__init__的意義以及作用_python
- 2022-07-24 Golang?CSP并發機制及使用模型_Golang
- 2022-05-08 PyTorch實現多維度特征輸入邏輯回歸_python
- 2021-11-21 CentOS7環境中DHCP配置教程_Linux
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支