云原生時(shí)代微服務(wù)的正確姿勢(shì)
今天主要講講云原生時(shí)代,微服務(wù)的正確站姿!在Spring Cloud Kubernetes之實(shí)戰(zhàn)二服務(wù)注冊(cè)與發(fā)現(xiàn) 一文中,講過(guò)spring-cloud 如何結(jié)合 K8s 來(lái)實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)。但如果非 springcloud 框架,或者非 Java 語(yǔ)言呢?那該如何使用 K8s 來(lái)實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)呢?
1. K8s 組件
configMap kube-apiserver scheduler etcd controller kube-proxy

K8s 中主要通過(guò) kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,它是 K8s 集群內(nèi)部的負(fù)載均衡器,也是一個(gè)分布式代理服務(wù)器,在 K8s 的每個(gè)節(jié)點(diǎn)上都有一個(gè),這一設(shè)計(jì)體現(xiàn)了它的伸縮性?xún)?yōu)勢(shì),需要訪(fǎng)問(wèn)服務(wù)的節(jié)點(diǎn)越多,提供負(fù)載均衡能力的 kube-proxy 就越多,高可用節(jié)點(diǎn)也隨之增多。通過(guò) K8s service 的 "ClusterIP" 來(lái)實(shí)現(xiàn)集群內(nèi)服務(wù)的 LB,當(dāng)然,如果集群外需要訪(fǎng)問(wèn) Service 對(duì)應(yīng)的所有具有相同功能的 pod 應(yīng)用程序,則可以通過(guò) K8s service 的另外一種方式來(lái)實(shí)現(xiàn):"NodePort"。
2. 基于 Service 實(shí)現(xiàn)微服務(wù)負(fù)載均衡
在 Java 語(yǔ)言,或其它語(yǔ)言中,通常需要做很多繁重的組件來(lái)實(shí)現(xiàn)服務(wù)的 LB。例如:Dubbo、SpringCloud、甚至 SpringCloudAlibaba 等。當(dāng)然,對(duì)于 Python、Go 等語(yǔ)言,也有其 Restful API,所以也會(huì)集成標(biāo)準(zhǔn)的代理插件來(lái)進(jìn)行做傳統(tǒng)的 LB。但對(duì)于云原生時(shí)代的到來(lái),服務(wù)容器化讓微服務(wù)的訪(fǎng)問(wèn)更好了。K8s Service 提供的 LB,即為無(wú)語(yǔ)言邊際的負(fù)載均衡,不用考慮任何語(yǔ)言的阻礙,只要是通用的 Restful API,即可借助 service 來(lái)進(jìn)行處理集群內(nèi)部微服務(wù)之間的 LB。
在 K8s 集群中,如果內(nèi)部訪(fǎng)問(wèn),可以簡(jiǎn)單的通過(guò) servicename 來(lái)進(jìn)行訪(fǎng)問(wèn)。例如:
apiVersion: v1
kind: Service
metadata:
name: web-server-service
namespace: default
spec:
ports:
- name: web-server
port: 80
targetPort: web-server-port
selector:
app: web-server
通過(guò) selector 將 service 與服務(wù) pod 對(duì)應(yīng)起來(lái),創(chuàng)建一個(gè)微服務(wù)的 service,默認(rèn)其形式是:ClusterIP,則可以通過(guò)如下來(lái)訪(fǎng)問(wèn)該 service 對(duì)應(yīng)的后端 pod:
curl http://$service_name.$namespace.svc.cluster.local:$service_port/api/v1/***
這里,K8s 通過(guò)虛擬出一個(gè)集群 IP,利用 kube-proxy 為 service 提供 cluster 內(nèi)的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,上面說(shuō)了 kube-proxy 的功能。
Name: web-server-service
Namespace: default
Type: ClusterIP
IP: 20.16.249.134
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 20.162.35.223:80
Session Affinity: None
Events: <none>
3. 高可用案例
3.1 傳統(tǒng)微服務(wù)請(qǐng)求案例
傳統(tǒng)的微服務(wù)中,不同語(yǔ)言構(gòu)建的微服務(wù)架構(gòu)很多,一般直接通過(guò) http 協(xié)議進(jìn)行訪(fǎng)問(wèn),在同一種語(yǔ)言中,又會(huì)出現(xiàn)一種集成框架模式來(lái)實(shí)現(xiàn)微服務(wù)架構(gòu)。如:Java 中 Dubbo、Springcloud 等,但其繁瑣的框架結(jié)構(gòu)導(dǎo)致了服務(wù)的繁重。
3.2 跨語(yǔ)言間微服務(wù)的互通
在 k8s 集群內(nèi),通過(guò) kube-proxy 結(jié)合 service 等一些功能組件來(lái)實(shí)現(xiàn)微服務(wù)之間的調(diào)用,不管是同語(yǔ)言也好,跨語(yǔ)言也罷。都會(huì)很好的進(jìn)行處理,包括實(shí)現(xiàn)高可用以及負(fù)載均衡、服務(wù)治理等。
任何一個(gè) k8s 集群中的 pod 都可以通過(guò) http 協(xié)議來(lái)訪(fǎng)問(wèn)其它 pod 的服務(wù):
root@rest-server-ver2-ds-vcfc7:/usr/src/app# curl http://web-server-service.kube-system.svc.cluster.local:80/api/v1/healthz
{
"status": {
"code": 0,
"msg": "success"
},
"data": "success"
}root@rest-server-ver2-ds-vcfc7:/usr/src/app#
其中的權(quán)限有的可以通過(guò) namespace 來(lái)控制,有的可以通過(guò)服務(wù)本身的訪(fǎng)問(wèn)權(quán)限來(lái)控制,但一切都可以進(jìn)行訪(fǎng)問(wèn),不存在語(yǔ)言的差別對(duì)待。
