當前位置:網站首頁>[.Net]使用Soa庫+Abp搭建微服務項目框架(五):服務發現和健康監測
[.Net]使用Soa庫+Abp搭建微服務項目框架(五):服務發現和健康監測
2022-05-14 09:48:26【林曉lx】
上篇文章說過,服務發現和健康監測是面向服務體系架構重要的模塊,Soa庫可以配置使用Consul作為服務發現服務,或者輪詢已配置的服務列錶作為本機服務發現。
將用Hangfire來作為服務發現與健康監測的定時執行庫
具體配置信息請參考Hangfire – Background jobs and workers for .NET and .NET Core
服務發現
配置各個服務的地址列錶,或者在服務啟動時注册的key-value地址集合,輪詢地址服務描述服務(GetRoutesDescAsync),確定服務中方法的路由,方法簽名,使用方式,描述(功能,作者)等內容。
本機服務發現(InServer)
本機服務發現將輪詢Address配置中的地址所對應的RoutesGetters,執行獲取路由信息,並更新SoaServiceRoute中的Address集合
每個微服務都有一個Id 為 "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync"的方法
獲取該服務的地址,服務描述。
在服務模塊初始化中已經將這個服務路由對象添加到RoutesGetters
var service = new SoaServiceRoute
{
Address = new List<SoaAddress>
{
addr
},
ServiceDescriptor = new SoaServiceDesc { Id = "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync" }
};
在主服務(Soa.Sample.Web)中的appsettings.json中,配置如下:
"Discovery": "InServer"
配置服務發現,當前設置的輪詢間隔為每分鐘執行一次
"InServiceDiscovery": {
"Enable": true,
"JobCron": "0 * * * * ? "
}
各個服務Host的appsettings.json中,只需要配置Discovery即可:
"Discovery": "InServer",
Consul
可以使用UseConsulForDiscovery方法配置基於consul的服務發現功能
consul是google開源的一個使用go語言開發的服務發現、配置管理中心服務。內置了服務注册與發現框 架、分布一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案
首先去consul官網下載二進制文件
Downloads | Consul by HashiCorp
安裝直接下載zip包,解壓後只有一個可執行的文件consul,將consul添加到系統的環境變量裏面。
打開命令行並輸入consul.exe agent -dev -bind {你本機的ip地址} 來運行consul服務
在主服務(Soa.Sample.Web)和各個服務Host的appsettings.json中,配置如下:
配置文件中設置Discovery
"Discovery": "Consul",
設置Consul
"ConsulServiceDiscovery": {
"Ip": "127.0.0.1",
"Port": "8500"
}
注意8500為consul所在ip地址
服務運行時將自動注册ip和服務名稱到consul的kv中,待客戶端調用時,只需要傳入key值即可
當服務運行之後,在瀏覽器地址欄輸入127.0.0.1:8500查看已在consul注册的服務
服務監控
在ServicesManagerController是獲取服務列錶和服務詳情的Api接口控制器
[Route("api/[controller]/[action]")]
public class ServicesManagerController:AbpController
{
private readonly IClientServiceDiscovery clientServiceDiscovery;
public ServicesManagerController(IClientServiceDiscovery clientServiceDiscovery)
{
this.clientServiceDiscovery = clientServiceDiscovery;
}
[HttpGet]
public async Task<List<SoaAddress>> GetAddresses()
{
var addresses = await clientServiceDiscovery.GetAddressAsync();
return addresses;
}
[HttpGet]
public async Task<List<SoaServiceDesc>> GetServices(string server)
{
var routes = await clientServiceDiscovery.GetRoutesAsync();
if (routes != null && routes.Any() && !string.IsNullOrEmpty(server))
{
return (from route in routes
where route.Address.Any(x => x.Code == server)
select route.ServiceDescriptor).ToList();
}
return (from route in routes select route.ServiceDescriptor).ToList();
}
}
運行項目,在swagger中調試請求GetSoaService接口,可以獲取所有服務信息
健康監測
健康監測用於確定各服務的健康程度,比如是否運行緩慢,是否鏈接順暢等。
用一個簡單的監測鏈接是否超時方式,確定這個服務是否健康。
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = timeout })
{
try
{
await socket.ConnectAsync(server.CreateEndPoint());
server.IsHealth = true;
}
catch
{
server.IsHealth = false;
}
}
在主服務(Soa.Sample.Web)和各個服務Host的appsettings.json中,配置如下:
"HealthCheck": {
"Enable": true,
"JobCron": "0/5 * * * * ? ",
"Timeout": 3000
},
這裏健康監測服務的輪詢時間是5s,超時時間為3000ms
運行後關閉一個微服務,若關閉Service2,請求/api/ServicesManager/GetAddresses
可以看到IsHealth變為False
項目地址:
版權聲明
本文為[林曉lx]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/134/202205140921553437.html
邊欄推薦
- 【服務器數據恢複】硬盤壞道和不穩定扇區導致服務器崩潰的數據恢複案例
- 性能測試報告編寫技巧
- ASP.NET對Cookie的操作方法有哪些
- SAP UI5 應用開發教程之八十七 - 如何讓 SAP UI5 Mock 服務器支持自定義 url 參數試讀版
- Redis基礎之溫故
- 神經網絡中的反向傳播&&參數更新
- 深度學習基礎知識點(一)CNN卷積神經網絡——1.卷積方面的原理
- 從PlatEMO中提取真實PF前沿
- G020-OP-INS-RHEL-02 RedHat OpenStack 發放雲主機(命令行)
- 解决報錯: AttributeError: module ‘distutils‘ has no attribute ‘version‘,親測有效
猜你喜歡
隨機推薦
- c# 獲取枚舉描述的擴展方法
- 應如何認定解除合同通知的效力?
- 遊戲行業實戰案例5:玩家在線分布
- 【LeetCode】Day59-醜數 & 不同的二叉搜索樹
- CTFSHOW MISC入門
- 【國產免費】分布式作業批量處理平臺TASKCTL驗證的不同方式
- 數學建模學習(66):支持向量機 (SVM)案例實戰
- Thanos Sidecar組件
- Meta AI 宣布對人腦和語言處理進行長期研究
- 檢討書範文生成微信小程序工具源碼-支持流量主
- 元組類型(C# 參考)
- PTC:元宇宙引發醫療設備研發重大變革
- 面試題 01.05. 一次編輯 / 劍指 Offer II 041. 滑動窗口的平均值
- 華為機試第十一題:HJ11 數字顛倒
- Pascal VOC2012數據集
- unzip命令
- flink(scala版)學習一之常用的source
- [電路]7-實際電源模型和等效變換
- Go語言type自定義類型哦
- Pytorch和GPU有關操作(CUDA)
- 不均衡樣本集的重采樣
- uni-app技術分享| uni-app轉小程序-實時消息
- SQL中某個字段大於等於且不等於某值該如何寫
- 【Leetcode】442. 數組中重複的數據
- 2022年為什麼降薪也要跳槽?機會比漲薪很重要?
- 工作流結合動態錶單的工作流程
- 為什麼要使用.NET5?.NET5是未來!
- (pycharm)安裝nltk包
- 安裝Apache
- 利用循環輸入輸出數組(簡便易學)利用循環設置函數
- 雲原生時代的搜索服務算力管理
- 證券投資基金的監管
- ArrayList循環删除元素的常見問題及解决方法
- Stack Overflow 上最熱門的 10 個 Kotlin 問題
- 555 定時器的時間計算
- 二叉樹的最近公共祖先
- 模擬卷Leetcode【普通】931. 下降路徑最小和
- C語言 數組(一維數組 · 二維數組)
- NFC之華為AIPASS認證:測試用例簡介
- 622. 設計循環隊列