Consul 學習筆記-服務註冊

chaney1992發表於2020-10-11

Consul簡介:

  Consul是一種服務網格解決方案,提供具有服務發現,配置和分段功能的全功能控制平面。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建完整的服務網格。Consul需要一個資料平面,並支援代理和本機整合模型。Consul附帶了一個簡單的內建代理,因此開箱即用,但也支援Envoy等第三方代理整合。

 特點:

  • 服務發現: Consul的客戶端可用提供一個服務,比如 api 或者mysql ,另外一些客戶端可用使用Consul去發現一個指定服務的提供者.通過DNS或者HTTP應用程式可用很容易的找到他所依賴的服務.
  • 健康檢查: Consul客戶端可用提供任意數量的健康檢查,指定一個服務(比如:webserver是否返回了200 OK 狀態碼)或者使用本地節點(比如:記憶體使用是否大於90%). 這個資訊可由operator用來監視叢集的健康.被服務發現元件用來避免將流量傳送到不健康的主機.
  • Key/Value儲存: 應用程式可用根據自己的需要使用Consul的層級的Key/Value儲存.比如動態配置,功能標記,協調,領袖選舉等等,簡單的HTTP API讓他更易於使用.
  • 多資料中心: Consul支援開箱即用的多資料中心.這意味著使用者不需要擔心需要建立額外的抽象層讓業務擴充套件到多個區域.

Consul安裝執行:

 Consul支援各種平臺的安裝,可以前往https://www.consul.io/downloads.html下載相關安裝包,也可以使用docker部署,本次採用docker部署方式實現:

 1、拉取consul映象  

docker pull consul

 2、配置並執行Consul伺服器  

docker run \
    -d \
    -p 8500:8500 \
    -p 8600:8600/udp \
    --name=badger \
    consul agent -server -ui -node=server -bootstrap-expect=1 -client=0.0.0.0

 3、開啟地址http://localhost:8500/ui/dc1/services檢視consului介面,基本執行效果如下圖:

  

簡單使用

 新增Consul服務叢集:使用 Docker 搭建 3個 server 節點 + 1 個 client 節點,API 服務通過 client 節點進行服務註冊和發現  

version: "3"

services:
  service_1:
    image: consul
    command: agent -server -client=0.0.0.0 -bootstrap-expect=3 -node=service_1
    volumes:
      - /usr/local/docker/consul/data/service_1:/data
  service_2:
    image: consul
    command: agent -server -client=0.0.0.0 -retry-join=service_1 -node=service_2
    volumes:
      - /usr/local/docker/consul/data/service_2:/data
    depends_on:
      - service_1
  service_3:
    image: consul
    command: agent -server -client=0.0.0.0 -retry-join=service_1 -node=service_3
    volumes:
      - /usr/local/docker/consul/data/service_3:/data
    depends_on:
      - service_1
  client_1:
    image: consul
    command: agent -client=0.0.0.0 -retry-join=service_1 -ui -node=client_1
    ports:
      - 8500:8500
    volumes:
      - /usr/local/docker/consul/data/client_1:/data
    depends_on:
      - service_2

 新增:docker-compose.yaml檔案,執行docker-compose up命令

 本次繼續使用 IdentityServer.Demo 中,cz.Api.Goods、cz.Api.Order兩個專案進行改造,實現服務註冊和服務發現效果,首先調整兩個介面方法返回結果:

cz.Api.Goods專案:
public IActionResult Get()
{
    var result = new
    {
        Message = $"Name:{nameof(cz.Api.Goods)},Time:{DateTime.Now}",
        LocalIp = Request.HttpContext.Connection.LocalIpAddress.ToString(),
    };
    return Ok(result);
}

cz.Api.Order專案:
[HttpGet]
public IActionResult Get()
{
    var result = new
    {
        Message = $"Name:{nameof(cz.Api.Order)},Time:{DateTime.Now}",
        IP = Request.HttpContext.Connection.LocalIpAddress.ToString(),
    };
    return Ok(result);
}

  

  • 服務註冊:

    1、新增Consul配置內容:

 "Consul": {
    "Address": "http://host.docker.internal:8500",
    "HealthCheck": "/healthcheck",
    "Name": "cz.Api.Goods",
    "Ip": "host.docker.internal"
  }

     因為會在docker中執行:使用host.docker.internal代替localhost

    2、註冊Consul元件:

     A:在兩個專案中新增Consul包:使用命令:Install-Package Consul、

     B:新增心跳檢查控制器:      

[Route("api/[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
    /// <summary>
    /// 健康檢查
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    public IActionResult api()
    {
        return Ok();
    }
}

 

     C:註冊元件:在專案專案中新增ConsulExtensions方法類:

public static class ConsulExtensions
{
    public static IApplicationBuilder UseConul(this IApplicationBuilder app, IConfiguration configuration, IHostApplicationLifetime lifetime)
    {
        var client = new ConsulClient(options =>
        {
            // Consul客戶端地址
            options.Address = new Uri(configuration["Consul:Address"]);
        });

        var registration = new AgentServiceRegistration
        {
            // 唯一Id
            ID = Guid.NewGuid().ToString(),
            // 服務名
            Name = configuration["Consul:Name"],
            // 服務繫結IP
            Address = configuration["Consul:Ip"],
            // 服務繫結埠
            Port = Convert.ToInt32(configuration["Consul:Port"]),
            Check = new AgentServiceCheck
            {
                // 服務啟動多久後註冊
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                // 健康檢查時間間隔
                Interval = TimeSpan.FromSeconds(10),
                // 健康檢查地址
                HTTP = $"http://{configuration["Consul:Ip"]}:{configuration["Consul:Port"]}{configuration["Consul:HealthCheck"]}",
                // 超時時間
                Timeout = TimeSpan.FromSeconds(5)
            }
        };

        // 註冊服務
        client.Agent.ServiceRegister(registration).Wait();
        // 應用程式終止時,取消服務註冊
        lifetime.ApplicationStopping.Register(() =>
        {
            client.Agent.ServiceDeregister(registration.ID).Wait();
        });

        return app;
    }
}

 

      在Startup檔案中:使用該方法:      

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
{
   ……
   app.UseConul(Configuration, lifetime);
}

 

    D:新增Docker操作,編譯映象;執行映象

      在解決方案所在目錄執行docker命令:      

編譯映象:
docker build -t cz.api.goods:dev -f ./cz.Api.Goods/Dockerfile . docker build -t cz.api.order:dev -f ./cz.Api.Order/Dockerfile .
執行映象

 docker run -d -p 5050:80 --name cz.api.goods_1 cz.api.goods:dev
 docker run -d -p 5051:80 --name cz.api.goods_2 cz.api.goods:dev
 docker run -d -p 5052:80 --name cz.api.goods_3 cz.api.goods:dev

 docker run -d -p 5060:80 --name cz.api.order_1 cz.api.order:dev
 docker run -d -p 5061:80 --name cz.api.order_2 cz.api.order:dev
 docker run -d -p 5062:80 --name cz.api.order_3 cz.api.order:dev

 

        

    E:進入Consul的UI介面檢視服務註冊情況,註冊成功

    

    

 

     

後續:

  後續將進一步對Consul進行學習驗證,以及對原理進一步瞭解。

參考:

官方文件:

https://www.consul.io/docs

https://www.consul.io/docs/guides/containers-guide 

原始碼github: https://github.com/cwsheng/Consul.Demo.git

 

相關文章