随着程序功能的日益复杂,程序的配置日益增多:各类功能的开关、参数的配置、服务器的地址……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
而后就...... 随便点点看看熟悉熟悉吧