中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Core微服務之怎么基于Consul實現服務治理

發布時間:2021-11-23 09:20:43 來源:億速云 閱讀:146 作者:小新 欄目:軟件技術

這篇文章主要為大家展示了“.NET Core微服務之怎么基于Consul實現服務治理”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“.NET Core微服務之怎么基于Consul實現服務治理”這篇文章吧。

一、Consul服務注冊之配置文件方式

1.1 重溫Consul實驗集群

.NET Core微服務之怎么基于Consul實現服務治理

  這里我們有三個Consul Server節點,一個Consul Client節點,在Client節點上跑了兩個ClientService實例,分別占用8810和8820端口。至于基于Ocelot的API網關服務,還沒有實現,留到以后跟各位分享。這里假設我們已經啟動了這幾個節點,并且能夠成功訪問這兩個ClientService實例(事先把實例啟動起來,可以通過IIS,也可以通過命令行啟動Kerstel服務器運行)。

  實例1:192.168.80.71:8810

  .NET Core微服務之怎么基于Consul實現服務治理

  實例2:192.168.80.71:8820

  .NET Core微服務之怎么基于Consul實現服務治理

1.2 準備好json配置文件

  這里我準備了一個如下所示的JSON配置文件(eg.取名為services_config.json),配置了兩個服務在里邊:

{
    "services":[
        {
            "id": "EDC_DNC_MSAD_CLIENT_SERVICE_01",
            "name" : "CAS Client Service",
            "tags": [
                "urlprefix-/ClientService01"
            ],
            "address": "192.168.80.71",
            "port": 8810,
            "checks": [
                {
                    "name": "clientservice_check",
                    "http": "http://192.168.80.71:8810/api/health",
                    "interval": "10s",
                    "timeout": "5s"
                }
            ]
        },
      {
            "id": "EDC_DNC_MSAD_CLIENT_SERVICE_02",
            "name" : "CAS Client Service",
            "tags": [
                "urlprefix-/ClientService02"
            ],
            "address": "192.168.80.71",
            "port": 8820,
            "checks": [
                {
                    "name": "clientservice_check",
                    "http": "http://192.168.80.71:8820/api/health",
                    "interval": "10s",
                    "timeout": "5s"
                }
            ]
        }
     ]
}

  至于配置文件的含義,這里不再贅述,和上一篇在代碼中進行注冊的items一致。

  編輯完成后,我們在Consul Client節點中新建一個文件夾,放入json配置文件,然后啟動/重啟Consul Client服務:

192.168.80.71>consul agent -bind 0.0.0.0 -client 192.168.80.71 -config-dir=C:\Server\Consul\config -data-dir=C:\Server\Consul\tempdata -node EDC.DEV.WebServer -join 192.168.80.100 

  .NET Core微服務之怎么基于Consul實現服務治理

  啟動之后,可以看到Consul已經通過掃描配置文件,去注冊了這兩個ClientService的實例。

1.3 通過WebUI查看服務狀況

  .NET Core微服務之怎么基于Consul實現服務治理

  可以看到,兩個ClientService實例已經成功注冊。

1.4 通過API進行服務發現

URL>192.168.80.100:8500/v1/catalog/service/CAS Client Service  

  .NET Core微服務之怎么基于Consul實現服務治理

  可以看到返回了兩個服務實例的信息,當然,這里建議服務名還是不要有空格為好。此外,在服務發現的過程中,會加以一定的負載均衡策略,從這兩個服務實例中選擇一個返回給服務消費端,比如:隨機、輪詢、加權輪詢、基于性能的最小連接數等等。關于這一塊,會在后面的API網關實踐中跟大家分享。

二、Consul集群之Key/Value存儲

  Consul除了可以實現服務注冊和服務發現之外,還提供了強大的KV(Key/Value)存儲。我們可以使用Consul的分層KV存儲干任何事情,比如:動態配置,特征標記,協調,leader選舉等。KV存儲的API是基于http的。

2.1 查看所有KV

  我們可以通過命令行在consul節點中進行查詢:

