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网页可以操控