Dubbo
分布式基础理论
RPC
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式。
dubbo核心概念
- Apache Dubbo是一款高性能、轻量级的开源Java RPC框架
- 它提供了三大核心能力
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 以及服务自动注册和发现
环境搭建及流程
- 安装zookeeper及dubbo-admin管理控制台(控制台不装不影响使用)
- 思路:
将接口与bean都定义到公共接口层,
提供者A实现具体的服务并注册到公共接口,
消费者B通过公共接口调用 - 创建模块
- 公共接口层
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());
}
}
}
监控中心
- dubbo-admin
图形化服务管理界面,可从注册中心获取到所有的消费者和提供者进行配置管理 - dubbo-monitor-simple
简单的控制中心
在提供者和消费者的xml中连接控制中心
<!--连接监控中心-->
<dubbo:monitor protocol="registry" />
整合springboot
服务提供者
- 引入依赖(公共接口 和 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>
- 在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
- 在springboot 中暴露服务和调用服务使用注解调用
- 在服务提供者实现类加上dubbo的service注解
- 在启动类中加上@EnableDubbo
服务消费者
- 引入依赖
- 在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
- 注解调用
- 在服务消费者实现类中注入提供者的service上加@Reference
- 在启动类中加上@EnableDubbo
dubbo配置相关
启动检查
调整注册中心不服务时是否报错
- 单一服务不检查
<dubbo:reference check="false"/>
- 所有服务都不检查
<dubbo:consumer check="false"/>
超时及覆盖关系
超时
运行超过多长时间会报错,不设置缺省值是1000ms
- 单一服务超时
允许超时5秒
<dubbo:reference timeout="5000"/>
在实现类中
睡眠4秒,若大于5秒则报错
Thread.sleep(4000);
- 具体方法设置超时
<dubbo:reference interface="gmall.service.UserService" id="userService">
<dubbo:method name="getUserAddressList" timeout="1000"/>
</dubbo:reference>
覆盖关系
- 精确优先:精确到方法的要比精确到服务的优先,精确到服务要比全局优先
- 精确级别一样时,消费者设置要比提供者设置优先(精确优先大于消费者优先)
重试次数
- 服务重试(超时的基础上重试)
不包含第一次请求,故实际访问次数为4次
<dubbo:reference retries="3" >
- retries=“0” 代表不重试
- 幂等的概念
此方法多次操作结果都是一样的,如:查询,删除,修改
非幂等如新增 - 幂等方法可以设置重试次数,非幂等方法不可以
多版本
通过版本控制实现不同方法的调用
提供者中
<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整合的三种方式
- 导入dubbo-spring-boot-starter,在springboot配置类中配置相关属性
如果在配置类中配置dubbo.scan.base-packages,在启动类中就无需加@EnableDubbo注解 - 保留原始的xml文件形式,在启动类上添加注解
导入dubbo-spring-boot-starter
@ImportResource(locations = "文件名.xml")
在启动类中就无需加@EnableDubbo注解
- 使用注解API的形式
将每个组件手动创建到容器中,让dubbo扫描组件
高可用
zookeeper宕机与dubbo直连
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯,但不能注册新服务
负载均衡机制
默认是随机权重
服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作
在dubbo admin网页可以操控