重溫Consul最少化集群的搭建

我們再復習一下上一篇的內容,先建立三台consul server節點,兩個consul client節點,分別在每個節點上跑不同(名稱不同而已)的實例。我們先通過vmware啟動這五個節點,並且能成功訪問這個兩個client節點的實例。(具體配置可以見上一篇)

通過配置文件自動生成服務
{ "services": [ { "id": "CLIENT_SERVICE_01", "name": "CAS Client Service", "tags": [ "urlprefix-/ClientService01" ], "address": "192.168.153.132", "port": 5000, "checks": [ { "name": "clientservice_check01", "http": "http://192.168.53.132:5000/api/health", "interval": "10s", "timeout": "5s" } ] }, { "id": "CLIENT_SERVICE_02", "name": "CAS Client Service", "tags": [ "urlprefix-/ClientService02" ], "address": "192.168.153.132", "port": 5001, "checks": [ { "name": "clientservice_check02", "http": "http://192.168.153.132:5001/api/health", "interval": "10s", "timeout": "5s" } ] } ] }


添加KEY/VALUE
curl -X PUT -d 'edisonchou' http://192.168.80.100:8500/v1/kv/web/vhallaccount
我們通過
http://192.168.153.129:8500/v1/kv/?recurse來查看這個值是否添加到Consul中

再驗證是否已經同步到其他Consul服務端,先看129,注意加粗字體
[root@localhost ~]# ./consul kv get web/vhallaccount stevelee [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens32: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether 00:0c:29:a6:a1:1c brd ff:ff:ff:ff:ff:ff 3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:a6:a1:26 brd ff:ff:ff:ff:ff:ff inet 192.168.153.129/24 brd 192.168.153.255 scope global noprefixroute ens34 valid_lft forever preferred_lft forever inet6 fe80::6d21:aa51:2262:b80f/64 scope link noprefixroute valid_lft forever preferred_lft forever
再看130的Consul服務端
[root@localhost ~]# ./consul kv get web/vhallaccount stevelee [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2c:c2:fc brd ff:ff:ff:ff:ff:ff inet 192.168.153.130/24 brd 192.168.153.255 scope global noprefixroute ens32 valid_lft forever preferred_lft forever inet6 fe80::6114:ed9c:c49d:649b/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2c:c2:06 brd ff:ff:ff:ff:ff:ff inet 192.168.153.170/24 brd 192.168.153.255 scope global noprefixroute dynamic ens34 valid_lft 1216sec preferred_lft 1216sec inet6 fe80::a67c:7966:8767:27fb/64 scope link noprefixroute valid_lft forever preferred_lft forever
我們也可以通過Consul WEB UI來編輯KV值。
Consul服務的Watch機制
熔斷保護在Consul和Ocelot中都有實現,意思就是當一個服務不正常時(比如我們的一個服務實例掛了,Consul的健康檢查機制檢測到了),應該給系統維護人員給以告警。在Consul中,服務告警也是通過配置文件來實現的。
{ "watches": [ { "type": "checks", "handler_type": "http", "state": "critical", "http_handler_config": { "path": "http://192.168.153.132:9000/notice", "method": "POST", "timeout": "10s", "header": { "Authorization": [ "token" ] } } } ] }
我們再新建一個項目,建立一個控制器,用默認的HomController控制器也可以,鍵入如下代碼:
[Produces("application/json")] public class HomeController : Controller { [HttpPost] [Route("/notice")] public IActionResult Notice() { var stream = HttpContext.Request.Body; if (HttpContext.Request.ContentLength != null) { var buffer = new byte[HttpContext.Request.ContentLength.Value]; stream.Read(buffer, 0, buffer.Length); var content = Encoding.UTF8.GetString(buffer); var path = $"{AppDomain.CurrentDomain.BaseDirectory}{DateTime.Now:hh_mm_ss_ffff}.log"; if (!System.IO.File.Exists(path)) { System.IO.File.Create(path).Close(); } using (var sw = new StreamWriter(path)) { sw.Write(content); sw.Flush(); sw.Close(); } return Ok(); } throw new Exception("post is null"); } }
功能很簡單,做一個接受消息的客戶端,POST方法,代碼不解釋。
當我們把5000端口上的服務停掉,會出現什么樣的情況呢?132Consul的客戶端服務器就會出現:5000/api/health無法訪問的問題。
2018/10/17 04:03:10 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused 2018/10/17 04:03:10 [INFO] agent: Synced check "service:CLIENT_SERVICE_01" 2018/10/17 04:03:20 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused 2018/10/17 04:03:30 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused 2018/10/17 04:03:40 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused 2018/10/17 04:03:50 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused 2018/10/17 04:04:00 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
Watch機制會每隔10s向http://192.168.153.132:9000/notice發送一組json格式的消息,內容如下
[{ "Node": "LZZ.DEV.WebServer", "CheckID": "service:CLIENT_SERVICE_01", "Name": "clientservice_check01", "Status": "critical", "Notes": "", "Output": "Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused", "ServiceID": "CLIENT_SERVICE_01", "ServiceName": "CAS Client Service", "ServiceTags": ["urlprefix-/ClientService01"], "Definition": { "HTTP": "", "Header": null, "Method": "", "TLSSkipVerify": false, "TCP": "", "Interval": "0s", "Timeout": "0s", "DeregisterCriticalServiceAfter": "0s" } }]
你也可以將上面的notice方法替換為其他消息通知的方法,比如郵件,比如短信,我更推薦用短信模式,這樣能馬上告訴運維人員,有節點掛了,該去加班了。
綜合之前上一篇的介紹,目前看Consul的Web控制台,已經出現了10個微服務了(不包括系統)!