1、引入 jar 包

<dependencies><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.2.0</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId></dependency>
</dependencies>

2、新建工具类 ZookeeperClients

public class ZookeeperClients {private final CuratorFramework client;private static ZookeeperClients INSTANCE;static {RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);CuratorFramework client = CuratorFrameworkFactory.newClient("101.132.167.18:2181",retryPolicy);INSTANCE = new ZookeeperClients(client);}private ZookeeperClients(CuratorFramework client){this.client = client;}public static CuratorFramework client(){return INSTANCE.client;}
}

3、新建 ReadyRestartInstances

public class ReadyRestartInstances implements PathChildrenCacheListener {private static final Logger LOGGER = LoggerFactory.getLogger(ReadyRestartInstances.class);private static final String LISTEN_PATHS = "/lagou/dubbo/restart/instances";private final CuratorFramework zkClient;// 当节点变化时,给这个集合赋值,重启机器的信息列表private volatile Set<String> restartInstance = new HashSet<>();private ReadyRestartInstances(CuratorFramework zkClient){this.zkClient = zkClient;}public static ReadyRestartInstances create(){final CuratorFramework zookeeperClient = ZookeeperClients.client();try{// 检查监听路径是否存在final Stat stat = zookeeperClient.checkExists().forPath(LISTEN_PATHS);// 如果监听路径不存在,则创建if(stat == null){zookeeperClient.create().creatingParentsIfNeeded().forPath(LISTEN_PATHS);}}catch (Exception e){e.printStackTrace();LOGGER.error("确保基础路径存在");}final ReadyRestartInstances instances = new ReadyRestartInstances(zookeeperClient);// 创建一个 NodeCachePathChildrenCache nodeCache = new PathChildrenCache(zookeeperClient,LISTEN_PATHS,false);// 给节点缓存对象加入监听nodeCache.getListenable().addListener(instances);try{nodeCache.start();}catch (Exception e){e.printStackTrace();LOGGER.error("启动监听失败");}return instances;}/** 返回应用名 和 主机拼接后的字符串 **/private String buildApplicationAndInstanceString(String applicationName,String host){return applicationName + "_" + host;}/** 增加重启实例的配置信息方法 **/public void addRestartingInstance(String applicationName,String host) throws Exception{zkClient.create().creatingParentsIfNeeded().forPath(LISTEN_PATHS + "/" + buildApplicationAndInstanceString(applicationName,host));}/** 删除重启实例的配置信息方法 **/public void deleteRestartingInstance(String applicationName,String host) throws Exception{zkClient.delete().forPath(LISTEN_PATHS + "/" + buildApplicationAndInstanceString(applicationName,host));}/** 判断节点信息是否存在于 restartInstances **/public boolean hasRestartingInstance(String applicationName,String host){return restartInstance.contains(buildApplicationAndInstanceString(applicationName,host));}@Overridepublic void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {// 查询出监听路径下所有的目录配置信息final List<String> restartingInstances = zkClient.getChildren().forPath(LISTEN_PATHS);// 给 restartInstances;if(CollectionUtils.isEmpty(restartingInstances)){this.restartInstance = Collections.emptySet();}else{this.restartInstance = new HashSet<>(restartingInstances);}}
}

4、新建 RestartingInstanceRouter

public class RestartingInstanceRouter implements Router {private final ReadyRestartInstances instances;private final URL url;public RestartingInstanceRouter(URL url){this.url = url;this.instances = ReadyRestartInstances.create();}@Overridepublic URL getUrl() {return url;}@Overridepublic <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {// 如果没有在重启列表中,才会加入到后续调用列表return invokers.stream().filter(i->!instances.hasRestartingInstance(i.getUrl().getParameter("remote.application"),i.getUrl().getIp())).collect(Collectors.toList());}@Overridepublic boolean isRuntime() {return false;}@Overridepublic boolean isForce() {return false;}@Overridepublic int getPriority() {return 0;}
}

5、新建 RestartingInstanecRouterFactory

@Activate
public class RestartingInstanecRouterFactory implements RouterFactory {@Overridepublic Router getRouter(URL url) {return new RestartingInstanceRouter(url);}
}

6、配置文件:

包名:META-INF/dubbo

文件名:org.apache.dubbo.rpc.cluster.RouterFactory

restartInstances=com.deppon.util.RestartingInstanecRouterFactory

7、启动类:ServerRestartMain

public class ServerRestartMain {public static void main(String[] args) throws Exception {// ReadyRestartInstances.create().addRestartingInstance("server-provider","xxx.xx.xx.xx");ReadyRestartInstances.create().removeRestartingInstance("server-provider","xxx.xx.xx.xx");}
}

dubbo-router相关推荐

