Dubbo简单使用

  • Post author:
  • Post category:其他




参考尚硅谷雷丰阳与官方文档



网站应用发展

image-20210513150634311

单一应用架构:网站流量小只需要一个应用,所有功能部署到一起

垂直应用架构:访问量逐渐增大,将应用拆分为几个互不相关的应用(无法重用公共模块)

分布式服务架构:应用之间必须交互,把核心业务抽取出来,作为独立的服务,使用分布式服务框架

流动计算框架:为了提高服务利用率,增加一个调度中心,实时管理集群,提高集群利用率



dubbo(并不依赖web容器非HTTP RESTFul)

高性能,轻量级,开源javaRPC框架

image-20210513152025286

Monitor(监控中心):监控服务提供者,服务消费者在内存调用的时间与次数,定时发送统计数据到监控中心



编写案例(注意传递的实体类最好实现序列化接口)

引入依赖(双方都有引入)

<!--dubbo主依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>
<!--zookeeper客服端-->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>
<!--对zookeeper的包装依赖-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>

服务端配置

<!--当前应用的名字  -->
<dubbo:application name="user-service"/>
<!--指定注册中心的地址  -->
<dubbo:registry address="zookeeper://8.131.68.141:9008" />
<!--使用dubbo协议,将服务暴露在20880端口  -->
<dubbo:protocol name="dubbo" port="20880" />
<bean class="service.UserServiceImpl" id="userService"/>
<!-- 指定需要暴露的服务 -->
<dubbo:service interface="service.UserService" ref="userService" />

客服端配置

<!--应用名称-->
<dubbo:application name="order-web"/>
<!-- 指定注册中心地址 -->
<dubbo:registry address="zookeeper://8.131.68.141:9008" />
<!-- 生成远程服务代理,可以和本地bean一样使用-->
<dubbo:reference id="userService" interface="service.UserService"/>



SpringBoot案例

依赖(两端都一样,省略其他通用依赖)

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

服务端配置(调用端除了应用名称其他都一样)(所有属性都可以与xml属性对应)

dubbo.application.name=user-service
dubbo.registry.address=127.0.0.1:2181		# 注册地址
dubbo.registry.protocol=zookeeper			# 注册类型
dubbo.protocol.name=dubbo					# 协议类型

注解使用

使用@EnableDubbo开启Dubbo,两端都需要

使用com.alibaba.dubbo.config.annotation.Service注解标注服务提供

使用com.alibaba.dubbo.config.annotation.Reference标注对象来自远程调用



参数使用顺序

可以使用-Dxxx配置虚拟机参数,也可以使用xml,也可以使用配置文件(配置的命名规律如下图)

默认 虚拟机参数>xml配置>配置文件配置

image-20210513171055990



常用属性

dubbo.registry.check=false	# 取消注册检测,默认注册失败会报错
dubbo.consumer.check=false	# 取消服务检测,默认服务没有提供者会报错
dubbo.xxx.timeout=1000	# 设置各种超时时间,单位毫秒
dubbo.xxx.retries=2	# 调用超时,设置重试次数,设置为0不重试
dubbo.consumer.sticky=true	# 指定粘性连接,用于有状态的连接,尽量让客服端总是向同一服务提供者发起调用,除非该服务提供者挂了才换,

对于幂等操作(查询,删除,修改)可以设置重试,非幂等操作(新增)不能设置重试



集群容错

@Reference(version = “*”,cluster=“failfast”)//指定集群容错模式

failfast:调用一次出错直接报错,用于非幂等的写入操作

failsafe:调用出现异常直接忽略,用于写入日志操作

failback:失败自动恢复,后台记录失败请求定时重发

forking:并行调用多个服务,一个成功就返回,可以使用forks指定调用服务的数目,用于实时性较高的读操作

broadcast:广播所有服务提供者逐个调用任意一台报错就报错,用于通知服务提供者更新缓存



多版本(灰度发布,一部分使用新方法,稳定后再全部使用)

@Service(version = “1”)//指定服务版本 //注解都有很多参数

@Reference(version = “*”)//指定服务使用版本,可以使用统配符(在范围内随机)



使用stub(存根)

编写代理

public class UserStub implements UserService {
    private UserService userService;
    // 代理必须实现对应的接口  构造器唯一参数 远程代理
    public UserStub(UserService userService) {
        this.userService = userService;
    }
    @Override
    public User findUserById(Integer id) {
        System.out.println("UserStub");//可以监听 调用 做其他操作
        return userService.findUserById(id);
    }
}

使用

// 指定代理  把 指定远程对象注入代理   每次执行 会调用代理
@Reference(version = "*",stub = "com.sk.hellouser.stub.UserStub")
private UserService userService;



通过配置类配置(标签都有对应的XXXConfig)

@Configuration
public class DubboConfig {
//    <dubbo:application name="user-service"/>
    @Bean
    public ApplicationConfig applicationConfig(){
        ApplicationConfig config = new ApplicationConfig();
        config.setName("user-service");
        return config;
    }
//<dubbo:registry address="zookeeper://8.131.68.141:9008" />
    @Bean
    public RegistryConfig registryConfig(){
        RegistryConfig config = new RegistryConfig();
        config.setAddress("zookeeper://8.131.68.141:9008");
        return config;
    }
// <dubbo:protocol name="dubbo" port="20880" />
    @Bean
    public ProtocolConfig protocolConfig(){
        ProtocolConfig config = new ProtocolConfig();
        config.setName("dubbo");
        config.setPort(20080);
        return config;
    }
//<dubbo:service interface="service.UserService" ref="userService" />
    @Bean
    public ServiceConfig<UserService> serviceServiceConfig(UserService userService){
        ServiceConfig<UserService> config = new ServiceConfig<>();
        config.setInterface(UserService.class);
        config.setRef(userService);
        return config;
    }
}



zookeeper宕机

zookeeper注册中心宕机,服务消费者,仍能通过本地缓冲调用远程服务(zookeeper本地只是服务信息注册中心)



dubbo直连(推荐只在测试使用)

@Reference(url = “127.0.0.1:20882”)//也可以不通过注册中心 通过url直接连接

服务提供方配置 dubbo.protocol.port=20882



负载均衡(默认使用随机)

Random:随机,可以指定权重@Service(version = “1”,weight = 5)默认权重为0

RoundRobin:轮询,也可以指定权重,指定方式同上

LeastActive:按最近响应速度调用,最近响应越快调用概率越大

ConsistentHash:一致性Hash相同的请求,发到同一个对象处理

调用方法通过@Reference(loadbalance = “random”)指定负载均衡策略

image-20210513190126024



服务降级

@Reference(version = “*”,mock = “force”)//指定对服务降级

force:调用直接返回null,不发送远程调用

fail:还会远程调用,调用失败才返回null



结果缓存

@Reference(version = “*”,cache = “”)//指定对结果进行缓存

lru:使用lru算法进行缓存

threadlocal:线程缓存



回声测试

每个远程对象都实现了EchoService接口 可以强制类型转换

调用Object ok = echoService.$echo(“OK”);进行回声测试,正常情况发什么,返回什么



RpcContext(类似Spring的AopContext)

RpcContext.getContext();//记录RPC远程调用的上下文信息,每次RPC调用都会改变



延迟暴露服务

@Service(delay = 1000);//若服务需要初始化,可以指定延时暴露,单位毫秒,指定-1等待Spring容器准备完毕才暴露



访问令牌

@Service(token = “123456”);//设置服务的访问令牌,防止服务直连,必须通过服务中心获取令牌访问,若设置true,使用UUID随机生成



设置最大并发数

@Service(actives = 5);//actives设置最大并发数



各种服务的默认端口

image-20210514103826978



ReferenceConfigCache

ReferenceConfig用于创建远程服务映射,多次创建性能消耗较大,可以使用ReferenceConfigCache获取缓存(若缓存为null会自动创建)

ReferenceConfig<UserService> referenceConfig=new ReferenceConfig<>();
referenceConfig.setInterface(UserService.class);
ReferenceConfigCache configCache = ReferenceConfigCache.getCache();
UserService userService = configCache.get(referenceConfig);//获取缓存  获取不到才创建
configCache.destroy(referenceConfig);//销毁对应缓存



使用hystrix进行容错

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

开启hystrix @EnableHystrix

注解使用

@HystrixCommand(fallbackMethod = "error")
@GetMapping("/getUser")
public User getUser(Integer id){
    return userService.findUserById(id);
}
public User error(Integer id){
    return null;
}



标签解析

DubboBeanDefinitionParser实现了BeanDefinitionParser来对dubbo标签解析

DubboNamespaceHandler继承NamespaceHandlerSupport注册了相关的解析器

image-20210513192508456



版权声明:本文为weixin_44598449原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。