配置中心预研
配置中心预研
概述
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制……
在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。
所以,配置中心应运而生。
选型思路
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
然后就...... 随便点点看看熟悉熟悉吧