Dubbo的快速入门

文档背景

在很多后台服务的架构中,采用了RPC+微服务的架构思想。
RPC采用dubbo框架作为治理框架,对外接口采用RESTful和GraphQL接口方式
所以学习一下dubbo是很有必要的 

1、什么是Dubbo

官网:https://dubbo.apache.org/zh/docs/
背景介绍

Apache Dubbo™ (incubating)是一款高性能Java RPC框架
duboo是由阿里团队开发的RPC框架,由Apache孵化

早期介绍

Dubbo是一个分布式框架,最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦。
从服务模型的角度,Dubbo采用的是一种非常简单的模型。1.提供服务方 2.消费方 3.第三方(注册中心、协议支持、服务监控)

1.1、什么是RPC

RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。它假定某些传输协议的存在,如TCP或UDP,以便为通信程序之间携带信息数据。通过它可以使函数调用模式网络化。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

2、Dubbo服务治理

在这里插入图片描述

在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具。
简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。
弊端:
当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。
当进一步发展,服务间依赖关系变得复杂,无法描述架构关系。
服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

请添加图片描述

  • Provider 暴露服务的提供方
  • Concumer 调用远程服务的服务消费方
  • Registry 服务注册与发现的注册中心
  • Monitor 统计服务的调用次数和调用时间的监控中心
  • Container 服务运行容器

调用关系

服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo架构具有一下几个特点:分别是连通性、健壮性、伸缩性、以及向未来架构的升级性

3、注册中心

注册中心有很多种,而Dubbo也支持很多注册中心,一般推荐使用Zookeeper。注册中心有点类似与SpringCloud中常用的微服务治理工具 Eureka。

3.1、为什么使用Zookeeper

Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务.
支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。

在这里插入图片描述
流程说明:

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

支持以下功能:

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

4、Dubbo Admin

Dubbo提供了可视化的界面管理工具,方便我们对服务进行管理,它就是Dubbo Admin,
代码地址:https://github.com/apache/incubator-dubbo-ops

部署安装
第一步,下载并解压

git clone https://github.com/apache/incubator-dubbo-ops.git

第二步,修改配置文件

## 这里就是我们配置利用Docker安装好的 Zookeeper地址
在 dubbo-admin-backend/src/main/resources/application.properties 中指定注册中心地址。

第三步,使用maven进行构建项目(都要在Maven环境下执行):

#构建 打包
mvn clean package
#通过Maven插件启动项目
mvn --projects dubbo-admin-backend spring-boot:run

最后,访问系统
打开浏览器:输入对应地址就行

该工具可以查看 搜索服务信息,可以查看服务提供者和服务消费者的详细信息

5、服务的负载均衡

在集群负载均衡时,Dubbo 提供了多种均衡策略,默认为 random 随机调用。

负载均衡的策略
Random LoadBalance

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

RoundRobin LoadBalance

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

6、Dubbo://协议

dubbo提供9种协议,分别是
dubbo://
rmi://
hessian://
http://
webservice://
thrift://
memcached://
redis://
rest://

Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远
大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

在这里插入图片描述

  • Transporter (传输): mina, netty, grizzy
  • Serialization(序列化): dubbo, hessian2, java, json
  • Dispatcher(分发调度): all, direct, message, execution, connection
  • ThreadPool(线程池): fixed, cached

7、代码资源

代码仓库URL: https://gitee.com/yi-yunlong/itcast-dubbo.git

写的一个消费者 RPC调用远端服务API,开启提供者多实例,测试 dubbo的随机调用和轮询机制。
核心测试类如下
配置好就可以启动了

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Reference(version = "1.0.0", loadbalance = "roundrobin")
    private UserService userService;

    @Test
    public void testQueryAll() {
        for (int i = 0; i < 100; i++) {
            System.out.println("开始调用远程服务 >>>>>" + i);
            List<User> users = this.userService.queryAll();
            for (User user : users) {
                System.out.println(user);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }


}

当出现如下说明dubbo的服务端启动成功并且成功将自己注册进了zookeeper

在这里插入图片描述

### 使用 Dubbo 进行服务调用和分布式应用开发 #### 服务提供者配置和服务暴露 为了使应用程序能够作为服务提供者工作,在项目中引入必要的依赖之后,需定义好要发布的接口以及其实现类。接着在 Spring 配置文件里声明 dubbo:application、dubbo:registry 和 dubbo:protocol 节点来指定应用名称、注册中心地址及通信协议等基本信息[^1]。 ```xml <dubbo:application name="demo-provider"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:protocol name="dubbo" port="20880"/> ``` 对于具体的服务,则通过 dubbo:service 来标注并公开出去: ```xml <bean id="demoService" class="com.example.DemoServiceImpl"/> <dubbo:service interface="com.example.IDemoService" ref="demoService"/> ``` #### 客户端远程调用设置 客户端同样需要完成上述提到的基础环境搭建部分的工作;另外还需利用 dubbo:reference 注解或 XML 方式注入远端服务实例以便发起请求操作。 ```xml <dubbo:reference id="demoService" interface="com.example.IDemoService"/> ``` 随后就可以像本地 Bean 一样正常使用该对象来进行方法调用了。 #### 动态管理和维护 借助于 Telnet 命令工具,管理员可以在不重启程序的前提下查看当前在线节点状态、统计信息查询或是执行一些简单的控制指令,从而达到实时监控与快速响应的目的[^2]。 #### 细粒度的服务治理策略——分组机制 考虑到多版本共存或者跨部门协作的需求场景下可能出现冲突的情况,因此推荐采用基于 Group 属性的方式对同类但有所别的 API 实施隔离措施,进而保障整个生态系统的稳定运行[^3]。 ```java // 提供方 @Service(group = "v1", version = "1.0.0") public class DemoServiceImpl implements IDemoService {} // 消费方 @Reference(group = "v1", version = "1.0.0") private IDemoService demoService; ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值