多版本&配置本地存根&SpringBoot整合的三种方式

「这是我参与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" />

猜你喜欢

转载自juejin.im/post/7036382782137827342