當前位置:網站首頁>[.Net]使用Soa庫+Abp搭建微服務項目框架(五):服務發現和健康監測

[.Net]使用Soa庫+Abp搭建微服務項目框架(五):服務發現和健康監測

2022-05-14 09:48:26林曉lx

上篇文章說過,服務發現和健康監測是面向服務體系架構重要的模塊,Soa庫可以配置使用Consul作為服務發現服務,或者輪詢已配置的服務列錶作為本機服務發現。

將用Hangfire來作為服務發現與健康監測的定時執行庫

具體配置信息請參考Hangfire – Background jobs and workers for .NET and .NET Core

服務發現

配置各個服務的地址列錶,或者在服務啟動時注册的key-value地址集合,輪詢地址服務描述服務(GetRoutesDescAsync),確定服務中方法的路由,方法簽名,使用方式,描述(功能,作者)等內容。

本機服務發現(InServer)

本機服務發現將輪詢Address配置中的地址所對應的RoutesGetters,執行獲取路由信息,並更新SoaServiceRoute中的Address集合

每個微服務都有一個Id 為 "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync"的方法

獲取該服務的地址,服務描述。

在服務模塊初始化中已經將這個服務路由對象添加到RoutesGetters

var service = new SoaServiceRoute
{
    Address = new List<SoaAddress>
    {
        addr
    },
    ServiceDescriptor = new SoaServiceDesc { Id = "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync" }
};

在主服務(Soa.Sample.Web)中的appsettings.json中,配置如下:

    "Discovery": "InServer"

配置服務發現,當前設置的輪詢間隔為每分鐘執行一次

    "InServiceDiscovery": {
      "Enable": true,
      "JobCron": "0 * * * * ? "
    }

各個服務Host的appsettings.json中,只需要配置Discovery即可:

    "Discovery": "InServer",

Consul

可以使用UseConsulForDiscovery方法配置基於consul的服務發現功能

consul是google開源的一個使用go語言開發的服務發現、配置管理中心服務。內置了服務注册與發現框 架、分布一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案

首先去consul官網下載二進制文件

Downloads | Consul by HashiCorp

安裝直接下載zip包,解壓後只有一個可執行的文件consul,將consul添加到系統的環境變量裏面。

打開命令行並輸入consul.exe  agent -dev -bind {你本機的ip地址} 來運行consul服務

在主服務(Soa.Sample.Web)和各個服務Host的appsettings.json中,配置如下:

配置文件中設置Discovery

    "Discovery": "Consul",

設置Consul

    "ConsulServiceDiscovery": {
      "Ip": "127.0.0.1",
      "Port": "8500"
    }

  注意8500為consul所在ip地址

 服務運行時將自動注册ip和服務名稱到consul的kv中,待客戶端調用時,只需要傳入key值即可

當服務運行之後,在瀏覽器地址欄輸入127.0.0.1:8500查看已在consul注册的服務

服務監控

在​ServicesManagerController是獲取服務列錶和服務詳情的Api接口控制器

    [Route("api/[controller]/[action]")]
    public class ServicesManagerController:AbpController
    {
        private readonly IClientServiceDiscovery clientServiceDiscovery;

        public ServicesManagerController(IClientServiceDiscovery clientServiceDiscovery)
        {
            this.clientServiceDiscovery = clientServiceDiscovery;
        }
      
        [HttpGet]
        public async Task<List<SoaAddress>> GetAddresses()
        {
            var addresses = await clientServiceDiscovery.GetAddressAsync();
            return addresses;

        }


        [HttpGet]
        public async Task<List<SoaServiceDesc>> GetServices(string server)
        {
            var routes = await clientServiceDiscovery.GetRoutesAsync();
            if (routes != null && routes.Any() && !string.IsNullOrEmpty(server))
            {
                return (from route in routes
                        where route.Address.Any(x => x.Code == server)
                        select route.ServiceDescriptor).ToList();
            }
            return (from route in routes select route.ServiceDescriptor).ToList();

        }

    }

 運行項目,在swagger中調試請求GetSoaService接口,可以獲取所有服務信息

健康監測

健康監測用於確定各服務的健康程度,比如是否運行緩慢,是否鏈接順暢等。

用一個簡單的監測鏈接是否超時方式,確定這個服務是否健康。

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = timeout })
{
    try
    {
        await socket.ConnectAsync(server.CreateEndPoint());
        server.IsHealth = true;
    }
    catch
    {
        server.IsHealth = false;
    }
}

在主服務(Soa.Sample.Web)和各個服務Host的appsettings.json中,配置如下:

"HealthCheck": {
      "Enable": true,
      "JobCron": "0/5 * * * * ? ",
      "Timeout": 3000
    },

 這裏健康監測服務的輪詢時間是5s,超時時間為3000ms

運行後關閉一個微服務,若關閉Service2,請求/api/ServicesManager/GetAddresses

可以看到IsHealth變為False

項目地址:

MatoApps/Soa (github.com)

版權聲明
本文為[林曉lx]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/134/202205140921553437.html

隨機推薦