更新时间:2019年07月26日 10时55分29秒 来源:黑马程序员论坛
如何动态获取Dubbo服务提供方地址列表 一、前言 dubbo框架本身提供了丰富的负载均衡策略,比如轮询、随机、最少活跃调用数、一致性hash等,但是有时候我们需要自己根据业务指定某个ip来进行调用。要指定ip进行调用就需要先知道服务提供者的ip。本文我们先来探讨第一步,当服务注册中心使用zookeeper时候如何获取某一个服务的提供端的地址列表。 二、实现 我们知道当服务提供方启动时候,会注册服务到服务注册中心,本文我们通用zookeeper,比如服务com.books.dubbo.demo.api.GreetingService则注册到zk后,那么当消费端启动时候会去zookeeper上订阅path为/dubbo/com.books.dubbo.demo.api.GreetingService/providers下面的信息,也就是服务提供者列表信息,那么我们就可以基于这个原理来获取某一个服务提供者列表,然后对信息进行过滤加工,并且注册一个监听器,当服务提供者机器增减后,动态更新保存的地址列表。 基于上面原理实现代码如下: [Java] 纯文本查看 复制代码 public class ZookeeperIpList { private String dataId = "com.books.dubbo.demo.api.GreetingService/providers:1.0.0"; private URL CONSUMER_URL; private static final Joiner j = Joiner.on("|").useForNull("nil"); public final List<String> getIpList() { return ipList; } private volatile List<String> ipList = new ArrayList<String>(); //对获取的列表内容进行过滤 private static List<URL> toUrlsWithoutEmpty(URL consumer, List<String> providers) { List<URL> urls = new ArrayList<URL>(); if (providers != null && providers.size() > 0) { urls = providers.stream().map(provider -> URL.decode(provider)).filter(provider -> provider.contains("://")) .map(provider -> URL.valueOf(provider)).filter(url -> UrlUtils.isMatch(consumer, url)) .collect(Collectors.toList()); } return urls; } // 解析服务提供者地址列表为ip:port格式 private void parseIpList(List<String> ipSet) { List<URL> urlList = toUrlsWithoutEmpty(CONSUMER_URL, ipSet); final List<String> ipListTemp = urlList.stream().map(url -> url.getAddress()).collect(Collectors.toList()); this.ipList = ipListTemp; } public void init(String zkServerAddr, String zkGroup, String dataId, String serviceGroup) { // 1.参数校验 Assert.notNull(zkServerAddr, "zkServerAddr is null."); Assert.notNull(dataId, "dataId is null."); Assert.notNull(dataId, "zkGroup is null."); Assert.notNull(dataId, "serviceGroup is null."); // 2.拼接订阅的path String[] temp = dataId.split(":"); if (temp.length != 2) { throw new RuntimeException("dataId is illegal"); } this.dataId = "/" + zkGroup + "/" + temp[0] + "/providers"; String consumeUrl = "consumer://127.0.0.1/?group=" + serviceGroup + "&interface=" + temp[0] + "&version=" + temp[1]; CONSUMER_URL = URL.valueOf(consumeUrl); // 3.开启zk,订阅path路径下服务提供者信息,并添加监听器 System.out.println(j.join("init zk ", zkServerAddr, this.dataId, consumeUrl)); ZkClient zkClient = new ZkClient(zkServerAddr); List<String> list = zkClient.subscribeChildChanges(this.dataId, new IZkChildListener() { @Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { // 3.1解析服务提供者地址列表 parseIpList(currentChilds); try { System.out.println((j.join("ipList changed:", JSON.json(ipList)))); } catch (IOException e) { } } }); //4. 解析服务提供者ip列表 parseIpList(list); } public static void main(String[] a) throws InterruptedException { ZookeeperIpList zk = new ZookeeperIpList(); zk.init("127.0.0.1:2181", "dubbo", "com.books.dubbo.demo.api.GreetingService:1.0.0", "dubbo"); try { System.out.println((j.join("parseIpList", JSON.json(zk.getIpList())))); } catch (IOException e) { } Thread.currentThread().join(); } } 如上代码main函数创建了一个ZookeeperIpList对象,并且调用其init方法,参数分别为zk地址,zk分组,服务接口以及版本,服务分组。 init方法内首先拼接要订阅的zk的path,拼接完成后dataid为/dubbo/com.books.dubbo.demo.api.GreetingService/providers,然后创建zkclient订阅该dataid对应的path,并且注册监听器,当path下信息变化后会得到最新列表。 并且使用parseIpList方法解析获取的地址列表为ip:port个数,解析完毕后保存到ipList中。 三、总结 本节介绍了一个简单的基于zookeeper获取服务提供者地址列表的方法,后面我们看如何指定ip进行调用。 |
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程【点击播放】
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |