天天看点

配置中心预研

配置中心预研

概述

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……

对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制……

在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。

所以,配置中心应运而生。

选型思路

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 AP CP
github活跃度 活跃 不活跃 快凉
健康检查 TCP/HTTP/MYSQL/Client Beat HTTP Client Beat Keep Alive TCP/HTTP/gRPC/Cmd
负载均衡策略 权重/metadata/Selector Ribbon - Fabio
雪崩保护
自动注销实例 支持 不支持
访问协议 HTTP/DNS TCP
监听支持
多数据中心
跨注册中心同步
Dubbo集成
k8s集成 较困难
语言 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

配置中心预研

然后就...... 随便点点看看熟悉熟悉吧

过手如登山,一步一重天