3、Dubbo高级特性
3.2、超时与重试
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
- dubbo 利用超时机制来解决这个问题(使用timeout属性配置超时时间,默认值1000,单位毫秒)
- 若超时时间较短,当网络波动时请求就会失败,Dubbo通过重试机制避免此类问题的发生
user-consumer模块中添加配置信息
dubbo: registry: address: nacos://127.0.0.1:8848consumer: timeout: 3000retries: 0
3.3、启动检查
为了保障服务的正常可用,Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常
在正式环境这是很有必要的一项配置,可以保证整个调用链路的平稳运行
在开发时,往往会存在没有提供者的情况。由于启动检查的原因,可能导致开发测试出现问题
可以通过check=false关闭
user-consumer模块中添加配置信息
dubbo: registry: address: nacos://127.0.0.1:8848consumer: check: false
3.4、多版本
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
Dubbo提供了提供者多版本的支持,平滑处理项目功能升级部署
(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本version=“2.0.0”) (publicclassUserServiceImpl2implementsUserService { …………} (2)user-consumer消费者调用时,指定版本调用"/user") (publicclassUserController { //引用远程服务version="2.0.0") (privateUserServiceuserService; ………}
3.5、负载均衡
在集群部署时,Dubbo提供了4种负载均衡策略,帮助消费者找到最优提供者并调用
- Random :按权重随机,默认值。按权重设置随机概率。
- RoundRobin :按权重轮询
- LeastActive:最少活跃调用数,相同活跃数的随机。
- ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。
"/user") (publicclassUserController { //引用远程服务loadbalance="roundrobin") (privateUserServiceuserService; }
4、SpringCloud整合Dubbo
通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。
4.1、功能概述
将Dubbo集成至SpringCloud主要是替换Ribbo或者Feign实现远程调用。加入Dubbo后,整体的架构如下:
4.2、入门案例
4.2.1、抽取接口
定义接口模块dubbo-api,并将UserService接口抽取到此模块下
packagecn.itcast.dubbo.api; importcn.itcast.dubbo.domain.User; publicinterfaceUserService { UserqueryById(Longid); }
4.2.2、项目依赖
父工程加入SpringCloud Alibaba依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope></dependency>消费者和提供者引入nacos注册中心和Dubbo依赖<!--nacos注册中心的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--springcloudalibabadubbo依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>cn.itcast</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
4.2.3、服务提供者
修改UserService实现UserApi接口。并使用@DubboService注解替换@Service对外暴露dubbo服务
packagecn.itcast.user.service; importcn.itcast.dubbo.api.UserService; importcn.itcast.dubbo.domain.User; importcn.itcast.user.mapper.UserMapper; importorg.apache.dubbo.config.annotation.DubboService; importorg.springframework.beans.factory.annotation.Autowired; publicclassUserServiceImplimplementsUserService { privateUserMapperuserMapper; publicUserqueryById(Longid) { returnuserMapper.findById(id); } } 在application.yml中添加配置spring: datasource: url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverapplication: name: user-servicecloud: nacos: discovery: server-addr: localhost:8848#配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描dubbo: protocol: name: dubboport: 20881registry: address: spring-cloud://localhost #使用SpringCloud中的注册中心scan: base-packages: cn.itcast.user.service#dubbo中包扫描
4.2.4、服务消费者
在OrderController中引入dubbo服务。调用UserService查询用户
packagecn.itcast.order.controller; importcn.itcast.dubbo.api.UserService; importcn.itcast.dubbo.domain.Order; importcn.itcast.dubbo.domain.User; importcn.itcast.order.service.OrderService; importorg.apache.dubbo.config.annotation.DubboReference; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.PathVariable; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; "order") (publicclassOrderController { privateOrderServiceorderService; privateUserServiceuserService; "{orderId}") (publicOrderqueryOrderByUserId( ("orderId") LongorderId) { //根据id查询订单Orderorder=orderService.queryOrderById(orderId); //获取用户idLonguserId=order.getUserId(); //查询用户Useruser=userService.queryById(userId); //设置用户对象order.setUser(user); // 根据id查询订单并返回returnorder; } }
在Order-service的模块中添加dubbo配置
spring: application: name: order-servicecloud: nacos: discovery: server-addr: localhost:8848#dubbo配置dubbo: registry: address: spring-cloud://localhost #使用cloud的注册中心consumer: check: false#dubbo默认有启动检查retries: 0#dubbo内置的重试机制