Dubbo心跳机制
Dubbo心跳机制Dubbo 默认客户端和服务端都会发送心跳报文,用来保持 TCP 长连接状态.
在客户端和服务端,Dubbo 都会开启一个线程 循环扫描 并 检测连接是否超时.
在服务端发现超时则会主动关闭客户端连接.
在客户端发现超时则会主动重新创建连接.
默认心跳检测时间是 60 秒.
原理provider 心跳默认是在 heartbeat(一分钟)内如果没有读消息或写消息,就会发送心跳请求消息,如果连着3次(180s)没有读消息,provider会关闭channel.
consumer 端的心跳默认是在 一分钟 内如果没有读消息或写消息,就会发送心跳请求消息,如果连着3次(三分钟)没有读消息,consumer会进行重连.
开启定时任务provider 在启动 netty时,在 HeaderExchangeServer 的构造方法中,会通过 startHeatbeatTimer() 启动心跳定时任务.consumer 在 HeaderExchangeClient 的构造方法里,同样通过 startHeatbeatTimer() 启动心跳定时任务.
1234567891011121 ...
Zookeeper Watcher机制
watcher流程三个过程:client 注册 Watcherserver 处理 Watcherclient 回调 Watcher
client 注册 Watcherzk client 可以通过 new ZooKeeper(),getData(),getChildren(), exist() 传入 watcher对象 来 注册 Watcher.
比如对于 getData()时注册watcher的操作.实际上 client 就是把 watcher 对象 存到 DataWatchRegistration 里,再创建 Packet,存入 outgoingQueue,等待 SendThread 线程取出来发给 server.
123456789101112131415161718192021222324252627282930313233// 1.创建ZooKeeper对象时注册Watcher- new ZooKeeper()传入Watcher,会回调Watcher.process()方法 - ZooKeeper中会创建ZKWatchManager - watchManager.d ...
Hotspot编译
hotspot8编译参照xiaguang的博客,帮我踩了很多坑,虽然编译过程中还是遇到了一点小问题.
修改 ubuntu18 adp 源1sudo vi /etc/apt/sources.list
最好搜索一下最新的国内源
12345678910deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted univers ...
Zookeeper实现分布式锁
zk实现分布式锁zk实现分布式锁的两种方式如果要自己通过 zookeeper 的原生 api 实现一个分布式独占锁的话,有两种方式:
方式1: 创建临时节点,创建失败的client注册watcher所有需要获取锁的 client 都尝试到 zk 上创建同一个临时节点.创建成功则表示成功获取锁;若创建失败,则对这个节点注册 watcher.
若获得锁的 client 释放锁(自己 delete 掉节点) 或 宕机(zk 会自动移除掉该临时节点),
其他 client 会收到 watcher 通知,再尝试去抢锁.
这种方式的问题: 很明显竞争很大.在节点失效瞬间,如果争锁的 client 较多,会有大量 client 接收 watcher 通知.
方式2: 基于临时顺序节点创建锁1.每个 client 都在 zk 同一个父节点上创建一个 临时顺序节点2.然后每个 client 获取到父节点下的所有节点并排序,判断自己是否是顺序最小的那个节点2.1.如果是,加锁成功2.2.如果不是,加锁失败.注册 watcher,只用监听自己之前的那个节点即可.
释放锁1.client1 删除自己的临时顺序 ...
Dubbo Provider处理请求
服务端接收并响应请求流程provider处理请求流程
123456789101112- NettyServerWorker线程接收请求 - ByteToMessageDecoder.channelRead() - ByteToMessageDecoder.callDecode() - NettyCodecAdapter.InternalDecoder.decode() - DubboCountCodec.decode()解码 - fireChannelRead(ctx, out, size) - NettyServerHandler.channelRead() - AbstractPeer.received() - MultiMessageHandler.received() - HeartbeatHandler.received() ...
Dubbo Cluster
clusterCluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个.
集群模块处于服务提供者和消费者之间,对于服务消费者来说,集群可向其屏蔽服务提供者集群的情况,使其能够专心进行远程调用.
cluster 继承结构
12345678910Cluster(com.alibaba.dubbo.rpc.cluster) MergeableCluster(com.alibaba.dubbo.rpc.cluster.support) FailfastCluster(com.alibaba.dubbo.rpc.cluster.support) MockClusterWrapper(com.alibaba.dubbo.rpc.cluster.support.wrapper) FailsafeCluster(com.alibaba.dubbo.rpc.cluster.support) ForkingCluster(com.alibaba.dubbo.rpc.cluster. ...
synchronized 和 lock 性能比较
synchronized 与 Lock 性能比较JDK1.8123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125D:\soft\Java\jdk1.8.0_172\bin\java.exe "-javaagent:D:\soft\JetBrains\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar=57167:D:\soft\JetBrains\IntelliJ IDEA 2018.1.6\bin" -Dfile.encoding=UTF-8 -classpath ...
Dubbo 服务暴露
Dubbo 与 Spring 的结合代码在 dubbo-config 下的 dubbo-config-spring 模块中
META-INF/dubbo.xsddubbo.xsd 定义了 dubbo 自定义标签
META-INF/spring.schemasspring.schemas 指定了 dubbo.xsd 文件的位置.
1http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
META-INF/spring.handlers关联 DubboNamespaceHandler 命名空间处理器和 dubbo.xsd 中的 targetNamespace,即 http://code.alibabatech.com/schema/dubbo
1http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHand
DubboNamespace ...
Dubbo 服务引用
官网
客户端服务引用客户端服务引用 demo12DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxydemoService.sayHello("world");
dubbo 在客户端动态的生成了一个该 Interface 类型的代理类.在这个代理类中封装了远程服务调用的组件.
DemoService 创建12<dubbo:reference id="demoService" group="g1" check="true" interface="com.alibaba.dubbo.demo.DemoService" client="netty4" timeout="10000" callbacks="1000" regis ...
Tomcat Debug
tomcat debug方式1. tomcat远程debug,这种方式正常用于sit或者灰度环境调试问题使用,当然localhost也能这样debug.在 startup.sh 中配置
1SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=19999
方式2. 在idea中启动tomcat debug,需要添加tomcat的jar依赖.这种方式用于本地看tomcat源码或者定位本地起的项目中tomcat部分的问题时可以使用.
12345678910111213<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>7.0.82</version> ...