配置中心預研


配置中心預研

概述

隨着程序功能的日益復雜,程序的配置日益增多:各種功能的開關、參數的配置、服務器的地址……

對程序配置的期望值也越來越高:配置修改后實時生效,分環境、分集群管理配置,代碼安全、審核機制……

在這樣的大環境下,傳統的通過配置文件、數據庫等方式已經越來越無法滿足開發人員對配置管理的需求。

所以,配置中心應運而生。

選型思路

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

然后就...... 隨便點點看看熟悉熟悉吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM