日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net core consul 服务配置 服务发现 服务健康检测 服务变更加载

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net core consul 服务配置 服务发现 服务健康检测 服务变更加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

準備環境

?安裝consul之后

1. 創建一個.net core webapi 舉例為UsercenterService

2. nuget引用Consul組件??https://github.com/PlayFab/consuldotnet

3. 創建配置實體類 (后面涉及功能介紹時候再解釋屬性含義)

1 public class AppSettings 2 { 3 /// <summary> 4 /// 數據庫連接字符串 5 /// </summary> 6 public string DbConnection { get; set; } 7 8 /// <summary> 9 /// 服務注冊參數 10 /// </summary> 11 public ServiceRegisterOptions ServiceRegisterOptions { get; set; } 12 } 13 14 public class ServiceRegisterOptions 15 { 16 /// <summary> 17 /// 是否啟用 18 /// </summary> 19 public bool IsActive { get; set; } 20 /// <summary> 21 /// 服務名稱 22 /// </summary> 23 public string ServiceName { get; set; } 24 /// <summary> 25 /// 服務IP或者域名 26 /// </summary> 27 public string ServiceHost { get; set; } 28 /// <summary> 29 /// 服務端口號 30 /// </summary> 31 public int ServicePort { get; set; } 32 /// <summary> 33 /// consul注冊地址 34 /// </summary> 35 public string ConsulRegisterUrl { get; set; } 36 /// <summary> 37 /// 標簽 例如laiwutest 38 /// </summary> 39 public string[] Tags { get; set; } 40 } View Code

4. appsettings配置consul服務地址和UserService配置在consul的節點key

  4.1 配置consul地址(舉例是在VS調試開發環境。所以在appsettings.Development.json中配置)?

1 { 2 "ConsulForConfig": { 3 "Host": "{IP}:8500",//這里替換成自己consul服務的IP地址 4 "Prefix": "git-dev/huangqiang/usercenterRegionIIS.json" 5 } 6 } View Code

? ? ? ?4.2 在consul上創建該節點并且配置

1 { 2 "DbConnection": "111111111111111111111111111111111111111", 3 "ServiceRegisterOptions": 4 { 5 "IsActive":true, 6 "ServiceName":"UserCenterRegion", 7 "ServiceHost":"{IP}",//修改{IP}為你注入的服務的ip地址 8 "ServicePort":"{Port}",//修改{Port}為你注入的服務的端口 9 "ConsulRegisterUrl":"{IP}:8500",//修改{IP}為你的consul服務的IP 10 "Tags":["浙江杭州"] 11 }, 12 } View Code

? ?


獲取配置??

1 public static AppSettings AddAppSettingByConsul(this IServiceCollection sc, IConfiguration configuration) 2 { 3 try 4 { 5 //get local consul service address configration consulclient 6 var consulAddress = $"http://" + configuration["ConsulForConfig:Host"]; 7 var key = configuration["ConsulForConfig:Prefix"]; 8 if (string.IsNullOrWhiteSpace(consulAddress) || string.IsNullOrWhiteSpace(key)) 9 { 10 throw new Exception("無法獲取consulAddress地址或者consul key"); 11 } 12 var consulClient = new ConsulClient(cfg => { cfg.Address = new Uri(consulAddress); }); 13 sc.AddSingleton<IConsulClient>(p => consulClient); 14 //get app config 15 var res = consulClient.KV.Get(key).GetAwaiter().GetResult(); 16 var resStr = Encoding.UTF8.GetString(res.Response.Value); 17 var appSettings = JsonConvert.DeserializeObject<AppSettings>(resStr); 18 if (appSettings == null) 19 { 20 throw new Exception($"appSettings 為null,consul 配置:{resStr}"); 21 } 22 sc.AddSingleton<AppSettings>(appSettings); 23 return appSettings; 24 } 25 catch (Exception e) 26 { 27 _log.Main.Error($"獲取consul appsettings配置異常:{e.Message}"); 28 Environment.Exit(-1); 29 } 30 return null; 31 } View Code

這里抽了一個擴展方法。使用的時候在Startup.cs類中的方法ConfigureServices中加入,這里弄了返回值只是偷懶下。

AddAppSettingByConsul方法邏輯:先是拿到配置的consull服務地址和Key,再通過前面nuget引用的consul組件中的consulclient獲取配置,最后注入到容器

調試下 就拿到配置了。這樣方便分布式服務,不用每臺都配置,直接consul管理

?


?

?

配置健康檢測和服務注冊

?準備健康檢測接口:

1 [Route("api/v1/[controller]")] 2 [ApiController] 3 public class HealthController : ControllerBase 4 { 5 [HttpGet] 6 public IActionResult Get() => Ok("ok"); 7 } View Code

.net core 配置注冊和健康檢測的地址

1 public static void UseConsul(this IApplicationBuilder app, IApplicationLifetime appLife) 2 { 3 try 4 { 5 var appSettings = app.ApplicationServices.GetService<AppSettings>(); 6 var consulClient = app.ApplicationServices.GetService<IConsulClient>(); 7 8 //config consul health check 9 var healthCheck = new AgentServiceCheck 10 { 11 DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5), 12 Interval = TimeSpan.FromSeconds(30), 13 HTTP = $"{appSettings.ServiceRegisterOptions.ServiceHost}:{appSettings.ServiceRegisterOptions.ServicePort}/api/v1/Health", 14 }; 15 16 //service register 17 var serviceId = $"{appSettings.ServiceRegisterOptions.ServiceName}_{appSettings.ServiceRegisterOptions.ServiceHost}:{appSettings.ServiceRegisterOptions.ServicePort}"; 18 var registration = new AgentServiceRegistration 19 { 20 Checks = new[] { healthCheck }, 21 Address = appSettings.ServiceRegisterOptions.ServiceHost, 22 Port = appSettings.ServiceRegisterOptions.ServicePort, 23 ID = serviceId, 24 Name = appSettings.ServiceRegisterOptions.ServiceName, 25 Tags = appSettings.ServiceRegisterOptions.Tags 26 }; 27 consulClient.Agent.ServiceRegister(registration).GetAwaiter().GetResult(); 28 29 //service Deregister when app stop 30 appLife.ApplicationStopped.Register(() => 31 { 32 consulClient.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult(); 33 }); 34 35 36 } 37 catch (Exception e) 38 { 39 _logger.Main.Error($"UseConsul error:{e.Message}"); 40 Environment.Exit(-1); 41 } 42 43 } View Code

?

這里也是抽了個擴展方法。調用放到Startup

?

UseConsul方法解釋:先是從容器中拿到前面注入的配置實體AppSettings和ConsulClient。再配置健康檢測,再配置服務注冊,再配置當服務關閉時候注銷服務。

其中健康檢測的DeregisterCriticalServiceAfter表示如果服務啟動失敗,多少時間內注銷consul上的該服務。

服務注冊的參數就不介紹了

然后跑起來之后,到consul ui瞧一瞧。是不是注冊成功,心跳正常

狀態為passing為正常的,剛啟動時候狀態會為critical。 當你的狀態一直為critical時候,過了前面DeregisterCriticalServiceAfter的時間,服務將會注銷,也就是注冊失敗。可能原因:服務地址配置有問題,consul無法訪問你的health地址,也可能你的端口沒打開。telnet看看

?

當都成功的時候,服務已經正常注冊到consul。下面再說說服務發現和服務變更發現


?

?

服務發現和服務變更發現

服務發現調用的方法有很多,agent,catalog,health,都可以獲取列表。但是agent是查詢本地自己的,catalog是整個集群的,heath是查詢健康的。這里用health獲取舉例

關鍵就一句話:_consulClient.Health.Service(serviceName, tag, true, queryOptions).Result。

這樣就能獲取到注冊到consul的服務列表了,但是如果有服務變更了(新的服務注冊,舊的服務停止),應該怎么辦?

一般想到啟動一個線程不停的去拿,是沒有問題,但是有個更好的東西,“Blocking Queries”??https://www.consul.io/api/index.html

這個東西簡單來說就是會記錄一個版本,consul服務端通過這個版本來判斷是不是已經是最新的服務列表,如果是的話,那么將會阻塞一定時間(這個時間可配置)

在c# 里面體現就是第三個參數queryOptions的WaitIndex和WaitTime,以及返回LastIndex,下面po出一部分代碼。

public void GetAllService(){_serviceIndexList.ForEach(p =>{Task.Run(() =>{var queryOptions = new QueryOptions { WaitTime = TimeSpan.FromSeconds(_waitTime) };while (true){GetAgentServices(queryOptions, p.ServiceName, p.Tag);}});});}public void GetAgentServices(QueryOptions queryOptions, string serviceName, string tag = null){try{var res = _consulClient.Health.Service(serviceName, tag, true, queryOptions).Result;_logger.Main.Info($"GetServiceList:{serviceName} {tag} waitIndex:{res.LastIndex}");if (queryOptions.WaitIndex != res.LastIndex){queryOptions.WaitIndex = res.LastIndex;var currentService = _consulServices.FirstOrDefault(p => p.ServiceName == serviceName);if (currentService == null){_consulServices.Add(new ConsulService{ServiceName = serviceName,Tag = tag,ServiceEntries = new ConcurrentBag<ServiceEntry>(res.Response)});}else{currentService.ServiceEntries = new ConcurrentBag<ServiceEntry>(res.Response);}}}catch (AggregateException ae){_logger.Main.Error($"consul獲取{serviceName},{tag}服務列表資源錯誤:{ae.Flatten()}",ae);}catch (Exception e){_logger.Main.Error($"consul獲取{serviceName},{tag}服務列表資源錯誤",e);}} View Code

注:代碼中的_serviceIndexList是存著需要獲取哪些服務的服務tag,_consulServices是程序維護的最新服務列表

?

轉載于:https://www.cnblogs.com/TeemoHQ/p/10523637.html

總結

以上是生活随笔為你收集整理的.net core consul 服务配置 服务发现 服务健康检测 服务变更加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美做爰猛烈床戏大尺度 | 懂色av中文字幕 | 欧美美女性高潮 | 精品一区二区三区欧美 | 男人操女人视频网站 | 日本不卡高清视频 | 国产精品一区在线观看 | 国产女人高潮视频 | 久热草| 蜜芽在线视频 | 国产精品乱码一区二区视频 | 成人免费高清在线播放 | 日韩大片一区 | 久久五十路 | 在线播放一区二区三区 | 狠狠地日| 欧美9999 | 日韩h视频 | 日韩一区二区高清 | 日韩精品无码一本二本三本色 | a毛片在线免费观看 | 欧美一级视频免费 | 日韩精品视频免费 | 国内精品一区二区 | 国产欧美日韩视频在线观看 | 干爹你真棒插曲免费 | 中文字幕乱码亚洲无线三区 | 无码人妻aⅴ一区二区三区69岛 | 日本伦理片在线播放 | 色欲国产精品一区二区 | 久久久久国产一区二区三区 | 麻豆精品国产精华精华液好用吗 | 美妇湿透娇羞紧窄迎合 | 美国式禁忌1980 | 日韩中文欧美 | 日本少妇一区二区 | av影院在线播放 | 特级淫片裸体免费看冫 | 三女同志亚洲人狂欢 | 亚洲精品乱码久久久久久蜜桃91 | 野外(巨肉高h) | 可以在线看黄的网站 | xxxxx色| 丁香色欲久久久久久综合网 | 成年人视频在线免费看 | 国产又粗又猛又爽69xx | 国产精品av网站 | 久久久久免费精品视频 | 久久久久女教师免费一区 | 国产精品成人一区二区三区 | 狠狠久久婷婷 | 亚洲婷婷在线 | 日韩视频中文字幕在线观看 | 日本a在线免费观看 | 免费观看一级视频 | 一区二区三区四区五区av | 国自产拍偷拍精品啪啪一区二区 | 女女同性女同一区二区三区按摩 | 91蜜臀精品国产自偷在线 | 午夜欧美精品久久久久久久 | 伊人网视频在线 | 日韩日韩日韩日韩日韩 | 骑骑上司妻电影 | 久草福利资源 | 天天骑夜夜操 | 黄网站色 | 99香蕉网 | 久久久久久久国产精品美女 | 夜夜se| 高潮流白浆在线观看 | 欧美不卡高清 | 丁五月 | 麻豆传媒在线 | 荒岛淫众女h文小说 | 国产黄色一区二区 | 免费污视频在线观看 | 精品香蕉99久久久久网站 | 亚洲四区| 阿v天堂2017 欧美小视频在线观看 | 中文字幕无码不卡免费视频 | 在线一区| 人妖ts福利视频一二三区 | 欧美亚洲一区二区三区 | 亚洲精品xxxxx | 尤物网站在线播放 | 中文字幕一区二区人妻痴汉电车 | www.麻豆av | 国产一区不卡在线 | 亚洲视频精品一区 | 亚洲中字幕 | 神马午夜场| 国产毛片不卡 | 国产一级一区 | 亚洲自拍偷拍一区二区三区 | 嫩草视频一区二区三区 | 91九色蝌蚪 | aa视频网站 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 久久综合精品国产二区无码不卡 |