• 配置中心预研


    配置中心预研

    概述

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

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

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

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

    选型思路

    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

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

  • 相关阅读:
    isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(''))
    isPrimitive:检测数据是不是原始数据
    FastDFS集群部署
    大数据系列之分布式大数据查询引擎Presto
    大数据系列之数据仓库Hive原理
    大数据系列之数据仓库Hive中分区Partition如何使用
    关于Java中final关键字的详细介绍
    关于分布式存储系统中-CAP原则(CAP定理)与BASE理论比较
    过拟合及其对策
    深入理解L1、L2正则化
  • 原文地址:https://www.cnblogs.com/zisefeizhu/p/13261243.html
Copyright © 2020-2023  润新知