首页 > 其他分享 >中间件 ZK分布式专题与Dubbo微服务入门 6-2 zk会话重连机制

中间件 ZK分布式专题与Dubbo微服务入门 6-2 zk会话重连机制

时间:2024-03-30 09:26:44浏览次数:20  
标签:Dubbo zk demo ZK 中间件 ZKConnectSessionWatcher main com imooc

0    课程地址

https://coding.imooc.com/lesson/201.html#mid=12718

 

1    重点关注

1.1    本节内容

验证了使用sessionid和sessionPassword重连的session和之前的session一致,详见3.1

 

 

 

2    课程内容

2.1    扩展之:echo dump|nc localhost 2181

 使用nc(NetCat)工具连接本地2181端口,
  • echo 打印输出
  • dump 列出所有会话和临时节点
  • nc - Linux nc命令用于设置路由器。语法为nc IP地址 端口号。
  • IP地址 - 即ZooKeeper所在的服务器IP地址
  • 端口 - 即ZooKeeper的端口号。
  • | 管道符  后边作为参数,在前边输出

更多zk命令参考:

https://blog.csdn.net/succing/article/details/121793494

 

 

2.2    扩展之:nc

  • 原因:源于使用nc命令时报错:

Ncat: Connection refused

 

  • 解决方案:
直接在命令行里输入:
nc
如果显示:
Ncat: You must specify a host to connect to. QUITTING.
恭喜你,与博主的问题一致,下面是解决方案与问题解析


解决方法
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz --no-check-certificate
tar -zxf netcat-0.7.1.tar.gz
cd netcat-0.7.1/
./configure
sudo make
sudo make install

然后写入环境:
sudo vim /etc/profile

在最后写入:
export NETCAT_HOME=/usr/local/netcat
export PATH=$PATH:$NETCAT_HOME/bin

最后使配置生效:
source /etc/profile


然后输入nc就可以得到:
Cmd line:

这样nc命令就成功了

 

  • 注意:环境变量部分

如果你的配置文件里已经有环境变量了,只需要把Path追加进去就好,比如我的profile

export PATH=$PATH:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$NETCAT_HOME/bin
export NETCAT_HOME=/usr/local/netcat

 

  • 报错分析原理:(这个我没用,使用解决方案已经解决了我的问题)

nc与netcat通常是一个东西,而ncat(也称nmap-ncat)是另一个东西,默认的nc命令链接到了ncat,所以自然得不到我们想要的结果
首先尝试输入:
netcat
没有这个命令,然后通过命令:
whereis nc
可以看到连接的是:nc: /usr/bin/nc /usr/share/man/man1/nc.1.gz,并不是netcat,所以遇到这种情况大概率是没有安装过netcat,安装一下就行,同时编译安装后会自动踢掉这个软连接,安装完成后输入nc就可以得到:
Cmd line:

  • ncat简介:

netcat称为网络工具中的瑞士军刀,体积小巧,但功能强大,为了方便常用nc作为其简称。 它可以在两台设备上面相互交互,主要就是侦听模式和传输模式。大致功能如下:

    Telnet功能(本案例使用)
    获取banner信息
    传输文本信息
    传输文件/目录
    加密传输文件,默认不加密
    远程控制
    加密所有流量
    流媒体服务器
    远程克隆硬盘

参考:

https://blog.csdn.net/qq_63844103/article/details/127681824

https://blog.csdn.net/weixin_35757704/article/details/121456089

 

2.3    扩展之 wget安装:

  • 原因:使用2.2命令wget连接时报错

 wget: 未找到命令

 

  • 解决方案:
-bash: wget: 未找到命令,原因为linux系统缺少命令环境。

centos 系统下,执行以下命令进行安装

yum install wget -y

ubuntu系统,需要执行以下命令

apt-get install -y wget

 

参考:

https://blog.csdn.net/luobotoutou123/article/details/130609494

 

3    Coding

3.1    验证使用sessionid和sessionPassword重连的session和之前的session一致

  • 启动zk服务端
    进入到
cd /usr/local/zookeeper/bin


    重启zookeeper服务端
./zkServer.sh restart

 

  • 验证类:
package com.imooc.zk.demo;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @Title: ZKConnectDemo.java
 * @Description: zookeeper 恢复之前的会话连接demo演示
 */
public class ZKConnectSessionWatcher implements Watcher {
    
    final static Logger log = LoggerFactory.getLogger(ZKConnectSessionWatcher.class);

    public static final String zkServerPath = "172.26.139.4:2181";
    public static final Integer timeout = 5000;
    
