博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zookeeper发布订阅之SpringBoot+Mybatis多数据源
阅读量:6041 次
发布时间:2019-06-20

本文共 6103 字,大约阅读时间需要 20 分钟。

   1.前言

   数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者将数据发布到Zookeeper的一个或一系列节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中管理和数据的动态更新。

          发布订阅一般有两种模式,分别是推(Push)和拉(Pull)模式。在推拉模式中,服务端主动将数据更新发送给所有订阅的客户端;而拉模式则是客户端主动发起请求来获取最新数据。Zookeeper采取推和拉相结合的方式:客户端会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。

     “配置管理”的实际案例来展示Zookeeper在"数据发布/订阅"场景下的使用方式。

   2.案例

           将敏感的配置信息存放与Zookeeper中。启动项目时,自动从Zookeeper中获取。

          Maven坐标:

      

1  
2
org.springframework.boot
3
spring-boot-starter-web
4
5
6
org.springframework.boot
7
spring-boot-starter-jdbc
8
9
10
org.projectlombok
11
lombok
12
true
13
14
15
org.apache.zookeeper
16
zookeeper
17
3.4.10
18
19
20
org.apache.curator
21
curator-framework
22
2.9.0
23
24
25
org.apache.curator
26
curator-recipes
27
2.9.0
28
29
30
org.mybatis
31
mybatis
32
3.4.3
33
34
35
org.mybatis
36
mybatis-spring
37
1.3.1
38
39
40
mysql
41
mysql-connector-java
42
43
44
com.zaxxer
45
HikariCP
46
2.7.4
47
48
49
org.springframework.boot
50
spring-boot-starter-test
51
test
52

         自动从Zookeeper中获取”配置信息“,并放入Enviroment中

 

             配置ApplicationContextInitializer,项目在启动先调用该类,进行加载环境变量到Enviroment中去(这里采用在classpath路径下新建META-INF/spring.factories文件方式,其它两种方式为:

    1.使用SpringApplication 对象,调用 addInitializers()

    2.在配置文件中配置 context.initializer.classes =xx)

               spring.factories文件

     

1 # Initializers2 org.springframework.context.ApplicationContextInitializer=\3 com.example.zkconfig.config.GlobalConfigInit

     

GlobalConfigIn类进行一系列配置文件加载及Zk连接,我用的Curator框架 我的application.properties此刻内容
server.port=8076#zk 配置信息com.unconfig.info=/config/zk-config

 application-dev 则对应具体连接机器

#zkcom.zookeeper.url=zk://192.168.159.129:2181

 从zk取配置信息放入spring环境

1 @Slf4j 2 public class GlobalConfigInit implements ApplicationContextInitializer
{ 3 4 @Override 5 public void initialize(ConfigurableApplicationContext configurableApplicationContext) { 6 ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment(); 7 String zkUri = environment.getProperty("com.zookeeper.url"); 8 if (null == zkUri) { 9 log.warn("could not find zk uri,unconf not configured..");10 } else {11 ZookeeperUtils zookeeperUtils = new ZookeeperUtils();12 zookeeperUtils.setZkUri(zkUri);13 String unconf = environment.getProperty("com.unconfig.info");14 if (null != unconf) {15 log.info("config uniconf .. {}", unconf);16 ZkPropertySource propertySource = new ZkPropertySource("default", zookeeperUtils.getEnv(unconf));17 environment.getPropertySources().addLast(propertySource);18 } else {19 log.warn("unconf not configured..");20 }21 }22 }23 24 public String getEnv(Environment environment) {25 String zkUrl = environment.getProperty("com.zookeeper.url");26 if (null != zkUrl && !zkUrl.isEmpty()) {27 return zkUrl;28 } else {29 String unConfig = environment.getProperty("com.unconfig.info");30 if (unConfig != null && !unConfig.isEmpty()) {31 ZookeeperURI parse = ZookeeperURI.parse(unConfig);32 String inferZkUrl = "zk://" + parse.getServers();33 System.setProperty("com.zookeeper.url", inferZkUrl);34 log.info("inferred zk uri from unconf zk {}", inferZkUrl);35 return inferZkUrl;36 } else {37 return null;38 }39 }40 }41 }

     这里不再多说,接下来配置数据源。

  

1 @Configuration 2 @MapperScan(basePackages = {"com.example.zkconfig.dao.write"}, sqlSessionFactoryRef = "writeSqlSessionFactory") 3 public class WriteDataSourceConfig { 4  5     @Value("${write.datasource.mappers}") 6     private String location; 7  8     @Bean(name = "writeDataSource") 9     @ConfigurationProperties(prefix = "write.datasource")10     public DataSource dataSource() {11         return DataSourceBuilder.create().type(HikariDataSource.class).build();12     }13 14     @Bean(name = "writeSqlSessionFactory")15     public SqlSessionFactory writeSqlSessionFactory(@Qualifier("writeDataSource") DataSource dataSource) throws Exception {16         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();17         sqlSessionFactoryBean.setDataSource(dataSource);18         sqlSessionFactoryBean.setMapperLocations(19                 new PathMatchingResourcePatternResolver().getResources(location));20         return sqlSessionFactoryBean.getObject();21     }22 23     @Bean(name = "writeTransactionManager")24     public DataSourceTransactionManager writeTransactionManager(@Qualifier("writeDataSource") DataSource dataSource) {25         return new DataSourceTransactionManager(dataSource);26     }27 }

      而我实际在zookeeper节点配置的数据

  

    

 

 

 

测试走一波,启动成功。

转载于:https://www.cnblogs.com/coding400/p/9333558.html

你可能感兴趣的文章
【转载】 [你必须知道的.NET]目录导航
查看>>
数据存储小例
查看>>
Spring Boot 配置优先级顺序
查看>>
php 信号量
查看>>
C++中构造函数详解
查看>>
数据库课程实习设计——酒店房间预订管理系统
查看>>
vue.js的模板渲染
查看>>
关于H5+css3的一些简单知识
查看>>
Google-Authenticator
查看>>
FOJ有奖月赛-2015年11月 Problem A
查看>>
电商网站中添加商品到购物车功能模块2017.12.8
查看>>
android 模拟器 hardWare 属性说明
查看>>
六款值得推荐的android(安卓)开源框架简介
查看>>
max_element( )
查看>>
CSS Grid 布局
查看>>
接口的幂等性
查看>>
java中的类
查看>>
android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度
查看>>
SpringMVC完成文件上传的基本步骤
查看>>
实例168 使用指针输出数组元素
查看>>