網(wǎng)站首頁 編程語言 正文
今天有寫文章的時間了,開心。延續(xù)上一篇的話題繼續(xù),順便放上一篇的傳送門:點這里。
服務調(diào)用
既然服務注冊已經(jīng)搞完了,那么現(xiàn)在就開始調(diào)用這些注冊好的服務。先做一下準備動作,把consul容器跑起來:
打開控制臺確認正常:
然后多跑幾個應用程序模擬多點部署:
程序跑完以后檢察一下服務列表:
戳進去看看:
一切準備就緒,完美。然后進入編碼環(huán)節(jié)。老規(guī)矩,直接上碼:
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; //統(tǒng)一請求地址 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}"; }
上面是自行封裝的方法,作用很簡單:把通用的請求地址轉換為實際發(fā)起請求的地址,比如調(diào)用起來是這樣的:
string realUri = ConsulService.Convert("http://127.0.0.1:8700", "dc1", "http://shenzhen-ma/v1/client/base/index");
發(fā)現(xiàn)了么,分組名稱“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的數(shù)據(jù)。多試幾下再看看:
很顯然,通過統(tǒng)一的請求地址,實際的請求分發(fā)到了不同的節(jié)點上。
復盤一波
到剛才,我已經(jīng)完成了服務調(diào)用這個關鍵步驟。consul做了什么呢?它幫我們把統(tǒng)一的請求地址轉換成了真實發(fā)生作用的請求地址。未來如果增加了新的服務器,無需調(diào)整,它自己就能夠發(fā)現(xiàn)新的服務——這就是大家廣泛理解的服務發(fā)現(xiàn)。實際上,這個功能就賦予了我們動態(tài)增加節(jié)點的能力。能伸能縮,是微服務的一個重要特征。當然,因為沒有配置健康檢查,我的consul現(xiàn)在還不能自動移除不可用的服務,能伸不能縮,很尷尬。這個么,時間有限,放在下一篇文章去寫。這一篇文章能講清楚服務調(diào)用,并由此能理解什么是服務發(fā)現(xiàn),我覺得就達標。
原文鏈接:https://www.cnblogs.com/muchengqingxin/p/15035171.html
相關推薦
- 2022-07-24 Git版本控制服務器詳解_其它綜合
- 2022-10-06 C語言字符串壓縮之ZSTD算法詳解_C 語言
- 2023-11-18 Python list寫入txt文件
- 2022-09-26 快速搭建 ElasticSearch學習環(huán)境
- 2022-04-09 SpringBoot項目的Dockerfile和docker-compose.yml部署文件
- 2022-09-17 golang構建工具Makefile使用詳解_Golang
- 2022-06-08 Flutter集成高德地圖并添加自定義Maker的實踐_Android
- 2022-12-08 c++只保留float型的小數(shù)點后兩位問題_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支