隨着程序功能的日益複雜,程序的配置日益增多:各類功能的開關、參數的配置、服務器的地址……html
對程序配置的指望值也愈來愈高:配置修改後實時生效,分環境、分集羣管理配置,代碼安全、審覈機制……mysql
在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求。linux
因此,配置中心應運而生。git
一、詢問幾個道友(多詢問幾個不一樣的羣的道友,防止人云亦云)github
二、百度大範圍搜大體的看 選中幾個使用廣、文檔多的sql
三、github對比issues、pull requests、insights、commits、branches、tags數據庫
四、語言對比、性能對比(經過CNCF對比)api
大體得出的可選組件爲:apollo nacos eureka zk consul
安全
CAP理論:CAP理論是分佈式架構中重要理論服務器
CAP 不可能都取,只能取其中2個
緣由是
若是C是第一需求的話,那麼會影響A的性能,由於要數據同步,否則請求結果會有差別,可是數據同步會消耗時間,期間可用性就會下降。
若是A是第一需求,那麼只要有一個服務在,就能正常接受請求,可是對與返回結果變不能保證,緣由是,在分佈式部署的時候,數據一致的過程不可能想切線路那麼快。
再若是,同時知足一致性和可用性,那麼分區容錯就很難保證了,也就是單點,也是分佈式的基本核心,好了,明白這些理論,就能夠在相應的場景選取服務註冊與發現了。
設計或者選型一個服務註冊中心,首先要考慮的就是服務註冊與發現機制。縱觀當下各類主流的服務註冊中心解決方案,大體可歸爲三類:
應用內:直接集成到應用中,依賴於應用自身完成服務的註冊與發現
應用外:把應用當成黑盒,經過應用外的某種機制將服務註冊到註冊中心,最小化對應用的侵入性
DNS:將服務註冊爲DNS的SRV記錄,嚴格來講,是一種特殊的應用外註冊方式
https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin
對比項目 | 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,理由:一、支持k8s集成 二、操做簡單 三、符合公司需求要求、四、功能支持多
公司內網服務器作部署測試機
按照省錢省事原則,選擇在單節點上部署mysql pod、nacos pod
按照約定每一個應用在我司k8s環境中單屬於一個名稱空間
# cat nacos.yaml apiVersion: v1 kind: Namespace metadata: name: nacos
# 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
# 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
# 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"
# 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
# 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
# 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
彷佛是沒得問題
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
而後就...... 隨便點點看看熟悉熟悉吧