192.168.80.100>curl -v http://192.168.80.100:8500/v1/kv/?recurse  

  .NET Core微服務之怎么基于Consul實現服務治理

  可以看到,返回的是404 Not Found,可見現在木有一個Key/Value存儲項。

  *.關于?recurse參數=>用來指定查看多個KV

  當然我們也可以通過WebUI來查看和管理KV,如下圖所示,后續我們都以Shell命令行來調用API,不會進行WebUI界面的調用。

  .NET Core微服務之怎么基于Consul實現服務治理

2.2 新增KV

  這里假設我們要配置一個視頻直播平臺的賬號:

192.168.80.100>curl -X PUT -d 'edisonchou' http://192.168.80.100:8500/v1/kv/web/vhallaccount

  key:vhallaccount, value:edisonchou

  添加后可以通過如下命令調用接口查看這個Key的Value

192.168.80.100>curl http://192.168.80.100:8500/v1/kv/web/vhallaccount

  .NET Core微服務之怎么基于Consul實現服務治理

  *.由于Consul的Value是經過Base64編碼的(主要是為了允許非UTF-8的字符),所以這里看到的是編碼后的結果。我們可以通過解碼得到最終的Value值。

2.3 驗證KV是否同步

  由于我們調用的是Leader節點進行的KV存儲,我們想要驗證一下是否在另外兩個節點進行了同步,否則KV只存在一個節點達不到同步的效果。

  192.168.80.101 節點:

  .NET Core微服務之怎么基于Consul實現服務治理

  192.168.80.102 節點:

  .NET Core微服務之怎么基于Consul實現服務治理

  可以看到該key值已經在集群中三個節點進行了同步。

2.4 編輯KV和刪除KV

  編輯KV其實和添加KV完全一致,如下所示:

192.168.80.100>curl -X PUT -d 'andyai' http://192.168.80.100:8500/v1/kv/web/vhallaccount  

  刪除KV主要用到HTTP DELETE

192.168.80.100>curl -X DELETE http://192.168.80.100:8500/v1/kv/web/vhallaccount  

  這里不再演示結果。

三、Consul服務告警之Watch機制

  熔斷保護在Consul和Ocelot中都有實現,意思就是當一個服務不正常時(比如我們的一個服務實例掛了,Consul的健康檢查機制檢測到了),應該給系統維護人員給以告警。在Consul中,服務告警也是通過配置文件來實現的。

3.1 添加watch.json配置文件

.NET Core微服務之怎么基于Consul實現服務治理

{
  "watches": [
    {
      "type": "checks",
      "handler_type": "http",
      "state": "critical",
      "http_handler_config": {
        "path": "http://192.168.80.71:9000/notice",
        "method": "POST",
        "timeout": "10s",
        "header": { "Authorization": [ "token" ] }
      }
    }
  ]
}

.NET Core微服務之怎么基于Consul實現服務治理

  *.有關watch的細節,請參考:https://www.consul.io/docs/agent/watches.html

  這里編輯完成之后,就可以放到config目錄下了,后面重啟Consul Client Agent服務時會加載新的watches_config.json配置文件。

  .NET Core微服務之怎么基于Consul實現服務治理

3.2 添加NoticeService服務

 新寫一個ASP.NET Core WebAPI程序,其主要功能就是接受Consul POST過來的參數并調用方法發送電子郵件。

  (1)Controller編寫

.NET Core微服務之怎么基于Consul實現服務治理

    [Route("api/[controller]")]    public class HomeController : Controller
    {        public IConfiguration Configuration { get; }        public HomeController(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        [HttpPost("/notice")]        public IActionResult Notice()
        {            var bytes = new byte[10240];            var i = Request.Body.ReadAsync(bytes, 0, bytes.Length);            var content = System.Text.Encoding.UTF8.GetString(bytes).Trim('\0');

            EmailSettings settings = new EmailSettings()
            {
                SmtpServer = Configuration["Email:SmtpServer"],
                SmtpPort = Convert.ToInt32(Configuration["Email:SmtpPort"]),
                AuthAccount = Configuration["Email:AuthAccount"],
                AuthPassword = Configuration["Email:AuthPassword"],
                ToWho = Configuration["Email:ToWho"],
                ToAccount = Configuration["Email:ToAccount"],
                FromWho = Configuration["Email:FromWho"],
                FromAccount = Configuration["Email:FromAccount"],
                Subject = Configuration["Email:Subject"]
            };

            EmailHelper.SendHealthEmail(settings, content);            return Ok();
        }
    }

.NET Core微服務之怎么基于Consul實現服務治理

  不再解釋這段代碼。

  (2)SendHealthEmail方法編寫

.NET Core微服務之怎么基于Consul實現服務治理

    public class EmailHelper
    {        public static void SendHealthEmail(EmailSettings settings, string content)
        {            try
            {                dynamic list = JsonConvert.DeserializeObject(content);                if (list != null && list.Count > 0)
                {                    var emailBody = new StringBuilder("健康檢查故障:\r\n");                    foreach (var noticy in list)
                    {
                        emailBody.AppendLine($"--------------------------------------");
                        emailBody.AppendLine($"Node:{noticy.Node}");
                        emailBody.AppendLine($"Service ID:{noticy.ServiceID}");
                        emailBody.AppendLine($"Service Name:{noticy.ServiceName}");
                        emailBody.AppendLine($"Check ID:{noticy.CheckID}");
                        emailBody.AppendLine($"Check Name:{noticy.Name}");
                        emailBody.AppendLine($"Check Status:{noticy.Status}");
                        emailBody.AppendLine($"Check Output:{noticy.Output}");
                        emailBody.AppendLine($"--------------------------------------");
                    }                    var message = new MimeMessage();
                    message.From.Add(new MailboxAddress(settings.FromWho, settings.FromAccount));
                    message.To.Add(new MailboxAddress(settings.ToWho, settings.ToAccount));

                    message.Subject = settings.Subject;
                    message.Body = new TextPart("plain") { Text = emailBody.ToString() };                    using (var client = new SmtpClient())
                    {
                        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                        client.Connect(settings.SmtpServer, settings.SmtpPort, false);
                        client.AuthenticationMechanisms.Remove("XOAUTH2");
                        client.Authenticate(settings.AuthAccount, settings.AuthPassword);
                        client.Send(message);
                        client.Disconnect(true);
                    }
                }
            }            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

.NET Core微服務之怎么基于Consul實現服務治理

  這里使用的是MailKit庫(支持.net core),可以通過NuGet搜索并安裝,此外為何接受的參數屬性是這些,大家可以看看Consul官方文檔中watches頁中的checks類型,見下圖所示:

  .NET Core微服務之怎么基于Consul實現服務治理

  (3)發布NoticeService到192.168.80.71服務器中,同樣也可以加入Consul配置文件中:

.NET Core微服務之怎么基于Consul實現服務治理 View Code

  發布完成之后,重啟Consul Client節點(192.168.80.71)的Consul服務,可以看到NoticeService也注冊成功:

  .NET Core微服務之怎么基于Consul實現服務治理

3.3 測試服務告警

 (1)手動在IIS中關閉一個ClientService服務,例如:這里我關閉了ClientService.01

  .NET Core微服務之怎么基于Consul實現服務治理

 (2)查看自動發送的Email內容:從Email中我們可以知道哪個Server節點的哪個Service出了問題,并且可以大概了解原因(Check Output),這時我們的系統維護人員就該起床加班了。

  .NET Core微服務之怎么基于Consul實現服務治理


以上是“.NET Core微服務之怎么基于Consul實現服務治理”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高平市| 井冈山市| 齐齐哈尔市| 四子王旗| 探索| 阿合奇县| 修文县| 长顺县| 佛山市| 宜阳县| 郸城县| 博兴县| 淳化县| 桑植县| 云龙县| 甘南县| 双柏县| 离岛区| 蛟河市| 湖北省| 石阡县| 杭州市| 南昌市| 信宜市| 宾阳县| 永登县| 繁峙县| 新巴尔虎左旗| 合江县| 富平县| 砚山县| 兴义市| 北海市| 枞阳县| 普洱| 松滋市| 淮南市| 武定县| 蒙阴县| 连山| 明水县|