配置中心预研
概述
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制……
在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。
所以,配置中心应运而生。
选型思路
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: v1kind: Namespacemetadata: name: nacos配置mysql服务
# cat mysql_deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: mysql namespace: nacos labels: name: mysqlspec: 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: v1kind: Servicemetadata: name: mysql namespace: nacos labels: name: mysqlspec: ports: - port: 3306 targetPort: 3306 selector: name: mysql配置nacos服务
# cat nacos_statefulset.yaml apiVersion: v1kind: ConfigMapmetadata: name: nacos-cm namespace: nacosdata: 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/v1kind: StatefulSetmetadata: name: nacos namespace: nacosspec: 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: v1kind: Servicemetadata: 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/v1beta1kind: Ingressmetadata: name: nacos namespace: nacosspec: rules: - host: nacos.linux.com http: paths: - backend: serviceName: nacos servicePort: 8848查看nacos 配置中心有关应用状态
# kubectl get pods,svc,ingress -n nacosNAME READY STATUS RESTARTS AGEpod/mysql-5bbd5954cc-g4k9k 1/1 Running 0 70mpod/nacos-0 1/1 Running 0 29mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/mysql ClusterIP 10.43.105.239 <none> 3306/TCP 54mservice/nacos ClusterIP None <none> 8848/TCP 38mNAME HOSTS ADDRESS PORTS AGEingress.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: src="https://img2020.cnblogs.com/blog/1464583/202007/1464583-20200707154642766-1858456558.png" alt="" loading="lazy">然后就...... 随便点点看看熟悉熟悉吧
配置中心预研e票联、 square、 启明星软件、 一个网红蜂箱,如何爆卖全球?、 Facebook社交广告如何蚕食Google搜索广告市场?、 亚马逊运营QA集锦(814-823)、 珠海长隆报团多少钱、 珠海长隆报团多少钱、 珠海长隆报团旅游多少钱、
没有评论:
发表评论