为什么要使用配置中心

我们在项目中通常使用配置文件配置如数据库连接,超时时间,回调地址等,如果项目里都统一放在properties文件里面,一旦我们要修改配置,那么一台服务器还好,如果有10台机器或者更多,逐一修改显的有点麻烦,当然我们有更好的解决办法,那就是使用配置中心统一配置,各个节点启动时候去配置中心拉去配置,如果要修改,各个节点也可以做到实时更新。
在这里插入图片描述

Zookeeper

ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,ZooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。
分布式应用程序可以基于ZooKeeper实现数据发布与订阅、负载均衡、命名服务、分布式协调与通知、集群管理、配置管理,Leader选举、分布式锁、分布式队列等功能。

ZKUI

Zookeeper的安装就不说了,另外Zookeeper安装之后,推荐安装ZKUI,他是一个Zookeeper的可视化管理平台,可完成CRUD操作。地址:https://github.com/DeemOpen/zkui。
大概分为三步:

  1. 通过git clone https://github.com/DeemOpen/zkui.git将他下载下来.
  2. 之后在根目录执行mvn package打包.
  3. 执行java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar运行
  4. 在浏览器输入http://localhost:9090/
  5. 默认的账号和密码是admin、manager

(启动Zookeeper好在自动zkui。)
在这里插入图片描述

代码实例

首先在zookeeper中创建数据配置,可以使用ZKUI创建,也可以使用命令创建。

create /order
create /order/application
create /order/application/order.notifUrl http://www.xxx.com

在这里插入图片描述
上面的application可不是随便取的,在后面会说。

  1. 加入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>
  1. 配置信息
    不能在application.properties下写配置,要新建bootstrap.properties下写。bootstrap文件的启动优先级高于application文件。
#ip地址和端口
spring.cloud.zookeeper.connect-string =localhost:2181
# root
spring.cloud.zookeeper.config.root = order
@Configuration
@ConfigurationProperties(prefix = "order")
public class ZkConfig {
    private String notifUrl;

    public String getNotifUrl() {
        return notifUrl;
    }

    public void setNotifUrl(String notifUrl) {
        this.notifUrl = notifUrl;
    }
}

测试控制器。

@RestController()
@RequestMapping("zk")
public class ZkTestController {

    @Autowired
    private ZkConfig zkConfig;

    @GetMapping("/getNotifUrl")
    public String getUser(){
        return zkConfig.getNotifUrl();
    }
}

之后可以在浏览器或者Postman中测试,返回的结果正是Zookeeper中的数据。
在这里插入图片描述
修改数据后重新测试,结果也是我们想要的。
在这里插入图片描述
关于上面为什么我们要写application呢?其实这个是项目名,如果没有指定,则默认是application,最终在Zookeeper中找的节点就是/order/application。
在这里插入图片描述
由于我们通过ConfigurationProperties注解指定了前缀。所以系统会找/order/application下order.xxx和我们所写的字段进行匹配。

另外这个值是可以更改的,也就是spring.application.name=order,修改后重新启动,控制台会输出如下日志,这个信息告诉我们,有两个源,如果在/order/order下没有,则去/order/application下找。
在这里插入图片描述
我们创建/order/order节点,并设置数据,看看他会使用哪个数据?,我们原来的数据不动
在这里插入图片描述
运行后测试发现使用/order/order下的数据。如果这个节点不存在,则去/order/application下找。
在这里插入图片描述
另外spring.profiles.active值也会影响,这个可以配合spring.cloud.zookeeper.config.profileSeparator使用。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