環境 .NET5,Consul_v1.10.2

一、簡介

在微服務中利用Consul可以實現服務的注册,服務發現,治理,健康檢查等。

Web調站點需要調用多個服務,如果沒有Consul,可能就是Web中存了全部服務的ip地址,如果其中一個服務更換了地址,web也要跟著修改配置,所以加入了Consul,web直接通過Consul就能一直取到各個服務的最新的地址了。

二、Consul搭建

這裏使用Docker安裝 ,確保安裝了Docker,執行下面命令。

docker run -d -p 8500:8500 --restart=always --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client='0.0.0.0'

如果是windows環境,到官網https://www.consul.io 下載exe文件。然後cmd命令切換到consul.exe目錄,執行consul.exe agent -dev 即可啟動。

安裝完,訪問http:ip:8500,看到如下界面則安裝成功。

三、服務注册

安裝NuGet包 --Consul

appsettings.json增加Consul信息

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"urls": "http://*:5200",
"Consul": {
"consulAddress": "http://172.16.2.84:8500",
"serviceName": "api",
"currentIp": "172.16.2.9",
"currentPort": "5200"
} }

增加ConsulRegister.cs

 /// <summary>
/// Consul注册
/// </summary>
public static class ConsulRegister
{
//服務注册
public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IConfiguration configuration)
{
// 獲取主機生命周期管理接口
var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>(); ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri(configuration["Consul:consulAddress"]);
c.Datacenter = "dc1";
});
string ip = configuration["ip"];
string port = configuration["port"];
string currentIp = configuration["Consul:currentIP"];
string currentPort = configuration["Consul:currentPort"]; ip = string.IsNullOrEmpty(ip) ? currentIp : ip; //當前程序的IP
port = string.IsNullOrEmpty(port) ? currentPort : port; //當前程序的端口
string serviceId = $"service:{ip}:{port}";//服務ID,一個服務是唯一的
//服務注册
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = serviceId, //唯一的
Name = configuration["Consul:serviceName"], //組名稱-Group
Address = ip, //ip地址
Port = int.Parse(port), //端口
Tags = new string[] { "api站點" },
Check = new AgentServiceCheck()
{
Interval = TimeSpan.FromSeconds(10),//多久檢查一次心跳
HTTP = $"http://{ip}:{port}/Health/Index",
Timeout = TimeSpan.FromSeconds(5),//超時時間
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5) //服務停止多久後注銷服務
} }).Wait();
//應用程序終止時,注銷服務
lifetime.ApplicationStopping.Register(() =>
{
client.Agent.ServiceDeregister(serviceId).Wait();
});
return app;
}
}

在Startup.cs中 Configure(IApplicationBuilder app, IWebHostEnvironment env)方法後面加上  app.UseConsul(Configuration);

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
//Consul注册
app.UseConsul(Configuration);
}

增加健康檢查接口

上面Consul注册處有一個Check  Http的是心跳健康檢查的地址,需要提供一個接口。

新建HealthController.cs

 /// <summary>
/// consul健康檢查
/// </summary>
public class HealthController : Controller
{
public IActionResult Index()
{
return Ok();
}
}

這樣就配置好了,啟動項目時就會把服務注册到Consul,我這裏用發布文件同時啟動三個做負載。

dotnet ConsulAndOcelot.Demo.ServerB.dll --urls="http://*5201" --ip="172.16.2.9" --port=5201
dotnet ConsulAndOcelot.Demo.ServerB.dll --urls="http://*5202" --ip="172.16.2.9" --port=5202
dotnet ConsulAndOcelot.Demo.ServerB.dll --urls="http://*5203" --ip="172.16.2.9" --port=5203

啟動後,再看一下Consul界面,可以發現服務已成功注册到Consul。

四、服務發現

另外建一個.NetCore程序。

安裝Nuget包 --Consul

appsettings.json 配置Consul信息

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Consul": {
"consulAddress": "http://172.16.2.84:8500",
"serviceName": "platform",
"apiServiceName": "api"
}
}

新建ConsulHelper.cs類

 /// <summary>
/// Consul幫助類
/// </summary>
public class ConsulHelper
{
private IConfiguration _configuration;
public ConsulHelper(IConfiguration configuration)
{
_configuration = configuration;
}
/// <summary>
/// 根據服務名稱獲取服務地址
/// </summary>
/// <param name="serviceName"></param>
/// <returns></returns>
public string GetDomainByServiceName(string serviceName)
{
string domain = string.Empty;
//Consul客戶端
using (ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri(_configuration["Consul:consulAddress"]);
c.Datacenter = "dc1"; })
)
{
//根據服務名獲取健康的服務
var queryResult = client.Health.Service(serviceName, string.Empty, true);
var len = queryResult.Result.Response.Length;
//平均策略-多個負載中隨機獲取一個
var node = queryResult.Result.Response[new Random().Next(len)];
domain = $"http://{node.Service.Address}:{node.Service.Port}";
}
return domain;
} /// <summary>
/// 獲取api域名
/// </summary>
/// <returns></returns>
public string GetApiDomain()
{
return GetDomainByServiceName(_configuration["Consul:apiServiceName"]);
}
}

把ConsulHelper注入到IOC容器,Startup.cs中。ConfigureServices(IServiceCollection services)方法加上

 public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddTransient<ConsulHelper>();
}

驗證

 public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ConsulHelper _consulHelper; public HomeController(ILogger<HomeController> logger, ConsulHelper consulHelper)
{
_logger = logger;
_consulHelper = consulHelper;
} public IActionResult Index()
{
///獲取api服務地址
var domain = _consulHelper.GetApiDomain();
ViewBag.domain = domain;
return View();
}
}

執行結果,通過Consul獲得了服務地址,刷新後會隨獲取到三個負載中的一個。

Consul只負責服務發現,沒有自帶負載均衡策略。用上面的平均策略就可以了,如果想要做成輪詢策略的也可以,不過會增加一些開銷,可以給每組服務定義一個

靜態自增變量index=0,然後獲取的時候,index%服務數取餘,然後index++,這樣就是0%3=0,1%3=1,2%3=2,3%3=0一直循環,獲取List[index]服務,index>10000的時候重置為0,這樣就能循環的調用了。Conul後面配合Ocelot網關使用,Ocelot中會自帶幾種負載策略。

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服務注册,服務發現的更多相關文章

  1. .netcore consul實現服務注册與發現-單節點部署

    原文:.netcore consul實現服務注册與發現-單節點部署 一.Consul的基礎介紹     Consul是HashiCorp公司推出的開源工具,用於實現分布式系統的服務發現與配置.與其他分 ...

  2. .netcore consul實現服務注册與發現-集群部署

    一.Consul的集群介紹 Consul Agent有兩種運行模式:Server和Client.這裏的Server和Client只是Consul集群層面的區分,與搭建在Cluster之上的應用服務無關 ...

  3. NetCore項目實戰篇06---服務注册與發現之consul

    至此,我們的解决方案中新建了三個項目,網關(Zhengwei.Gateway).認證中心(Zhengwei.Identity)和用戶資源API(Zhengwei.Use.Api).當要訪問用戶API的 ...

  4. .net core Ocelot Consul 實現API網關 服務注册 服務發現 負載均衡

    大神張善友 分享過一篇 <.NET Core 在騰訊財付通的企業級應用開發實踐>裏面就是用.net core 和 Ocelot搭建的可擴展的高性能Api網關. Ocelot(http:// ...

  5. .netcore consul實現服務注册與發現-集群完整版

    原文:.netcore consul實現服務注册與發現-集群完整版 一.Consul的集群介紹    Consul Agent有兩種運行模式:Server和Client.這裏的Server和Clien ...

  6. .Net Core 商城微服務項目系列(二):使用Ocelot + Consul構建具備服務注册和發現功能的網關

    1.服務注册 在上一篇的鑒權和登錄服務中分別通過NuGet引用Consul這個包,同時新增AppBuilderExtensions類: public static class AppBuilderEx ...

  7. (8)ASP.NET Core3.1 Ocelot Consul服務注册與發現

    1.服務注册與發現(Service Discovery) ●服務注册:我們通過在每個服務實例寫入注册代碼,實例在啟動的時候會先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...

  8. .net core grpc consul 實現服務注册 服務發現 負載均衡(二)

    在上一篇 .net core grpc 實現通信(一) 中,我們實現的grpc通信在.net core中的可行性,但要在微服務中真正使用,還缺少 服務注册,服務發現及負載均衡等,本篇我們將在 .net ...

  9. Consul初探-服務注册和發現

    前言 經過上一篇的學習,現在已經來到了服務注册發現環節:Consul 的核心功能就是服務注册和發現,Consul 客戶端通過將自己注册到 Consul 服務器集群,然後等待調用方去發現服務,實現代理轉 ...

  10. .Net Core Grpc Consul 實現服務注册 服務發現 負載均衡

    本文是基於..net core grpc consul 實現服務注册 服務發現 負載均衡(二)的,很多內容是直接複制過來的,..net core grpc consul 實現服務注册 服務發現 負載均 ...

隨機推薦

  1. Xcode 7 PCH宏文件的配置和使用---學會使用宏定義

    使用宏的目的是什麼? 由於實際開發中,有時候一些設置信息需要重複使用(例如設置打印信息.配置顏色.配置寬度等),如果每次都手動去敲每次都去創建會很麻煩.雖然宏使用的時候會占用內存,可是目前來說大部分開 ...

  2. CentOS添加路由錶

    CentOS下靜態路由修改命令方法一:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1route add -host 192.168.1.1 dev 1 ...

  3. php 錯誤 Strict Standards: PHP Strict Standards: Declaration of .... should be compatible with that of 解决辦法

    錯誤原因:這是由於 php 5.3版本後.要求繼承類必須在父類之後定義.否則就會出現Strict Standards: PHP Strict Standards: Declaration of ... ...

  4. HP LoadRunner 11 破解及license

    國內私募機構九鼎控股打造APP,來就送 20元現金領取地址:http://jdb.jiudingcapital.com/phone.html內部邀請碼:C8E245J (不寫邀請碼,沒有現金送)國內私 ...

  5. Python for else 循環控制

    for語句可用來遍曆某一對象,還具有一個可選的else塊.如果for循環未被break終止,則執行else塊中的語句.break 在需要時終止for循環continue 跳過比特於其後的語句,開始下一輪 ...

  6. ORA-12520錯誤解决一則

    問題描寫敘述: 今天突然發現連接數據庫時報錯,用pl/sql dev連接數據時,有時能連接上,有時連接時報: ORA-12520: TNS: 監聽程序無法找到須要的server類型的可用句柄 通過se ...

  7. Error opening zip file or JAR manifest missing : D:\play-1.2.5/framework/play-1.2.5.jar

    play框架寫的項目,在eclipse中導入.build-path中全部jar包都加入.執行程序,出現: Error occurred during initialization of VM agen ...

  8. 微信公眾號平臺接口開發:基礎支持,獲取access_token

    新建Asp.net MVC 4.0項目 WeChatSubscript是項目UI層 WeChatTools是封裝操作訪問公眾號接口的一些方法類庫 獲取AccssToken 我們要的得到AccessTo ...

  9. python爬蟲人門(10)Scrapy框架之Downloader Middlewares

    設置下載中間件(Downloader Middlewares) 下載中間件是處於引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有 ...

  10. 如何在Linux下修改Mysql的用戶(root)密碼

    下面給大家分享下在Linux下如何修改Mysql的用戶(root)的密碼,分兩種情况:第一種當擁有原來的mysql的root密碼,第二種情况忘記原來的mysql的root的密碼. 修改的用戶都以roo ...