为什么要使用配置中心?

    项目中常用的一些配置,例如数据库的配置等,一般都是直接写死在项目中。如若更改,简单暴力的办法就是修改配置文件后再上传。单个或小型分布式项目部署的微服务所需的配置都很少,但集群若有上百台或者更多的机器,一个个地修改可就不那么好办了,因此使用配置中心作统一的配置管理是非常有必要的。

    在SpringCloud项目中,官方推荐使用SpringCloud Config + SpringCloud Bus作为配置中心和消息总线(这一部分在后面会讲),这也是比较规范的做法。但在实际运用的时候,一些简单快速的做法也能达到类似的效果。SpringCloud官方推荐做法的简单示意图如下:


为什么使用ZooKeeper?

    SpringCloud官方推荐使用Eureka作为发现服务,网上也有很多关于ZooKeeper和Eureka谁更适合作为Service Discovery,在此不做过多的评价。ZooKeeper虽有缺点,但Eureka也并不是完全支持所有的项目。总之,适合自己的项目就好。

         关于ZooKeeper,最基本的常用操作命令要知道,以及ZooKeeper的存储结构要了解。为了方便管理,引入ZKUI这一可视化界面来管理ZooKeeper。在上传配置文件的时候,只需通过ZKUI导入即可。


如何使用?

         本项目主要结构如下图所示。使用ZooKeeper作为配置中心,当微服务启动的时候自动从ZooKeeper中拉取配置,本demo演示的是将数据库配置文件存放于ZooKeeper中,当某个微服务启动时,自动拉取所需配置信息。


实现这一过程的主要原理是ZooKeeper提供了一个分层命名空间,允许客户端存储任意数据,如配置数据。而要实现这一功能,pom.xml中必须加入如下信息。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>

        作为示例,本demo使用SpringCloud版本为Edgware.SR2;为方便测试加入swagger2;持久层框架使用MyBatis;数据库选用MySQL 5.7,并使用MySQL自带的测试库world,查的是city这张表。其中POJO、Mapper接口、Mapper文件由MyBatisGenerator自动生成。项目的目录结构如下:


1.需要注意,在Springboot项目中,bootstrap文件的启动优先级高于application文件。bootstrap配置文件如下:

其中:

spring.cloud.zookeeper.connect-string

表示ZooKeeper的连接地址。若有多个,可以表示为ip01:port01,ip02:port02,ip03:port03以此类推。

 spring.cloud.zookeeper.config.root

表示在指定ZooKeeper中,存放属性的根目录

 spring.application.name

定义你的项目的名称,ZooKeeper会在你指定的根目录下寻找以这个项目名命名的目录下的配置

 

2.导入配置文件到Zookeeper

配置文件为txt文本,使用之前提到的ZKUI导入到ZooKeeper中。配置文件具体内容如下:

/config/demo,dev=spring.datasource.url=jdbc:mysql://192.168.0.176:3306/world?characterEncoding=utf8&useSSL=false
/config/demo,dev=spring.datasource.username=root
/config/demo,dev=spring.datasource.password=123456
/config/demo,dev=spring.datasource.driver-class-name=com.mysql.jdbc.Driver
/config/demo,dev=mybatis.mapper-locations=classpath*:/mapper/**Mapper.xml

配置命名规则如下:

/config/{application-name},{profile}={key}={value}

其中{application-name}与{profile}之间用逗号分隔,也可以定义其他分隔符号,在上述bootstrap文件中根据spring.cloud.zookeeper.config.profileSeparator指定

 3.application文件要指定profile,它的值要和ZooKeeper配置中的{profile}一致


4.如何获取配置文件?

主要方式有两种

4.1通过@value注解的方式方式(不能动态更新值,需要重启项目)

@Value("${xxxx}")
public String username ;

4.2通过@ConfigurationProperties和@EnableConfigurationProperties方式

注意:要动态获取值,需要在pom.xml中加入如下依赖,使用也非常简单,可以百度一下。
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

总结:

         要实现上述功能,需要对ZooKeeper的分层命名空间有一定的了解。在此基础上,通过ZKUI能简化其操作。使用ZooKeeper作为配置中心,能快速、简单、方便地对项目常用配置进行管理,在使用上也比较灵活。同时,应注意bootstrap文件和application文件在SpringBoot项目中的启动顺序,bootstrap文件用于应用程序上下文的引导阶段,并且常用于SpringCloud项目中。 当使用Spring Cloud时,通常需要从服务器加载一些配置数据,因而使用bootstrap文件。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