「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
多版本
provider.xml配置
<dubbo:service interface="com.atguigu.gmall.service.UserService"
ref="userServiceImpl" timeout="1000" version="1.0.0">
<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
</dubbo:service>
<bean id="userServiceImpl" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
<!-- 4、暴露服务 ref:指向服务的真正的实现对象 -->
<dubbo:service interface="com.atguigu.gmall.service.UserService"
ref="userServiceImpl2" timeout="1000" version="2.0.0">
<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
</dubbo:service>
<bean id="userServiceImpl2" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean>
复制代码
consumer.xml配置(确定调用哪个版本的服务)
<dubbo:reference interface="com.atguigu.gmall.service.UserService"
id="userService" timeout="5000" retries="3" version="*">
<!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
</dubbo:reference>
复制代码
配置本地存根
在 Dubbo 中利用本地存根在客户端执行部分逻辑
远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub 1,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。
新建一个类实现本地存根
package com.atguigu.gmall.service.impl;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
import java.util.List;
public class UserServiceStub implements UserService {
private final UserService userService;
// 构造函数传入真正的远程代理对象
public UserServiceStub(UserService userService) {
super();
this.userService = userService;
}
@Override
public List<UserAddress> getUserAddressList(String userId) {
if(userId!=null){
System.out.println("本地存根");
return userService.getUserAddressList(userId);
}
return null;
}
}
复制代码
<dubbo:reference interface="com.atguigu.gmall.service.UserService"
id="userService" timeout="5000" retries="3" version="*" stub="com.atguigu.gmall.service.impl.UserServiceStub">
<!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
</dubbo:reference>
复制代码
与SpringBoot整合的三种方式
1.引入dubbo-starter配置application.properties,使用@Service暴露服务,使用@Reference调用服务
2.引入dubbo-starter使用,保留dubbo xml配置文件,使用@ImportResource导入dubbo配置文件
3.使用注解API的方式,将每一个注解手动创建到容器
按照轮询的负载均衡
负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
负载均衡策略
Random LoadBalance随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。RoundRobin LoadBalance轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。LeastActive LoadBalance最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。ConsistentHash LoadBalance一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。算法参见:en.wikipedia.org/wiki/Consis… <dubbo:parameter key="hash.arguments" value="0,1" />缺省用160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />