本篇文章为系列文章,未读第一集的同学请猛戳这里:RPC 框架 Dubbo 从理解到使用(一)

本篇文章讲解 Dubbo 支持的注册中心、Dubbo 负载均衡策略和 Dubbo 控制台的安装。

  

注册中心支持

  

  注册中心可以更高效的管理系统的服务:比如服务接口的发布、自动剔除无效的服务、自动恢复服务等。

  Dubbo 支持五种注册中心:Multicast、Nacos(推荐)、ZooKeeper(推荐) 、Redis、Simple。本文重点介绍前三个,更多注册中心的信息请参考:http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html

  

Multicast 注册中心

  

  Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

  1. 提供方启动时广播自己的地址
  2. 消费方启动时广播订阅请求
  3. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了 unicast=false,则广播给订阅者
  4. 消费方收到提供方地址时,连接该地址进行 RPC 调用。

  组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255

  

配置

  

<dubbo:registry address="multicast://224.5.6.7:1234" />

  或

<dubbo:registry protocol="multicast" address="224.5.6.7:1234" />

  或

dubbo.register.address=multicast://224.5.6.7:1234

  

  为了减少广播量,Dubbo 缺省使用单播发送提供者地址信息给消费者,如果一个机器上同时启了多个消费者进程,消费者需声明 unicast=false,否则只会有一个消费者能收到消息。

  当服务者和消费者运行在同一台机器上,消费者同样需要声明unicast=false,否则消费者无法收到消息,导致 No provider available for the service 异常。

<dubbo:registry address="multicast://224.5.6.7:1234?unicast=false" />

  或

<dubbo:registry protocol="multicast" address="224.5.6.7:1234">
<dubbo:parameter key="unicast" value="false" />
</dubbo:registry>

  

ZooKeeper 注册中心

  

  Apache ZooKeeper 是一个开放源码的分布式应用程序协调组件,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推荐使用。

  在微服务项目开发中 ZooKeeper 主要的角色是当做服务注册中心存在,我们将编写好的服务注册至 ZooKeeper 即可。

  

  

  流程说明:

  • 服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址。
  • 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址。
  • 监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

  

  支持以下功能:

  • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息;
  • 当注册中心重启时,能自动恢复注册数据,以及订阅请求;
  • 当会话过期时,能自动恢复注册数据,以及订阅请求;
  • 当设置 <dubbo:registry check="false" /> 时,记录失败注册和订阅请求,后台定时重试;
  • 可通过 <dubbo:registry username="admin" password="1234" /> 设置 zookeeper 登录信息;
  • 可通过 <dubbo:registry group="dubbo" /> 设置 zookeeper 的根节点,不配置将使用默认的根节点;
  • 支持 * 号通配符 <dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者。

  

预备工作

  

  当您将 ZooKeeper 整合到您的 Dubbo 工程之前,请确保后台已经启动 ZooKeeper 服务。

  

快速上手

  

  Dubbo 融合 ZooKeeper 成为注册中心的操作步骤非常简单,大致步骤可分为“增加 Maven 依赖”和“配置注册中心“。

  

依赖

  

  在 provider 和 consumer 中增加 zookeeper 客户端 jar 包依赖:

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.1</version>
</dependency>

Dubbo 支持 zkclient 和 curator 两种 Zookeeper 客户端实现:

注意:在 2.7.x 的版本中已经移除了 zkclient 的实现,如果要使用 zkclient 客户端,需要自行拓展。

  

  所以,我们还需要在 provider 和 consumer 中增加 curator 客户端 jar 包依赖:

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>

注意:单独添加 zookeeper 和 curator 依赖需要注意版本之间是否有冲突,较为麻烦。

  

  所以,一劳永逸的办法就是添加 Apache Dubbo 给定的一个已关联好的依赖:

<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.4.1</version>
<type>pom</type>
</dependency>

  

配置

  

  ZooKeeper 单机配置:

<dubbo:registry address="zookeeper://191.168.10.101:2181" />

  或:

<dubbo:registry protocol="zookeeper" address="191.168.10.101:2181" />

  或:

dubbo.register.address=zookeeper://192.168.10.101:2181

  或:

dubbo.register.protocol=zookeeper
dubbo.register.address=192.168.10.101:2181

  

  ZooKeeper 集群配置:

<dubbo:registry address="zookeeper://191.168.10.101:2181?backup=191.168.10.102:2181,191.168.10.103:2181" />

  或:

<dubbo:registry protocol="zookeeper" address="191.168.10.101:2181,191.168.10.102:2181,191.168.10.103:2181" />

  或:

dubbo.register.address=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181

  或:

dubbo.register.protocol=zookeeper
dubbo.register.address=192.168.10.101:2181,192.168.10.102:2181,192.168.10.103:2181

  

Nacos 注册中心

  

  Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理。Nacos 是 Dubbo 生态系统中重要的注册中心实现,其中 dubbo-registry-nacos 则是 Dubbo 融合 Nacos 注册中心的实现,推荐使用。

  Nacos 官网:https://nacos.io/zh-cn/

  Github:https://github.com/alibaba/nacos

  

预备工作

  

  当您将 Nacos 整合到您的 Dubbo 工程之前,请确保后台已经启动 Nacos 服务。

  

快速上手

  

  Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单,大致步骤可分为“增加 Maven 依赖”和“配置注册中心“。

  

依赖

  

  核心依赖主要是 dubbo-registry-nacosnacos-client

<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.1</version>
</dependency>

  

配置注册中心

  

  服务提供者和服务消费者只需要调整 address 属性配置即可。

  单机配置:

<!-- 使用 Nacos 注册中心,单机版 -->
<dubbo:registry address="nacos://127.0.0.1:8848"/>
<!-- 或 -->
<dubbo:registry protocol="nacos" address="127.0.0.1:2181"/>

  或:

dubbo.register.address=nacos://192.168.10.101:8848

  或:

dubbo.register.protocol=nacos
dubbo.register.address=192.168.10.101:8848

  

  集群配置:

<!-- 使用 Nacos 注册中心,集群版 -->
<dubbo:registry address="nacos://192.168.10.101:8848?backup=192.168.10.102:8848,192.168.10.103:8848"/>
<!-- 或 -->
<dubbo:registry protocol="nacos" address="192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848"/>

  或:

dubbo.register.address=nacos://192.168.10.101:8848

  或:

dubbo.register.protocol=nacos
dubbo.register.address=192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848

  随后,重启您的 Dubbo 应用,Dubbo 的服务提供和消费信息在 Nacos 控制台中即可显示。

  如图所示,服务名前缀为 providers: 的信息为服务提供者的元信息,consumers: 则代表服务消费者的元信息。点击“详情”可查看服务状态详情:

  

Dubbo 负载均衡

  

  在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用,也可以自行扩展负载均衡策略。

  

负载均衡策略

  

Random LoadBalance

  

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

  

  • 轮询,按公约后的权重设置轮询比率。
  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

  

LeastActive LoadBalance

  

  • 最少活跃调用数,ping 值(延迟低)的调用,相同延迟的情况下随机。
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

  

  • 一致性 Hash,相同参数的请求总是发到同一提供者。
  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
  • 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

  

配置

  

  一般在项目中不会在代码层面指定权重,而是通过监控中心(dubbo-admin)对服务动态的指定权重,官方文档:http://dubbo.apache.org/zh-cn/docs/admin/introduction.html

  

xml

  

  服务端服务级别

<dubbo:service interface="..." loadbalance="roundrobin" weight="100" />

  客户端服务级别

<dubbo:reference interface="..." loadbalance="roundrobin" />

  服务端方法级别

<dubbo:service interface="..." weight="100">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

  客户端方法级别

<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

  

yaml

  

dubbo:
provider:
loadbalance: roundrobin
weight: 100
consumer:
loadbalance: roundrobin

  

注解

  

@Service(loadbalance = "roundrobin", weight = 100)
@Reference(loadbalance = "roundrobin")

  

