-
在非雲環境下,為了節省資源,當前只能透過業務混布的方式提高資源利用率,但這種方式可能會導致業務之間互相影響,不能進行有效的隔離,並無法實現資源最大化利用;
-
由於每個業務都要使用獨立一套資源進行隔離,一個業務的上下線至少需要進行 10-15 個步驟來完成;
-
靜態的配置導致多個服務互相依賴時,每次服務 A 變更需要通知依賴服務 B 進行變更,變更維護等一系列的流程變得成本越來越高;
-
混布業務的機器異常會導致上面的 N 個服務受影響,需要人工介入花費大量時間確保服務恢復正常,故障自動恢復程度不高;
-
變更所帶來的資料資訊變動需要額外的機制來保證實時更新,保證產品的穩定性。
-
容器化部署:首先我們將服務透過程式設計化,指定 CPU、MEM、DISK 等等一些列引數配置我們的基礎系統環境,利用映象批次建立 N 個 Docker 容器(微服務化的同時,我們透過程式設計化的方式來解決硬體基礎設定的利用率提升問題)。
-
服務發現:在容器建立時的 IP 隨機分配時,在頻繁的建立銷毀過程中,如何讓各個服務之間實現自動快速的通訊?這裡我結合了 Consul 的域名服務發現功能,能夠在 1 分鐘左右實現從容器銷毀 –> 容器新建 —> 服務恢復可用,整個過程自動完成,保證容器本身和其它容器互相訪問的一個正常通訊。
-
多資料中心
-
服務發現
-
健康檢查
-
Key/Value 儲存
-
執行時編排 (Consul Template)
-
Web UI
-
透過 HTTP 和 DNS 進行服務發現簡化了跨分散式基礎架構部署的連線服務。
-
通訊方式從以往的 ip:port 向域名 :port 的轉變。
-
變更(新增/縮減等)的服務會實時自動更新域名解析地址,即 Consul 內部域名保持實時解析最新的可用服務地址。
-
具有服務健康檢查、心跳檢測、服務域名等等一系列可自定義特性。
#For example:
{{ range tree "service/redis" }}
{{ .Key }}:{{ .Value }}{{ end }}
#renders
minconns 2
maxconns 12
nested/config/value "value"
#For example:
{{ range service "web" }}
server {{ .Name }}{{ .Address }}:{{ .Port }}{{ end }}
#renders the IP addresses of all healthy nodes with a logical service named "web":
server web01 10.5.2.45:2492
server web02 10.2.6.61:2904
-
Consul 讓服務具有較強的可擴充套件性,根據其動態的服務註冊和健康檢測,可以使服務被頻繁替換時,避免服務中斷。
-
Consul 讓配置檔案管理變得更加輕鬆,不用經過 CMDB 和多個變更流程實現,配置內容跟隨業務進行實時自動變化調整。
-
容器新建 or 銷毀等操作頻繁,IP 地址隨機生成分配一個。
-
每個服務有一個 Consul 域名,對應一個容器的 IP 地址,進行服務地址註冊。
-
容器重建後,Consul 的域名對應的 IP 重新註冊,掃清服務地址,Consul DNS域名解析會立即發生更新變化,對外完成變更。
resolvers consuldns
nameserver dns1 127.0.0.1:53
resolve_retries 200
timeout retry 1s
hold valid 10s
#自定義服務監聽相關邏輯
frontend serverA
balance leastconn
cookie JSESSIONID prefix
bind 0.0.0.0:1000 accept-proxy
capture request essay-header Host len 128
option httplog
log-format %si:%sp\ %ci\ %ft\ %hrl\ %r\ %ST\ %B\ %Tt
#自定義ACL(路由)策略
acl host_hostname1 hdr_dom(host) -i a.test.com
acl host_hostname2 hdr_dom(host) -i b.test.com
use_backend hostname1 if host_hostname1
use_backend hostname2 if host_hostname2
#自定義轉發的rs地址,採用consul域名配置,利用自定義resolvers consuldns進行動態解析,從而保證後端服務自動化變更的靈活性。
backend hostname1
server hostname1 a.service.consul:1000 resolvers consuldns maxconn 50000 check inter 2000 rise 2 fall 100
backend hostname2
server hostname2 b.service.consul:1000 resolvers consuldns maxconn 50000 check inter 2000 rise 2 fall 100
.........
#當監控的key狀態發生變化時,觸發執行指定的自定義指令碼。
/usr/local/bin/consul watch -type=key -key=key名 自定義觸發的指令碼路徑。
#當監控的key狀態發生變化時,實時渲染配置檔案,並執行reload。
consul-template -consul-addr 127.0.0.1:8500 -template "ha.conf.ctmpl:ha.conf:HA reload"
#web_service.json
{
"service": {
"name": "web",
"port": 80,
"id": "web",
"address": "10.1.1.1",
"check": {
"id": "web",
"name": "tcp",
"tcp": "10.1.1.1:80",
"interval": "60s",
"timeout": "30s"
}
}
}
#nslookup web.service.consul
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: web.service.consul
Address: 10.1.1.1
Name: web.service.consul
Address: 10.1.1.2
Name: web.service.consul
Address: 10.1.1.3
-
利用雲特性解決不同業務之間的資源隔離問題,並根據服務效能分配 CPU、Mem、disk 等實現硬體基礎資源程式設計化。
-
整套業務拆分,微服務化,每個服務一個 Docker 實體,故障自動漂移恢復,透過服務發現實現自愈,去掉人工介入環節。
-
利用 Consul 解決服務模組的擴充套件性,根據其動態的服務註冊和健康檢測功能,在避免服務中斷的情況下,可以接受服務的頻繁變更。
-
利用 HA 統一我們的入口,容器化後的服務,變更時產生的容器銷毀&建立導致服務地址變更時,HA 和 Consul 是實時監控服務心跳,自動更新 DNS 解析,整套環境高度自動化。
-
服務依賴解耦
-
配置檔案的動態自動化變更
-
產品的自動釋出
-
服務故障自愈
-
不斷簡化的流程和中間層
-
HA 代理的弱化與替代
-
基礎設施雲化,利用率提升
-
去掉了 90% 的人工參與過程
朋友會在“發現-看一看”看到你“在看”的內容