配置中心預研
概述
隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、引數的配置、伺服器的地址……
對程式配置的期望值也越來越高:配置修改後實時生效,分環境、分叢集管理配置,程式碼安全、稽核機制……
在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理的需求。
所以,配置中心應運而生。
選型思路
1、詢問幾個道友(多詢問幾個不同的群的道友,防止人云亦云)
2、百度大範圍搜大致的看 選中幾個使用廣、文件多的
3、github對比issues、pull requests、insights、commits、branches、tags
4、語言對比、效能對比(通過CNCF對比)
詢問道友
大致得出的可選元件為:apollo nacos eureka zk consul
百度大範圍搜尋
名詞解釋
CAP理論:CAP理論是分散式架構中重要理論
-
- 一致性(Consistency) (所有節點在同一時間具有相同的資料)
- 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance) (系統中任意資訊的丟失或失敗不會影響系統的繼續運作)
CAP 不可能都取,只能取其中2個
原因是
如果C是第一需求的話,那麼會影響A的效能,因為要資料同步,不然請求結果會有差異,但是資料同步會消耗時間,期間可用性就會降低。
如果A是第一需求,那麼只要有一個服務在,就能正常接受請求,但是對與返回結果變不能保證,原因是,在分散式部署的時候,資料一致的過程不可能想切線路那麼快。
再如果,同時滿足一致性和可用性,那麼分割槽容錯就很難保證了,也就是單點,也是分散式的基本核心,好了,明白這些理論,就可以在相應的場景選取服務註冊與發現了。
服務註冊中心解決方案
設計或者選型一個服務註冊中心,首先要考慮的就是服務註冊與發現機制。縱觀當下各種主流的服務註冊中心解決方案,大致可歸為三類:
應用內:直接整合到應用中,依賴於應用自身完成服務的註冊與發現
應用外:把應用當成黑盒,通過應用外的某種機制將服務註冊到註冊中心,最小化對應用的侵入性
DNS:將服務註冊為DNS的SRV記錄,嚴格來說,是一種特殊的應用外註冊方式
Dubbo
https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin
gitlab對比
nacos
apollo
consul
總結
對比專案 | Nacos | Apollo | Eureka | Zookeeper | Consul |
---|---|---|---|---|---|
一致性 | CP+AP | CP+AP | AP | CP | CP |
github活躍度 | 活躍 | 不活躍 | 快涼 | 不活躍 | 活躍 |
健康檢查 | TCP/HTTP/MYSQL/Client Beat | HTTP | Client Beat | Keep Alive | TCP/HTTP/gRPC/Cmd |
負載均衡策略 | 權重/metadata/Selector | Ribbon | Ribbon | - | Fabio |
雪崩保護 | 有 | 有 | 有 | 無 | 無 |
自動登出例項 | 支援 | 支援 | 支援 | 支援 | 不支援 |
訪問協議 | HTTP/DNS | HTTP | HTTP | TCP | HTTP/DNS |
監聽支援 | 支援 | 支援 | 支援 | 支援 | 支援 |
多資料中心 | 支援 | 支援 | 支援 | 不支援 | 支援 |
跨註冊中心同步 | 支援 | 支援 | 不支援 | 不支援 | 不支援 |
Dubbo整合 | 支援 | 支援 | 不支援 | 支援 | 不支援 |
k8s整合 | 支援 | 較困難 | 不支援 | 不支援 | 支援 |
語言 | JAVA | JAVA | JAVA | JAVA | GO |
圖形介面 | 間接直觀 | 細節繁瑣 | 僅供展示 | 有 | 有 |
通過表格化對比,綜合各方面考慮,推薦的配置中心為:Nacos,理由:1、支援k8s整合 2、操作簡單 3、符合公司需求要求、4、功能支援多
部署
公司內網伺服器做部署測試機
按照省錢省事原則,選擇在單節點上部署mysql pod、nacos pod
按照約定每個應用在我司k8s環境中單屬於一個名稱空間
配置名稱空間
# cat nacos.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nacos
配置mysql服務
# cat mysql_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: nacos
labels:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
name: mysql
template:
metadata:
labels:
name: mysql
spec:
containers:
- name: mysql
image: nacos/nacos-mysql:5.7
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: MYSQL_DATABASE
value: "nacos"
- name: MYSQL_USER
value: "nacos"
- name: MYSQL_PASSWORD
value: "nacos"
volumes:
- name: mysql-data
hostPath:
path: /data/nacos
建立mysql svc 提供nacos 連線
# cat mysql_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: nacos
labels:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
name: mysql
配置nacos服務
# cat nacos_statefulset.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
namespace: nacos
data:
mysql.db.host: "mysql.nacos.svc.cluster.local" # 新增 mysql pod 訪問地址
mysql.db.name: "nacos"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "nacos"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: nacos
spec:
selector:
matchLabels:
app: nacos
serviceName: nacos
replicas: 1
template:
metadata:
labels:
app: nacos
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
containers:
- name: nacos
imagePullPolicy: Always
image: nacos/nacos-server:latest
resources:
requests:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 8848
name: client
env:
- name: NACOS_REPLICAS
value: "1"
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.name
- name: MYSQL_SERVICE_HOST # 新增 mysql 訪問地址的環境變數
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.host
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.user
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.password
- name: NACOS_SERVER_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_SERVERS
value: "nacos-0.nacos.nacos.svc.cluster.local:8848"
建立nacos svc 代理pod
# cat nacos_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: nacos
labels:
app: nacos
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 8848
name: server
targetPort: 8848
clusterIP: None
selector:
app: nacos
建立Ingress暴露服務,供內部訪問
# cat nacos_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nacos
namespace: nacos
spec:
rules:
- host: nacos.linux.com
http:
paths:
- backend:
serviceName: nacos
servicePort: 8848
檢視nacos 配置中心有關應用狀態
# kubectl get pods,svc,ingress -n nacos
NAME READY STATUS RESTARTS AGE
pod/mysql-5bbd5954cc-g4k9k 1/1 Running 0 70m
pod/nacos-0 1/1 Running 0 29m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.43.105.239 <none> 3306/TCP 54m
service/nacos ClusterIP None <none> 8848/TCP 38m
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/nacos nacos.linux.com 10.17.1.44 80 37m
似乎是沒得問題
本地hosts解析
訪問
nacos.linux.com
emmmmmm 404 路徑錯誤, 怎麼搞
檢視日誌
# kubectl logs -f nacos-0 -n nacos
......
Console: http://nacos-0.nacos.nacos.svc.cluster.local:8848/nacos/index.html
......
有了
訪問:nacos.linux.com/nacos
然後就...... 隨便點點看看熟悉熟悉吧