Dubbo 控制台

  

  Dubbo 2.6 版本以及以前我们是通过一个war包,将其部署在tomcat下,启动服务器访问war包项目即可,界面效果如下。

  

  Dubbo 2.7 版本以后管理控制台结构上采取了前后端分离的方式,前端使用 Vue 和 Vuetify 分别作为 Javascript 框架和 UI 框架,后端采用 Spring Boot 框架。既可以按照标准的 Maven 方式进行打包,部署,也可以采用前后端分离的部署方式,方便开发,功能上,目前具备了服务查询,服务治理(包括Dubbo2.7中新增的治理规则)以及服务测试三部分内容,最终效果如下:

  

部署

  

Maven方式部署

  

方式一

  

  使用 git 将项目克隆至本地,打包启动访问或者导入 IDE 启动访问

git clone https://github.com/apache/dubbo-admin.git
cd dubbo-admin
mvn clean package -Dmaven.test.skip=true
cd dubbo-admin-distribution/target
java -jar dubbo-admin-0.2.0-SNAPSHOT.jar

  项目访问地址:http://localhost:8080

  

方式二

  

  访问:https://github.com/apache/dubbo-admin 将项目下载至本地,打包启动访问或者导入 IDE 启动访问。

  

前后端分离部署

  

前端

  

cd dubbo-admin-ui
npm install
npm run dev

  

后端

  

cd dubbo-admin-server
mvn clean package -Dmaven.test.skip=true
cd target
java -jar dubbo-admin-server-0.2.0-SNAPSHOT.jar

  

  • 运行dubbo admin server dubbo admin server是一个标准的 Spring Boot 项目,可以在任何 Java IDE 中运行它
  • 运行dubbo admin ui dubbo admin ui由 npm 管理和构建,在开发环境中,可以单独运行:npm run dev
  • 页面访问:访问 http://localhost:8082,由于前后端分开部署,前端支持热加载,任何页面的修改都可以实时反馈,不需要重启应用。
  • 跨域问题:为了方便开发,项目使用前后端分离的部署模式,主要的好处是支持前端热部署,在这种模式下,前端会通过 8080 端口访问后端的 restful api 接口,获取数据,这将导致跨域访问的问题。因此我们在dubbo-admin-ui/config/index.js 添加了支持跨域访问的配置,当前端通过 npm run dev 单独启动时,这些配置将被激活,允许跨域访问。

  

核心配置文件

  

dubbo-admin-server/src/main/resources/application.properties

  主要配置有(如需修改,请替换为自己 ZooKeeper 的服务器地址):

# centers in dubbo2.7
admin.registry.address=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181
admin.config-center=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181
admin.metadata-report.address=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181 admin.root.user.name=root
admin.root.user.password=root

  三个配置项分别指定了注册中心,配置中心和元数据中心的地址。

  

Swagger 支持

  

  部署完成后,可以访问:http://localhost:8080/swagger-ui.html 来查看所有的 RESTful API。

  

访问

  

  本文使用前后端分离方式部署,访问:http://localhost:8082/,结果如下:

  第一次访问时需要输入用户名与密码,均为 root

  

  登录成功以后主界面如下,可以通过左侧菜单实现对服务的查询、治理、测试、Mock、统计等。

  

  点击上图中右侧查询结果的 详情 按钮可以进入以下页面查看基础信息、服务信息和元数据信息。如果元数据信息无法获取如下图,需要继续修改配置。

  

  官方已经给出了完整说明 Dubbo-Admin配置说明,按照说明配置即可。

  

解决元数据无法获取问题

  

  使用 ZooKeeper 图形化的客户端工具 ZooInspector 连接 ZooKeeper 修改 Dubbo 配置信息。

  

  在 dubbo 目录下依次添加节点 configdubbo,然后再添加 dubbo.properties,右侧填写配置信息。

admin.registry.address=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181
admin.metadata-report.address=zookeeper://192.168.10.101:2181?backup=192.168.10.102:2181,192.168.10.103:2181

  

  完成以上操作后,重新打包编译启动,再次查看详情即可看到元数据信息。

  至此 Dubbo 框架所有的知识点就讲解结束了。

本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

