您现在的位置是:主页 > news > vs2005做的网站转换为2012/淄博新闻头条最新消息

vs2005做的网站转换为2012/淄博新闻头条最新消息

admin2025/5/1 5:02:54news

简介vs2005做的网站转换为2012,淄博新闻头条最新消息,北京 公司网站制作,特克斯与凯科斯群岛域名官方网站实现流程:服务启动在zookeeper创建临时节点,数据为当前服务的基本信息,如:ip,端口,服务名称等信息。临时节点在服务端口后会自动删除。注册观察事件,观察指定节点下的子节点的变化,发…

vs2005做的网站转换为2012,淄博新闻头条最新消息,北京 公司网站制作,特克斯与凯科斯群岛域名官方网站实现流程:服务启动在zookeeper创建临时节点,数据为当前服务的基本信息,如:ip,端口,服务名称等信息。临时节点在服务端口后会自动删除。注册观察事件,观察指定节点下的子节点的变化,发…

实现流程:

  1. 服务启动在zookeeper创建临时节点,数据为当前服务的基本信息,如:ip,端口,服务名称等信息。临时节点在服务端口后会自动删除。
  2. 注册观察事件,观察指定节点下的子节点的变化,发生创建节点表示有服务注册,发生删除节点表示有服务下线。
73a32426ad744bdcfb9060767f5852e0.png

接下来简单地实现一个服务的注册与发现功能。

环境:springboot2.2.10.RELEASE + zookeeper3.6.2

zookeeper3.6.0以下的版本在添加观察事件时,每监听到任何一种事件后监听事件会自动删除,需要自己重新在注册,3.6.0以上的版本就不需要了。

  • pom.xml配置文件
1.8org.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-weborg.apache.zookeeperzookeeper3.6.2com.alibabafastjson1.2.12
  • application.yml配置文件
server:  port: 9881---spring:  application:    name: SN---zk:  connectString: localhost:2181,localhost:2182,localhost:2183  timeout: 3000  config:    server: /config/servers #监听的ZNode  client:    ip: 10.100.109.102 #服务注册时自己的ip地址    port: ${server.port} #服务注册时自己的端口号

这里的zk.client.ip,zk.client.port两个其实可以不用完全可以通过程序代码来完成,这里为了简单就通过配置的形式。

  • zookeeper配置
@Configurationpublic class ZKConfig {private static Logger logger = LoggerFactory.getLogger(ZKConfig.class) ;@Value("${zk.connectString}")private String connectString ;@Value("${zk.timeout}")private Integer timeout ;@Beanpublic ZooKeeper zookeeper() {ZooKeeper zookeeper = null; try {CountDownLatch cdl = new CountDownLatch(1);logger.info("zk准备连接: {}", connectString) ;zookeeper = new ZooKeeper(connectString, timeout, event -> {if (event.getState() == Event.KeeperState.SyncConnected) {logger.info("zk服务器连接成功");cdl.countDown() ; }}) ;cdl.await() ;} catch(Exception e) {e.printStackTrace() ; }return zookeeper ;}}  
  • 服务注册节点信息
@Datapublic class ServerNode implements Serializable {private static final long serialVersionUID = 1L;// 地址private String ip;// 端口private Integer port;// 服务名private String serviceName;// 创建时间private LocalDateTime createTime;public ServerNode() {}public ServerNode(String ip, Integer port, String serviceName, LocalDateTime createTime) {super();this.ip = ip;this.port = port;this.serviceName = serviceName;this.createTime = createTime;}}
  • 服务注册接口
public interface ServiceRegistry {public Collection getServers() ;}

这个接口只有一个方法就是提供获取所有服务的方法。

  • 服务注册实现类
@Configurationpublic class ZkServerRegister implements ServiceRegistry, InitializingBean {private static final Logger logger = LoggerFactory.getLogger(ZkServerRegister.class) ;@Resourceprivate ZooKeeper zk;@Value("${zk.config.server}")private String path;@Value("${zk.client.ip}")private String ip;@Value("${zk.client.port}")private Integer port;@Value("${spring.application.name}")private String serviceName;private static Map services = new HashMap<>();@Overridepublic void afterPropertiesSet() throws Exception {if (zk.exists(path, null) == null) {zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}// 添加监听// PERSISTENT是不监听子孙节点,PERSISTENT_RECURSIVE是递归监听子孙节点zk.addWatch(path, new ServerNodeWatcher(zk), AddWatchMode.PERSISTENT_RECURSIVE);// 注册自己this.registerServer();// 获取服务列表this.getServer();}private void getServer() {try {List childs = zk.getChildren(path, false);childs.forEach(node -> {try {byte[] datas = zk.getData(path + "/" + node, false, null);services.put(path + "/" + node,JSONObject.parseObject(new String(datas, "UTF-8"), ServerNode.class));} catch (Exception e) {e.printStackTrace();}});logger.info("当前服务列表:{}", services);} catch (Exception e) {e.printStackTrace();}}private void registerServer() {String data = JSONObject.toJSONString(new ServerNode(ip, port, serviceName, LocalDateTime.now()));try {zk.create(path + "/node_" + System.nanoTime(), data.getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);} catch (Exception e) {e.printStackTrace();}}private static class ServerNodeWatcher implements Watcher {private ZooKeeper zk;public ServerNodeWatcher(ZooKeeper zk) {this.zk = zk;}@Overridepublic void process(WatchedEvent event) {try {String path = event.getPath();switch (event.getType()) {case NodeCreated:logger.info("服务连接:{}", path);byte[] datas = zk.getData(path, false, null);services.put(path, JSONObject.parseObject(new String(datas, "UTF-8"), ServerNode.class));logger.info("当前服务列表:{}", services);break;case NodeDeleted:logger.info("服务断开:{}", path);services.remove(path);logger.info("当前服务列表:{}", services);break;default:break;}} catch (Exception e) {e.printStackTrace();}}}@Overridepublic Collection getServers() {return services.values();}}
  • 测试controller
@RestController@RequestMapping("/test")public class TestController {@Resourceprivate ServiceRegistry sr ;@GetMapping("/get")public Object get() {return sr.getServers() ;}}

分别启动2个服务,端口分别为:9881,9882

访问接口:/test/get

c5d4cabe2051297c3558f1b07823662c.png

当我们停了9882服务,再刷新:

25c0caadebae0ec7e1c7016c4e1b11a7.png

这就是我们实现的一个简单服务注册与发现。

完毕!!!

zookeeper实现分布式缓存

zookeeper实现分布式ID