    public static void main(String[] args) throws Exception {
        
        //1        第1次获取连接
        ZooKeeper zk = new ZooKeeper(zkServerPath, timeout, new ZKConnectSessionWatcher());
        
        long sessionId = zk.getSessionId();
        
        //1.1        因为sessionid是long类型的,要和服务端的sessionid进行对比,故转化成16进制的方便对比
        String ssid = "0x" + Long.toHexString(sessionId);
        System.out.println(ssid);
        
        
        byte[] sessionPassword = zk.getSessionPasswd();
        
        log.warn("客户端开始连接zookeeper服务器...");
        log.warn("连接状态:{}", zk.getState());
        new Thread().sleep(1000);
        log.warn("连接状态:{}", zk.getState());
        
        new Thread().sleep(200);
        
        // 开始会话重连
        log.warn("开始会话重连...");
        
        
        //2        第2次获取连接
        ZooKeeper zkSession = new ZooKeeper(zkServerPath, 
                                            timeout, 
                                            new ZKConnectSessionWatcher(), 
                                            sessionId, 
                                            sessionPassword);
        log.warn("重新连接状态zkSession:{}", zkSession.getState());
        new Thread().sleep(1000);
        log.warn("重新连接状态zkSession:{}", zkSession.getState());
    }
    
    @Override
    public void process(WatchedEvent event) {
        log.warn("接受到watch通知:{}", event);
    }
}

 

  • debug分别在第1次连接和第2次连接时断点,查看zk服务端的sessionId

 可以和下边的日志(标红部分)对比,sessionid一致

 

  • STS日志
2024-03-30 07:46:50,950 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
0x10016d7df880002
2024-03-30 07:47:18,645 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:30)] - [WARN] 客户端开始连接zookeeper服务器...
2024-03-30 07:47:19,240 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:31)] - [WARN] 连接状态:CONNECTED
2024-03-30 07:47:21,256 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:33)] - [WARN] 连接状态:CONNECTED
2024-03-30 07:47:22,901 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:38)] - [WARN] 开始会话重连...
2024-03-30 07:47:33,453 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:33,564 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:35,007 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:35,115 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:36,567 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:36,677 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:37,788 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:37,898 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:38,928 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:39,036 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:40,164 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:40,265 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:41,781 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null
2024-03-30 07:47:41,896 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null
2024-03-30 07:47:42,406 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:45)] - [WARN] 重新连接状态zkSession:CONNECTED
2024-03-30 07:47:43,415 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:47)] - [WARN] 重新连接状态zkSession:CONNECTED

 

  • log4j.properties
log4j.rootLogger=WARN,console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.encoding=UTF-8
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%l] - [%p] %m%n

 

标签:Dubbo,zk,demo,ZK,中间件,ZKConnectSessionWatcher,main,com,imooc
From: https://www.cnblogs.com/1446358788-qq/p/18104995

相关文章

  • 客快物流大数据项目(六十八):工作流调度 azkaban介绍及用法 一般有用 图片偏多 看1
    工作流调度一、工作流产生背景工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动传递文档、信息......
  • 中间件 ZK分布式专题与Dubbo微服务入门 6-1 建立客户端与zk服务端的连接
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12717 1重点关注1.1本节内容使用STS开发工具作为客户端连接zk服务端,详见3.1  1.2连接方式参数说明如下段zk原生class标注:connectString:连接zk服务端的ip和端口(比如案例......
  • SpringCloud 和 Dubbo 区别: 比较微服务框架的差异
    1.1SpringCloud简介SpringCloud是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud基于 SpringBoot 开发,具有如下特点:提供了丰富的组件,如配置管理、服务注册与发现、断路器等采用声明式的编程模型,易于上手与Spr......
  • 中间件和Auth模块
    中间件1.Django中间件介绍【1】什么是Django中间件Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。中间件是按照顺序依次执行的,每......
  • dubbo3.2注册中心注册逻辑
    一介绍Dubbo支持多种服务调用方法,包括远程过程调用、负载均衡和容错等,并且提供可视化的服务管理和监控功能。Dubbo的核心组件之一就是注册中心。在Dubbo的体系架构中,服务提供者在启动时向注册中心注册其提供的服务,并且服务消费者在启动时向注册中心订阅其需要的服务。而......
  • SpringCloud微服务集成Dubbo
    1、Dubbo介绍ApacheDubbo是一款易用、高性能的WEB和RPC框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生......
  • vivo 消息中间件测试环境项目多版本实践
    作者:vivo互联网中间件团队-LiuTao在开源RocketMQ基础之上,关于【测试环境项目多版本隔离】业务诉求的落地与实践。一、背景在2022年8月份vivo互联网中间件团队完成了互联网在线业务的MQ引擎升级,从RabbitMQ到RocketMQ的平滑升级替换。在业务使用消息中间件的过程中......
  • CYarp:力压frp的C#高性能http内网反代中间件
    https://www.cnblogs.com/kewei/p/18095638 我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。......
  • Dubbo23_解决Dubbo无法发布被事务代理的Service问题7
    一、问题展示前面我们已经完成了Dubbo的入门案例,通过入门案例我们可以看到通过Dubbo提供的标签配置就可以进行包扫描,扫描到@Service注解的类就可以被发布为服务。但是我们如果在服务提供者类上加入@Transactional事务控制注解后,服务就发布不成功了。原因是事务控制的底层原......
  • CYarp:力压frp的C#高性能http内网反代中间件
    我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。开源仓库地址:https://github.com/xljiulang/CY......