Dubbo

分布式基础理论

RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式。

dubbo核心概念

  1. Apache Dubbo是一款高性能、轻量级的开源Java RPC框架
  2. 它提供了三大核心能力
  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 以及服务自动注册和发现

环境搭建及流程

  1. 安装zookeeper及dubbo-admin管理控制台(控制台不装不影响使用)
  2. 思路:
    将接口与bean都定义到公共接口层,
    提供者A实现具体的服务并注册到公共接口,
    消费者B通过公共接口调用
  3. 创建模块
  • 公共接口层
bean和service
  • 服务提供者
pom.xml
引入公共接口的依赖
引入dubbo
引入curator操作zookeeper
resources下新建provider.xml

<!--1.指定当前服务/应用的名字(同样的服务名字相同,不要和其他服务同名)-->
<dubbo:application name="user-service-provider"/>
<!--2.指定注册中心的位置-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!--3.指定通信规则(通信协议/通信端口)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--4.暴露服务 ref:指向服务真正的实现对象-->
<dubbo:service interface="gmall.service.UserService" ref="userServiceImpl"/>

<!-- 服务的实现 -->
<bean id="userServiceImpl" class="com.atguigu.gmall.service.UserServiceImpl"/>
  • 服务消费者
pom.xml同上
connsumer.xml

<!--扫描包-->
<context:component-scan base-package="gmall.service"/>

<dubbo:application name="user-service-provider"/>

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

<!--声明需要调用的远程服务接口,生成远程服务代理-->
<dubbo:reference interface="gmall.service.UserService" id="userService/>
  • 业务调用
@Service
public class OrderServiceImpl implements OrderService{

    @Autowired
    UserService userService;

    /**
     * 初始化订单
     *
     * @param userId
     */
@Override
public void initOrder(String userId) {
  System.out.println("用户id : "+userId);
  List<UserAddress> userAddressList =userService.getUserAddressList(userId);
  for (UserAddress userAddress : userAddressList) {
      System.out.println(userAddress.getUserAddress());
   }
 }
}

监控中心

  1. dubbo-admin
    图形化服务管理界面,可从注册中心获取到所有的消费者和提供者进行配置管理
  2. dubbo-monitor-simple
    简单的控制中心
在提供者和消费者的xml中连接控制中心

<!--连接监控中心-->
<dubbo:monitor protocol="registry" />

整合springboot

服务提供者

  1. 引入依赖(公共接口 和 dubbo的springboot启动依赖)
<dependency>
            <groupId>org.example</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

		<dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
  1. 在springboot配置类中
dubbo.application.name=boot-user-service-provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=8171
dubbo.monitor.protocol=registry
  1. 在springboot 中暴露服务和调用服务使用注解调用
  • 在服务提供者实现类加上dubbo的service注解
  • 在启动类中加上@EnableDubbo

服务消费者

  1. 引入依赖
  2. 在springboot配置类中
server.port=8082

dubbo.application.name=boot-user-service-provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.monitor.protocol=registry
  1. 注解调用
  • 在服务消费者实现类中注入提供者的service上加@Reference
  • 在启动类中加上@EnableDubbo

dubbo配置相关

启动检查

调整注册中心不服务时是否报错

  1. 单一服务不检查
<dubbo:reference check="false"/>
  1. 所有服务都不检查
<dubbo:consumer check="false"/>

超时及覆盖关系

超时

运行超过多长时间会报错,不设置缺省值是1000ms

  1. 单一服务超时
允许超时5秒

<dubbo:reference timeout="5000"/>
在实现类中
睡眠4秒,若大于5秒则报错
Thread.sleep(4000);
  1. 具体方法设置超时
<dubbo:reference interface="gmall.service.UserService" id="userService">
        <dubbo:method name="getUserAddressList" timeout="1000"/>
</dubbo:reference>
覆盖关系
  1. 精确优先:精确到方法的要比精确到服务的优先,精确到服务要比全局优先
  2. 精确级别一样时,消费者设置要比提供者设置优先(精确优先大于消费者优先)

重试次数

  1. 服务重试(超时的基础上重试)
不包含第一次请求,故实际访问次数为4次

<dubbo:reference  retries="3" >
  1. retries=“0” 代表不重试
  2. 幂等的概念
    此方法多次操作结果都是一样的,如:查询,删除,修改
    非幂等如新增
  3. 幂等方法可以设置重试次数,非幂等方法不可以

多版本

通过版本控制实现不同方法的调用

提供者中

<dubbo:service interface="gmall.service.UserService" ref="userServiceImpl01" version="1.0.0"/>
<dubbo:service interface="gmall.service.UserService" ref="userServiceImpl02" version="2.0.0"/>

<!-- 服务的实现 -->
<bean id="userServiceImpl01" class="com.atguigu.gmall.service.UserServiceImpl"></bean>
<bean id="userServiceImpl02" class="com.atguigu.gmall.service.UserServiceImpl2"></bean>
消费者中

<dubbo:reference interface="gmall.service.UserService" id="userService"
 version="1.0.0">
 
 version="*" 就是随机调用

本地存根

配置

存到哪写到哪

<dubbo:reference interface="gmall.service.UserService" id="userService"
 stub="gmall.service.UserServiceStub">

存根类

public class UserServiceStub implements UserService{

    private final UserService userService;

    /**
     * 传入的是userservice的远程代理对象
     * @param userService
     */
    public UserServiceStub(UserService userService) {
        super();
        this.userService = userService;
    }

Springboot与Dubbo整合的三种方式

  1. 导入dubbo-spring-boot-starter,在springboot配置类中配置相关属性
    如果在配置类中配置dubbo.scan.base-packages,在启动类中就无需加@EnableDubbo注解
  2. 保留原始的xml文件形式,在启动类上添加注解
    导入dubbo-spring-boot-starter
@ImportResource(locations = "文件名.xml")

在启动类中就无需加@EnableDubbo注解
  1. 使用注解API的形式
    将每个组件手动创建到容器中,让dubbo扫描组件

高可用

zookeeper宕机与dubbo直连

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯,但不能注册新服务

负载均衡机制

默认是随机权重

服务降级

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作

在dubbo admin网页可以操控