.Net中使用Consul實(shí)現(xiàn)服務(wù)高可用的方法
一、目的
在微服務(wù)架構(gòu)中,為了保證服務(wù)的高可用,通常需要在服務(wù)使用中,通過負(fù)載均衡配置,來分發(fā)流量和提高系統(tǒng)可用性擴(kuò)展系統(tǒng)服務(wù)的吞吐能力。并消除系統(tǒng)中的單點(diǎn)故障,提升應(yīng)用系統(tǒng)的可用性。一般來說Nginx就可以實(shí)現(xiàn)負(fù)載均衡的功能。但是,因?yàn)镹ginx無法靈活的動態(tài)添加服務(wù),因此一般在微服務(wù)架構(gòu)中,會通過一些中間件來實(shí)現(xiàn),服務(wù)發(fā)現(xiàn)的框架常用的有:consul、zookeeper等。
這里主要介紹的是在.Net環(huán)境下Consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)等相關(guān)功能。
二、Consul概述
Consul是一個(gè)分布式、高度可用的數(shù)據(jù)中心感知服務(wù)發(fā)現(xiàn)平臺,包括簡單的服務(wù)注冊、運(yùn)行狀況檢查、故障檢測和密鑰值存儲。 它基于這樣一個(gè)前提:數(shù)據(jù)中心中的每個(gè)節(jié)點(diǎn)都運(yùn)行一個(gè) Consul 代理,并充當(dāng)服務(wù)器或客戶端。 每個(gè)代理通過可縮放的 gossip 協(xié)議進(jìn)行通信。

三、安裝和部署
3.1 下載Consul
Consul官網(wǎng)地址:Consul | HashiCorp Developer,Consul安裝非常簡單,在官網(wǎng),點(diǎn)擊download

ps:這里我們可以看到Consul支持多種操作系統(tǒng)可選,這里我們在window上測試,這里選擇windows。
3.2 安裝和運(yùn)行
Consul安裝:下載后,解壓即可。解壓后只有一個(gè)consul.exe可執(zhí)行文件。

Consul運(yùn)行命令如下(進(jìn)入CMD命令行):
cd 對應(yīng)盤符文件夾\consul_1.17.1_windows_amd64 //啟動Consul consul agent -dev //設(shè)置ip地址訪問-需要時(shí)配置 consul agent -dev -client=0.0.0.0
3.3 訪問Consul的UI頁面
啟動后會顯示如下內(nèi)容:

瀏覽器中訪問地址,http://localhost:8500/判斷Consul服務(wù)是否運(yùn)行成功。

ps:以上是Consul基本的單機(jī)部署,為保證高可用可以對Consul進(jìn)行集群部署。
四、.Net中使用Consul
4.1 安裝Nuget包
在業(yè)務(wù)服務(wù)中Nuget安裝: Consul,把業(yè)務(wù)服務(wù)注冊到Consul中
dotnet add packages Consul

4.2 .Net注冊服務(wù)
把當(dāng)前服務(wù)的相關(guān)地址信息,添加到Consul中:
using Consul;
using Microsoft.Extensions.Configuration;
using System;
namespace MicroService.Framework;
public static class ConsulHelper
{
/// <summary>
/// Consul注冊
/// </summary>
/// <param name="configuration"></param>
public static void ConsulRegist(this IConfiguration configuration)
{
//準(zhǔn)備鏈接Consul的Client
ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "test1";
});//找到consul
string ip = string.IsNullOrWhiteSpace(configuration["ip"]) ? "127.0.0.1" : configuration["ip"];
int port = string.IsNullOrWhiteSpace(configuration["port"]) ? 9001 : int.Parse(configuration["port"]);//命令行參數(shù)必須傳入
//int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = "service" + Guid.NewGuid(),//唯一id
Name = "test_server",//Group--分組
Address = ip,
Port = port,
//Tags = new string[] { weight.ToString() },//標(biāo)簽
Check = new AgentServiceCheck()
{
Interval = TimeSpan.FromSeconds(10),//間隔10s一次
HTTP = $"http://{ip}:{port}/Api/Health/Index",//健康檢測接口
Timeout = TimeSpan.FromSeconds(3),//檢測等待時(shí)間
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60)//失敗后多久移除
}
});
//命令行參數(shù)獲取
Console.WriteLine($"注冊成功:{ip}:{port}");
}
}程序啟動時(shí)注冊一次:

