用Zookeeper作为Spring cloud的配置中心
来源:互联网 发布:ionic lab mac百度云 编辑:程序博客网 时间:2024/05/16 10:37
网上对于Spring cloud zookeeper config的资料不是太多,而且工作需要,特此记录一下对这些天的学习成果,如有错误,请大家指正。
Spring Cloud 配置中心的主流实现方式
- Spring cloud config
- Spring cloud zookeeper config
以下是这两者的简介
Srping Cloud Config
Spring cloud config就是和git(svn)集成来实现配置中心。Spring cloud config分服务端、客户端和git(svn)三部分,服务端负责将Git(SVN)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置(但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这需要每个客户端通过POST方法触发各自的/refresh)。其中通过git本身的属性可以达到配置版本控制的目的。有缓存形式,先把config下载到服务端本地再提供给客户端,提高可靠性。
Srping Cloud Zookeeper Config
该项目通过自动配置并绑定到Spring环境,为Spring Boot应用程序提供Zookeeper集成。Zookeeper提供了一个分层命名空间,允许客户端存储任意数据,如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。
两者的比较
Spring Cloud Config 通过文件系统,git/svn仓库来管理配置文件。包含客户端、服务端和git/svn仓库。通过git/svn特性可以达到版本控制
Spring Cloud Zookeeper Config 通过Zookeeper分级命名空间来储存配置项数据,另外Zookeeper可以实时监听节点变化和通知机制。
Zookeeper 初探
Zookeeper简介
Apache ZooKeeper是Apache软件基金会的一个软件项目,他为分布式应用提供高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等。 ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。 ZooKeeper的架构通过冗余服务实现高可用性。
Zookeeper角色
结构图
选举Leader算法
1、 当leader挂了后,其他非observer的机器变更状态为looking,然后开始选举流程
2、每个server都会发出一个投票信息(myid,zxid)
3、接收来自各个服务器的投票
4、处理投票–判断zxid,大的zxid成为leader,如果zxid相同,就判断myid,myid大的做leader
5、统计投票–半数服务器达成一致意见后,投票结束
6、改变自身的状态–leader为leading,其他服务器为following
Zookeeper集群数为单数
以下内容摘自https://www.cnblogs.com/LeeScofiled/p/7390937.html
1、容错
由于在增删改操作中需要半数以上服务器通过,来分析以下情况。
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
6台服务器,至少3台正常运行才行(6的半数为3,半数以上最少为4),正常运行可以允许2台服务器挂掉
通过以上可以发现,3台服务器和4台服务器都最多允许1台服务器挂掉,5台服务器和6台服务器都最多允许2台服务器挂掉
但是明显4台服务器成本高于3台服务器成本,6台服务器成本高于5服务器成本。这是由于半数以上投票通过决定的。
2、防脑裂
一个zookeeper集群中,可以有多个follower、observer服务器,但是必需只能有一个leader服务器。
如果leader服务器挂掉了,剩下的服务器集群会通过半数以上投票选出一个新的leader服务器。
集群互不通讯情况:
一个集群3台服务器,全部运行正常,但是其中1台裂开了,和另外2台无法通讯。3台机器里面2台正常运行过半票可以选出一个leader。
一个集群4台服务器,全部运行正常,但是其中2台裂开了,和另外2台无法通讯。4台机器里面2台正常工作没有过半票以上达到3,无法选出leader正常运行。
一个集群5台服务器,全部运行正常,但是其中2台裂开了,和另外3台无法通讯。5台机器里面3台正常运行过半票可以选出一个leader。
一个集群6台服务器,全部运行正常,但是其中3台裂开了,和另外3台无法通讯。6台机器里面3台正常工作没有过半票以上达到4,无法选出leader正常运行。通可以上分析可以看出,为什么zookeeper集群数量总是单出现,主要原因还是在于第2点,防脑裂,对于第1点,无非是正本控制,但是不影响集群正常运行。但是出现第2种裂的情况,zookeeper集群就无法正常运行了。
Spring Cloud Zookeeper Config
结构图
Spring Cloud Zookeeper Config 主要分为两部分,client端和zookeeper,client端内嵌在spring-cloud-starter-zookeeper-config中,用的是netflix开源的CuratorFramework 来连接zookeeper获取配置数据。在微服务启动时候加载到environment中。
如何使用Spring Cloud Zookeeper Config
1、在客户端(调用方)pom.xml中加入以下依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-config</artifactId> </dependency>
2、在客户端配置文件bootstrap.yml / bootstrap.properties中加入zookeeper连接信息
spring: application: name: testApp cloud: zookeeper: enabled: true # true:开启zookeeper外部化配置, false:读取本地配置; connect-string: IP1:port1,IP2:port2,IP3:port3 config: root: /config/dev enabled: true watcher: enabled: false
属性详解:connect-string:ZooKeeper的地址,如果是集群,逗号分隔节点,格式:ip:port[,ip2:port2,.....]root:指定zookeeper中,属性的根目录spring.application.name: 定义你的项目的名称,zk会在你指定的根目录下寻找以这个项目名命名的目录下的配置watcher.enabled: 默认值是true, 监控配置变更后是否自动更新,需配合Spring Boot Actuators 使用
3、导入配置文件到Zookeeper
3.1、属性命名规则(假设你在上面的root配置项设置为/config/dev):
/config/dev/{application-name},{profile}={key}={value}
服务名和dev (profile名)以逗号隔开,可以设置spring.cloud.zookeeper.config.profile-separator 来用其他符号隔开,譬如”-”等
3.2、配置文件例子:
testApp-dev.txt
/config/dev/testApp,dev=server.port=8080
3.3、使用ZKUI来可视化管理Zookeeper,登录ZKUI->import 选择对应文件导入即可。
ZKUI安装使用请自行百度。
4、客户端获取配置方式
我了解到有三种,可能还有其他的,大家可以自行百度
4.1、通过@Value注解
@Value("${db.url}")String dbUrl;
4.2、配置文件(xml)中直接使用(用${propertyName})
<bean id="globalDbConfig" class="com.demo.connector.GlobalDbConfig"> <property name="globalDbUsername" value="${global.username}"/> <property name="globalDbPassword" value="${global.password}"/></bean>
如何让客户端自动更新zookeeper变更的配置
1、客户端pom.xml添加如下依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>
2、在bootstrap.yml/bootstrap.properties 配置文件中打开watcher
spring.cloud.zookeeper.config.watcher.enabled=true
3、Bean上添加@RefreshScope注解
配置读取简介
配置信息在服务启动时加载到Spring Environment中。配置信息默认存放在/config
命名空间下。
例如,应用名为“testApp”,环境“dev”,则下列配置源会被创建:
- config/testApp,dev
- config/testApp
- config/application,dev
- config/application
最为具体的配置源放在最上面,最泛化的放在最下面。config/application
命名空间下的属性会被用于所有应用。config/testApp
命名空间下的属性只会被“testApp”服务的实例使用,其他服务不能使用。
配置优先级
远程配置(zookeeper等) > 命令行参数配置 > application.yml> bootstrap.yml
- 用Zookeeper作为Spring cloud的配置中心
- Spring Cloud 中使用zookeeper作为服务注册中心与配置中心
- spring cloud 配置中心的部署
- Spring Cloud 构建配置中心
- Spring Cloud 之配置中心
- 配置中心:Spring Cloud Config
- spring cloud 刷新配置中心的配置以及svn操作
- spring cloud config server使用svn来作为外部配置中心
- 使用的Spring Cloud 构建的统一配置中心
- spring cloud config整合gitlab搭建分布式的配置中心
- spring cloud config分布式配置中心的高可用
- spring cloud config整合gitlab搭建分布式的配置中心
- SpringCloud: 高可用的分布式配置中心(Spring Cloud Config)
- Spring Cloud---注册中心Eureka的高可用配置
- spring cloud配置中心常用配置
- Spring-cloud-config用svn做配置中心
- Spring cloud系列二 Spring Cloud 配置中心的基本用法
- Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
- [原创]Python 运行 shell 获取输出结果
- Vue 2.1.7 源码学习
- Redis-单个数据库结构---过期键
- unixODBC的使用
- 正定矩阵、二次型、合同、惯性定理、Hessian
- 用Zookeeper作为Spring cloud的配置中心
- Android MediaPlayer和VideoView的使用
- 快速掌握 Git 用法
- kettle 只做插入操作不做更新
- 程序员逆天改命之叶孤城
- Apache访问日志
- [吴恩达 DL] Class1 Week4 深层神经网络+代码实现
- java实现HTTP的post请求 json格式中文乱码问题
- Java代码操作SVN