客戶端服務發現
客戶端服務發現可以以Netflix的Eureka,CoreOS的etcd以及xxx的Consul為代表,提供了單獨的服務發現和註冊中心。客戶端在進行遠程調用時首先通過服務發現和註冊中心獲取到要訪問的目標服務實例信息,在根據客戶端負載均衡策略選擇實例,再發起API的遠程調用。
服務器端服務發現
服務器端服務發現模式主要以DNS為代表,相關的工具包括Consul,以及一些平臺如Kubernetes, Rancher等都提供了基於DNS服務發現註冊能力。服務請求轉發由平臺或者工具提供相關的能力(如Health Check)支持,用於維護DNS代理的後端實例信息。
在服務無狀態的前提下,基於DNS可以簡化在代理過程中的Http請求次數,降低由於網絡或者其他不穩定因數導致的服務遠程調用失敗。
1.創建應用Deployment
構建應用鏡像後通過Deployment文件可以將應用部署到k8s環境中
2.添加服務健康檢測探針
通過設置Pod的liveness和readiness可以提升應用程序的穩定性,並且可以基於k8s的自身調度機制實現服務的自愈。同時在對服務進行滾動升級過程中,也可以避免k8s將請求發送到不健康的服務實例當中
liveness探針用於檢測服務的運行狀態
readiness探針用於服務狀態是否正常
3.創建Service,用於集群內服務的相互訪問
通過以下命令可以快速創建一個servicea的svc資源,在集群內部可以其它容器可以通過service.namespace.svc.cluster.local進行訪問。在同一namespace下的可以直接使用service進行訪問。
1.基於Spring Cloud Zuul創建API Gateway代理應用
2.設置關閉基於Eureka的服務發現
默認情況下Zuul會自動完成基於Eureka的服務發現能力對接,這裡需要關閉相關功能
3.設置Zuul反向代理的Http Header穿透
在某些情況下需要設置哪些Http Header可以通過代理層下發到服務中
4.設置根服務路由
代理根路徑請求(http://gateway:8080/)到特定服務時使用在routes節點下使用root
5.設置其他服務路由
設置其他服務的router代理路徑,如下所示客戶端可以通過訪問api gateway的/servicea將請求代理到servicea(http://gatewat:8080/servicea/api/xxx -> http://servicea:8081/api/xxx)
6.設置基於DNS的路由請求超時時長
對於API Gateway設施合理的超時時間,可以在服務發生異常時,快速失敗。
當使用服務發現時,通過設置ribbon.ReadTimeout和ribbon.SocketTimeout可以配置服務的超時時間。
當使用URL進行路由時,則需要設施zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis來控制超時時間。
簡化代理過程:使用DNS減少服務代理過程中的請求數,提高效率降低風險;
反脆弱性:在Kubernetes下對服務添加liveness和readness探針;
合理設施代理超時時間,避免因為不合理的超時時間導致正常調用失敗,由於服務變慢導致系統變慢;
閱讀更多 睿雲智合Wise2C 的文章