4.3 服務(wù)健康檢測
增加一個(gè)健康檢測接口,接口映射到管道中間件中處理,自定義返回結(jié)果:
public static class HealthExtention
{
public static void Health(this WebApplication app)
{
app.MapWhen(context => context.Request.Path.Equals("/Api/Health/Index"),
applicationBuilder => applicationBuilder.Run(async context =>
{
Console.WriteLine($"This is Health Check");
context.Response.StatusCode = (int)HttpStatusCode.OK;
await context.Response.WriteAsync("OK");
}));
}
}4.4 服務(wù)使用
運(yùn)行業(yè)務(wù)服務(wù),使用端口來區(qū)分不同的業(yè)務(wù)邏輯
dotnet run --urls=http://localhost:9001 --port=9001

五、調(diào)用Consul示例
客戶端需要引用Consul的組件,正常微服務(wù)模式下,客戶端只需要請求網(wǎng)關(guān)即可,請求通過網(wǎng)關(guān)會轉(zhuǎn)發(fā)到其他服務(wù)層。

客戶端調(diào)用Consul中的服務(wù)示例
//consul獲取服務(wù)api/users/all也得知道
string url = null;
url = "http://test_server/api/users/all";//consul就像dns--只是負(fù)責(zé)解析ip:port--清單
ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "test1";
});
var response = client.Agent.Services().Result.Response;//獲取服務(wù)清單
Uri uri = new Uri(url);
string groupName = uri.Host;
//服務(wù)實(shí)例
AgentService agentService = null;
var dictionary = response.Where(s => s.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)).ToArray();
{
//agentService = dictionary[0].Value;//寫死第一個(gè)
}
{
輪詢策略 也是平均,但是太僵硬了
agentService = dictionary[iIndex++ % dictionary.Length].Value;
}
//可自定義負(fù)載策略
url = $"{uri.Scheme}://{agentService.Address}:{agentService.Port}{uri.PathAndQuery}";
string content = InvokeApi(url);
var res = JsonConvert.DeserializeObject<IEnumerable<User>>(content);六、文章總結(jié)
在微服務(wù)架構(gòu)中,使用Consul作為服務(wù)發(fā)現(xiàn)和配置管理的工具是非常常見的。Consul由HashiCorp開發(fā),提供了一個(gè)完整的解決方案,其中包括服務(wù)發(fā)現(xiàn)、健康檢查、鍵值存儲以及多數(shù)據(jù)中心支持。
把之所學(xué),以文載之~ 歡迎大家多多交流
相關(guān)引用:
到此這篇關(guān)于.Net中使用Consul實(shí)現(xiàn)服務(wù)高可用的文章就介紹到這了,更多相關(guān).net Consul服務(wù)高可用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET?MVC5網(wǎng)站開發(fā)顯示文章列表(九)
顯示文章列表分兩塊,管理員可以顯示全部文章列表,一般用戶只顯示自己的文章列表。文章列表的顯示采用easyui-datagrid,后臺需要與之對應(yīng)的action返回json類型數(shù)據(jù),感興趣的小伙伴們可以參考一下2015-09-09
ASP.NET?Core中的Ocelot網(wǎng)關(guān)介紹
這篇文章介紹了ASP.NET?Core中的Ocelot網(wǎng)關(guān),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
asp.net后臺如何輸出js腳本使用什么方法可以實(shí)現(xiàn)
asp.net后臺如何輸出js腳本,用page.ClientScript.RegisterStartupScript方式實(shí)現(xiàn),實(shí)現(xiàn)示例如下,感興趣的朋友不要錯過2014-01-01
.Net Core在程序的任意位置使用和注入服務(wù)的方法
這篇文章主要介紹了.Net Core在程序的任意位置使用和注入服務(wù)的方法,很多朋友對此問題都不是很清楚,于是寫這篇文章幫助大家學(xué)習(xí),需要的朋友可以參考下2018-10-10
使用ASP.NET 2.0 CSS 控件適配器生成CSS友好的HTML輸出
使用ASP.NET 2.0 CSS 控件適配器生成CSS友好的HTML輸出...2007-03-03
.Net?Core跨平臺應(yīng)用開發(fā)串口篇HelloArm
這篇文章介紹了.Net?Core跨平臺應(yīng)用開發(fā)串口篇HelloArm,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
ASP.NET 頁面刷新和定時(shí)跳轉(zhuǎn)代碼整理
很多是摘網(wǎng)上的但是我整理了一下。以便以后查閱。2009-12-12