大家可以通过 分类 查看更多关于 Dubbo 的文章。

  

您的点赞转发是对我最大的支持。

扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~

RPC 框架 Dubbo 从理解到使用(二)的更多相关文章

  1. RPC 框架 Dubbo 从理解到使用(一)

    技术架构演变 单一应用架构 通俗地讲,"单体应用(monolith application)"就是将应用程序的所有功能都打包成一个独立的单元.当网站流量很小时,只需一个应用,将所有 ...

  2. 阿里 RPC 框架 DUBBO 初体验

    最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能. 快速开始 实际上,dubbo的官方文档已经提供了如何使用这个RPC框架example代码,基于 ...

  3. RPC框架基础概念理解以及使用初体验

    RPC:Remote Procedure Call(远程服务调用) RPC是做什么的 通过RPC框架机器A某个进程可以通过网络调用机器B上的进程方法,就像在本地上调用一样. RPC可以基于HTTP或者 ...

  4. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  5. 分布式RPC框架Dubbo实现服务治理:集成Kryo实现高速序列化,集成Hystrix实现熔断器

    Dubbo+Kryo实现高速序列化 Dubbo RPC是Dubbo体系中最核心的一种高性能,高吞吐量的远程调用方式,是一种多路复用的TCP长连接调用: 长连接: 避免每次调用新建TCP连接,提高调用的 ...

  6. RPC框架DUBBO

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  7. Dubbo学习笔记0:RPC框架Dubbo介绍

    整体来说,一个公司业务系统的演进流程基本都是从单体应用到多应用.在单体应用时,不同业务模块相互调用直接在本地JVM进程内就可以完成,而变为多个应用时,相互之间进行通信就不能简单的进行本地调用了,因为不 ...

  8. 高性能Java RPC框架Dubbo与zookeeper的使用

    https://blog.csdn.net/qq_38982845/article/details/83795295

  9. 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比

    远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...

随机推荐

  1. Windows 10 64位操作系统 下安装、配置、启动、登录、连接测试oracle 11g

    一.下载oracle安装包 1:详细下载安装版本可见官网:https://www.oracle.com/technetwork/database/enterprise-edition/download ...

  2. python学习笔记(十四)python实现发邮件

    import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart u ...

  3. three.js 材质翻转

    刚学.这个鸟玩意儿卡了半天,记录一下. var skyBox = new THREE.Mesh(skyGeometry, skyMaterial); //创建一个完整的天空盒,填入几何模型和材质的参数 ...

  4. P4199-万径人踪灭【FFT】

    正题 题目链接:https://www.luogu.com.cn/problem/P4199 题目大意 给出一个只包含\(a,b\)的字符串 求有多少个不连续的回文子序列(字母回文,位置对称) \(1 ...

  5. 如何使用云效Flow做质量检测,保障高质量的交付速度

    使用云效Flow做质量检测,保障高质量的交付速度,云效「Flow」 提供代码扫描. 安全扫描和各种自动化测试能力,支持人工测试卡点.自动化验证卡点等多种质量红线,确保业务质量.云效流水线 Flow 流 ...

  6. HttpRunner3.X - 全面讲解如何落地项目实战

    一.前言 接触httprunner框架有一段时间了,也一直探索如何更好的落地到项目上,本篇主要讲述如何应用到实际的项目中,达到提升测试效率的目的. 1.项目难题 这个月开始忙起来了,接了个大项目,苦不 ...

  7. 11.3 LVS

    LVS是什么 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.o ...

  8. 飞猪基于 Serverless 的云+端实践与思考

    作者 | 王恒飞(承荫) 本文整理自飞猪旅行前端技术专家--王恒飞(承荫)在[阿里云 Serverless Developer Meetup 上海站]上的分享.点击查看直播回放:https://dev ...

  9. 专访阿里云 Serverless 负责人:无服务器不会让后端失业

    2012 年,云基础设施服务提供商 Iron.io 的副总裁 Ken 谈到软件开发行业的未来,首次提出了 Serverless 的概念,为云中运行的应用程序描述了一种全新的系统体系架构.此后,以 AW ...

  10. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...