1.微服務註冊中心Consul

 

Consul 是HashiCorp公司推出的開源工具,Consul由Go語言開發,部署起來非常容易,只需要極少的可執行程序和配置文件,具有綠色、輕量級的特點。 Consul 是 分佈式 的、 高可用 的、 可橫向擴展 的用於實現分佈式系統的服務發現與配置。

中文網:Consul 中文文檔 - Consul 中文文檔 (gitbook.io)

1. Consul具有哪些特點
服務發現(Service Discovery): Consul 提供了通過DNS或者HTTP接口的方式來註冊服務和發現服務。一些外部的服務通過Consul很容易的找到它所依賴的服務。
健康檢查(Health Checking):Consul的Client可以提供任意數量的健康檢查,既可以與給定的服務相關聯(“webserver是否返回200 OK”),也可以與本地節點相關聯(“內存利用率是否低於
90%”)。操作員可以使用這些信息來監視集羣的健康狀況,服務發現組件可以使用這些信息將流量從不健康的主機路由出去。
Key/Value存儲:應用程序可以根據自己的需要使用Consul提供的Key/Value存儲。 Consul提供了簡單易用的HTTP接口,結合其他工具可以實現動態配置、功能標記、領袖選舉等等功能。
安全服務通信:Consul可以爲服務生成和分發TLS證書,以建立相互的TLS連接。意圖可用於定義允許哪些服務通信。服務分割可以很容易地進行管理,其目的是可以實時更改的,而不是使用複雜的網絡拓撲和靜態防火牆規則。
多數據中心: Consul支持開箱即用的多數據中心。這意味着Consul的用戶不必擔心建立額外的抽象層來發展到多個區域。

 

2.安裝Consul
windows 安裝
1. 選擇windows x64 版本(64bit)
2. 進入下載好的文件夾中,打開powershell ,執行命令,啓動服務端代理
consul.exe agent -dev
4. 瀏覽器輸入:http://IP:8500/出現ConsulWeb界面就表示成功了
-dev 表示開發模式,生產環境下不建議使用,因爲它不會保存任何狀態
-server 生產環境下可使用 

 

linux 安裝 
1. yum 安裝 consul 環境
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
2. 安裝完事後,執行命令查詢是否成功: 
[root@yushangxue ~]# consul version
Consul v1.10.3
Revision c976ffd2d
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use
protocol >2 when speaking to compatible agents)
3. 執行命令,啓動服務端
consul agent -dev
4. 瀏覽器輸入:http://IP:8500/出現ConsulWeb界面就表示成功了

 

Docker 安裝
1.拉取Consul鏡像
$ docker pull consul # 默認拉取latest
$ docker pull consul:1.15.4 # 拉取指定版本
2.安裝並運行
docker run -d -p 8500:8500 --restart=always --name=consul consul agent -server -
bootstrap -ui -node=1 -client='0.0.0.0'
agent: 表示啓動 Agent 進程。
server:表示啓動 Consul Server 模式
client:表示啓動 Consul Cilent 模式。
bootstrap:表示這個節點是 Server-Leader ,每個數據中心只能運行一臺服務器。技術角度上講
Leader 是通過 Raft 算法選舉的,但是集羣第一次啓動時需要一個引導 Leader,在引導羣集後,
建議不要使用此標誌。
ui:表示啓動 Web UI 管理器,默認開放端口 8500,所以上面使用 Docker 命令把 8500 端口對外
開放。
node:節點的名稱,集羣中必須是唯一的,默認是該節點的主機名。
client:consul服務偵聽地址,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1所以不對
外提供服務,如果你要對外提供服務改成0.0.0.0
join:表示加入到某一個集羣中去。 如:-json=192.168.0.11。 

 

Net 6 中如何使用 
添加3個API項目,2個服務端一個客戶端,配置如下
1. 安裝包:
Consul.AspNetCore 1.6.10.8
2. application.json 
客戶端ServiceName:Consul.Client。兩個服務端ServiceName:Consul.Service
客戶端ServiceIP:192.168.1.1。兩個服務端ServiceIP:192.168.1.2
"Consul": {
"ConsulHost": "http://localhost:8500",
"ServiceName": "ServiceName",
"ServiceIP": "x.x.x.x",
"ServicePort" : 5009
}
3. 添加Consul服務
public class ConsulOption
{
     public string ConsulHost { get; set; }
     public string ServiceName { get; set; }
     public string ServiceIP { get; set; }
     public int ServicePort { get; set; }
}

public static class ConsulServiceExtension
{
    public static IServiceCollection AddConsulService(this IServiceCollection services, IConfiguration configuration )
    {
        var consulSection = configuration.GetSection("Consul");
        services.Configure<ConsulOption>(consulSection);
        var consulOption = consulSection.Get<ConsulOption>();

        services.AddConsul(p =>
        {
            p.Address = new Uri(consulOption.HostAddress);
        });

        services.AddConsulServiceRegistration(p =>
        {
            p.ID = Guid.NewGuid().ToString();
            p.Name = consulOption.ServerName;
            p.Address = consulOption.ServiceAddress;
            p.Port = consulOption.Port;
            
            // 健康檢查
            p.Check = new()
            {
                // 1. 如果服務不可用(健康檢查失敗)的情況下,多久將當前服務移除
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                // 2. 健康檢查間隔時間
                Interval = TimeSpan.FromSeconds(10),
                // 3. 健康檢查地址(心跳地址)
                HTTP = $"http://{p.Address}:{p.Port}/health"
                // 4. 超時時間
                ,Timeout = TimeSpan.FromSeconds(5)
            };
        });

        return services;
    }
}
4. Program.cs 代碼
builder.Services.AddConsulService(builder.Configuration);
5. 創建健康檢查控制器: 
[Route("[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
[HttpGet]
public ActionResult GetHealthCheck()
{
Console.WriteLine($"進行心跳檢測:{DateTime.Now}");
return Ok("連接正常");
}
}

6.兩個服務端控制器寫一個方法

服務端1:

[Route("[controller]/[action]")]
[ApiController]
public class ProductController:ControllerBase
{
    [HttpGet]
    public IActionResult GetProduct()
    {
        List<ProductInfo> list = new()
        {
            new() {Id = 1, Name = "商品1"},
            new() {Id = 2, Name = "商品2"}
        };
        return Ok(list);
    }
}

服務端2:

[Route("[controller]/[action]")]
[ApiController]
public class ProductController:ControllerBase
{
    [HttpGet]
    public IActionResult GetProduct()
    {
        List<ProductInfo> list = new()
        {
            new() {Id = 3, Name = "商品3"},
            new() {Id = 4, Name = "商品4"}
        };
        return Ok(list);
    }
}

7客戶端調用

[Route("[controller]/[action]")]
[ApiController]
public class ClientController:ControllerBase
{
    private readonly IConsulClient _consulClient;

    public ClientController(IConsulClient consulClient)
    {
        _consulClient = consulClient;
    }

    [HttpGet]
    public async Task<IActionResult> GetProductByClient()
    {
        var instanceList = (await _consulClient.Catalog.
            Service("Consul.Service")).Response;

//如果要輪詢調用可以自己寫一個方法,這裏是隨機調用。 var instance = instanceList[new Random().Next(instanceList.Length)]; using HttpClient client = new(); var json = await client.GetStringAsync($"http://{instance.ServiceAddress}:{instance.ServicePort}/Product/GetProduct"); var result = JsonConvert.DeserializeObject<List<ProductInfo>>(json); return Ok(result); } }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章