  1. dubbo 路由配置_Dubbo-go v1.5.1发布,Dubbo 的 Go实现

    Dubbo-go 团队近期发布了 Dubbo-go v1.5.1,Dubbo-go 是 Apache Dubbo 项目的 Go 实现. 根据团队的介绍,虽然 v1.5.1 是 v1.5 的一个子版本, ...

  2. dubbo-go 中如何实现路由策略功能

    可在控制面对服务的路由进行精细控制,是一个成熟 RPC 系统必备的能力之一.作为一个逐步走向成熟的 RPC 系统,Apache/dubbo-go(以下简称 dubbo-go )的最新版本 v1.4 中 ...

  3. 微服务治理实践:如何对单点异常进行自动摘除

    微服务架构下,稳定性和高可用性一个永恒的话题,在实际的治理过程中,我们有可能会遇到以下场景: 某个应用灰度发布,先上了几台机器,由于代码逻辑写的有问题,造成线程池满,出现运行异常. 服务端集群中,某几 ...

  4. dubbogo 回顾与展望

    Dubbo 是阿里于 2011 年开源的一款高性能 RPC 框架,在 Java 生态中具有不小的影响力.2019年5月21日,Dubbo 从 Apache 软件基金会毕业,成为 Apache 顶级项目 ...

  5. Dubbo源码解析 --- DIRECTORY和ROUTER

    Dubbo源码解析 --- DIRECTORY和ROUTER 今天看一下Directory和Router. 我们直接从代码看起(一贯风格),先看后总结,对着总结再来看,相信会收获很多.我们先看com. ...

  6. Dubbo 源码分析 - 集群容错之 Router

    1. 简介 上一篇文章分析了集群容错的第一部分 – 服务目录 Directory.服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由.上一篇文章关于服务路由相关逻辑没有细 ...

  7. Dubbo源码解析 —— Router

    作者:肥朝 原文地址:http://www.jianshu.com/p/278e782eef85 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友情 ...

  8. Dubbo源码解析之服务路由策略

    1. 简介 服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者.在详细分析服务路由的源码之前,先来介绍一下服务路由是什么.服务路由包含一条 ...

  9. 最新 30 道 Dubbo 面试题及答案

    Spring Eureka 从开源转变为闭源,Consul 正在崛起,而 Dubbo 又开始重新更新.目前市场上仍有不少公司使用dubbo我们也需要继续学习. 1.为什么要用Dubbo? 随着服务化的 ...

  10. Dubbo开源现状与未来规划

    摘要: Dubbo 在过去一段时间疏于维护,去年阿里高调宣布重启 Dubbo 开源之后,社区里问的最多的问题是,这次开源与上次有什么一样,还有就是 Dubbo 和 Spring Boot.Spring ...

最新文章

  1. 中国财团收购飞利浦照明业务遭美封杀
  2. Memcache缓存系统原理
  3. 1.1 Java类的封装
  4. poj1050 To the Max
  5. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解
  6. STM32F103:二.(2)串口控制LED
  7. iis url重写 域名跳转子目录_IIS设置URL重写,实现页面的跳转的重定向方法
  8. [转载] numpy.exp,numpy.sqrt,np.power等函数的详细理解
  9. python文件目录操作-2
  10. php在apache中式模块,在WIN98下以apache模块方式安装php
  11. 基金指数温度怎么算_基金指数温度靠谱吗【指数温度查询技巧】
  12. java 使用类的方式描述计算机_用JAVA设计,实现并测试一个计算机类,它包括如下内容...
  13. 收缩毛孔全过程,很详细! - 健康程序员,至尚生活!
  14. D3.js实现带动画效果的柱状图
  15. 实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?
  16. 方便的U盘量产工具不刻盘装系统
  17. 技术人攻略访谈三十七-程显峰:IT病得有多重?技术圈交际花谈研发管理怪现状
  18. kingdee漏洞金蝶EAS存在命令执行漏洞
  19. 服务器共享文档密码设置,服务器共享模式怎么设置密码
  20. 论文p5解释 Bootstrap开关电路

热门文章

  1. Bash漏洞分析溯源
  2. 【linux】inux操作系统常见指令
  3. Zotero同步OneDrive
  4. go orm 报错 packet.go:123 closing bad idle connection
  5. mysql数据库乱码怎么修改_mysql数据库乱码怎么修改
  6. 关于Altium Designer 提示发送错误报告解决方法
  7. Foxmail登录不了网易企业邮箱解决办法
  8. Arducopter Yaw角分析
  9. python颜值打分器--你的长相能打几分
  10. 百度AI人脸识别接口测试 颜值评分 性别识别 物体识别 java 颜值打分