Dubbo使用总结

目录

配置文件

spring.xml配置

springboot配置

高级功能

负载均衡

多协议

多注册中心

超时、重试

分组

版本

直连模式


注意:本文参考  (一)Dubbo快速入门教程(详细+例子) - 醋酸菌HaC - 博客园

快速入门 | Apache Dubbo

Apache Dubbo

配置文件

依赖:(推荐使用2.7.13版本)。

spring集成dubbo:


    org.apache.dubbo
    dubbo
    2.7.13


    org.apache.dubbo
    dubbo-registry-zookeeper
    2.7.13

springboot与dubbo集成:


    org.apache.dubbo
    dubbo-spring-boot-starter
    2.7.13


    org.apache.dubbo
    dubbo-registry-zookeeper
    2.7.13

spring.xml配置

1、服务端

在服务提供方实现接口(对服务消费方隐藏实现):

spring-provider.xml :



 











 


一般来说,我们会把 beanId 交给 spring 去管理只需要在 xml 里面声明扫描包,然后使用 @Service 声明实现类 即可:


2、客户端

spring-consumer.xml:





springboot配置

1、服务端

上面例子的 spring-provider.xml 换成 properties 文件的写法是这样的:

# 应用名
dubbo.application.name=demo-provider
# 注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
# 调用协议地址
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
#开启包扫描,可替代 @EnableDubbo 注解
#dubbo.scan.base-packages=com.meizu.quickgame

开启基于注解的dubbo功能(主要是包扫描@DubboComponentScan):

// 开启基于注解的dubbo功能(主要是包扫描@DubboComponentScan)
// 也可以在配置文件中使用dubbo.scan.base-package来替代@EnableDubbo
@EnableDubbo(scanBasePackages = {"com.meizu.quickgame"})
@SpringBootApplication
public class UserServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceProviderApplication.class, args);
    }
}

2、客户端

# 应用名
dubbo.application.name=demo-consumer
# 注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
dubbo.consumer.timeout=1000

使用例子1:

dubbo和spring可以完美结合,只需要在spring配置文件声明即可。

provider:

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-provider.xml");
        context.start();
        new CountDownLatch(1).await();
    }

consumer:

public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-consumer.xml");
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService");
        String hello = demoService.sayHello("world");
}

使用例子2:

这里展示注解的方式,需要声明@EnableDubbo

provider:

@DubboService(version = "1.0.0")
public class UserServiceImpl implements UserService{
    
}

consumer:

@DubboReference(version = "*", protocol = "dubbo,hessian", loadbalance = "random" )
private UserService userService;

高级功能

负载均衡

xml:

服务端级别:


服务端方法级别:


	

客户端级别:


客户端方法级别:


	

当多个provider注册到zk,consumer会选择指定的负载均衡算法自动请求,遇到上线或者下线会重新计算。

常见有四种负载均衡:

random

随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

roundRobin (默认)

轮询,按公约后的权重设置轮询比率。
存在慢的提供者类即请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

leastActive

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

consistentHash

一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动

多协议

dubbo支持多种协议:

dubbo

hessian

http

rmi

webservice

thrift

memcached

redis

不同服务不同协议

不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议


 
    
    
    
    
    
    
    
    
     

多协议暴露服务

需要与 http 客户端相互操作



    
    
    
    
    
    
    

多注册中心

两个不同注册中心,使用竖号分隔多个不同注册中心地址:





不同服务使用不同注册中心:








还可以这样:







超时、重试

超时默认重试 值: 1000ms

重试默认重试2次,不算第一个调用,一共会调用三次

如服务方设置:


注意,本人测试了一下,虽然服务方设置重试次数为1,消费者默认,最终结果还是会重试2次(消费者默认值),所以服务方提供的重试次数无效,建议在消费者设置,但是超时时间是生效的。

超时、重试建议在消费者设置:

分组

当一个接口有多种实现时,可以用 group 区分。

provider.xml

    

    

consumer.xml




    
                     

group="*" 和 group="groupA,groupB" 是一样的效果,但总是只调一个可用组的实现。(不能实现负载均衡)

这里有个坑,reference group="*" ,consumer在启动的时候已经选好了分组,并不是轮询两个分组

如果你要使用group进行负载均衡,consumer就不要写group

版本

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。



consumer 设置 version="*" 可以 轮询 调用provider,而group不能,这是和group的最大区别

直连模式

直连模式一般应用于测试模式。

消费者:




服务方不需要修改,如果开启了token验证,需要在 或者 声明:

    




    
    

消费者需要携带token:

RpcContext.getContext().setAttachment("token","123456");

如果不需要token验证,设置成 false 即可

你可能感兴趣的:(Dubbo,dubbo,spring,boot,java)