发布/订阅模式简述。
这是属于一种设计模式,在此不做过多的介绍,只是给出大概的概念。
发布订阅模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。
订阅/发布模式也分为两种,分别是推模式和拉模式。
在推模式中,服务器主动将数据更新发送给所有订阅的客户端。
在拉模式中,由客户端主动发起请求来获取最新数据,客户端可以采用定时轮询的形式。
假如有多个服务器都需要连接同一个数据库,我们可以让这多个数据库读取同一个配置文件,这样如果想要更换数据库的话只需要更改配置文件,然后让服务器使用新的配置信息重新连接就好。
在这种情况下就可以使用发布/订阅模式,让多个服务器共同订阅一个目标,然后当目标将最新的配置文件发布的时候,所有的订阅者都能够收到最新的消息,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
使用ZooKeeper实现。
还是假设有多个服务器需要同时更换数据库,可以使用发布/订阅模式来完成,使用ZooKeeper来实现。最终做到只需要简单的更改一个配置文件,从而让多个服务器都能够拿到最新的信息。
其实这也是利用了ZooKeeper的Watcher监听来完成的,先在ZooKeeper中创建一个节点,然后将数据库的配置信息放在这个节点中,让其它的服务器监听这个节点的数据变化,当该节点的内容发生变化时就重新读取。监听的方法使用Curator提供的缓存策略就可以,三种缓存策略的介绍可以看看本人之前的写的文章Curator的三种缓存。
工程目录:
- DBConfig:这是一个配置信息类,其中有了数据库的url、driver、username、password字段。
- dbconfig.properties:这是一个配置信息文件,存放了数据库的连接信息。
- PublishServer:发布数据用的类,读取本地的dbconfig.properties文件,然后将其内容存放到ZooKeeper中。
- SubscribeServer:订阅数据用来的类,从ZooKeeper中获取数据库的连接信息,如果ZooKeeper中没有的话就从本地文件dbconfig.properties中读取。
- ZKConstants:存放一些连接ZooKeeper的常量。
看两个比较重要的类:PublishServer 和
PublishServer .java
package com.leafage.zk;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Output;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import java.io.*;
import java.util.Properties;
/**
* 使用ZooKeeper发布消息
* @Author Leafage
* @Date 2017/12/10 17:45
**/
public class PublishServer {
private static DBConfig dbConfig;
private static CuratorFramework client;
public static void main(String[] args) {
init();
readConfig();
publishInfo();
}