dubbo

dubbo流程概述

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案Dubbo的协议是==长连接、单一链接==

 

节点角色说明
Provider暴露服务的服务提供方【生产者】
Consumer调用远程服务的服务消费方【消费者】
Registry服务注册与发现的注册中心【nacos】
Monitor统计服务的调用次数和调用时间的监控中心【监控出现问题不影响服务调用】
Container服务运行容器

调用关系说明

  • 服务容器负责启动,加载,运行服务提供者。

  • 服务提供者在启动时,向添加中心添加自己提供的服务。

  • 服务消费者在启动时,向添加中心订阅自己所需的服务。

  • 添加中心返回服务提供者地址列表给消费者,如果有变更,添加中心将基于长连接推送变更数据给消费者。

  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

 

消费端服务端注解

@DubboService:属性

version:服务版本,生产者和消费者版本要一致
group:服务分组,当一个接口有多个实现类时用分组区分
delay:延迟注册服务时间,类似懒加载
timeout:远程服务调用超时时间(毫秒)
retries:远程调用重试次数,不包括第一次
connections:最大连接数
loadbalance:负载均衡策略
weight:服务权重
executes:服务提供者每服务每方法最大可并行执行请求数

 @DubboReference

version:服务版本,生产者和消费者版本要一致
group:服务分组,当一个接口有多个实现类时用分组区分
delay:延迟注册服务时间,类似懒加载
timeout:远程服务调用超时时间(毫秒)
retries:远程调用重试次数,不包括第一次
connections:最大连接数
loadbalance:负载均衡策略
weight:服务权重
check:启动时检查提供者是否存在,true报错,flase忽略
actives:每服务消费者每服务每方法最大并发调用数

 

集群容错

集群调用失败时,Dubbo 提供的容错方案,在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

 

各节点关系:

  • 这里的 InvokerProvider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息

  • Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更

  • ClusterDirectory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个

  • Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等

  • LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

Failover Cluster

失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster

失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

负载均衡

Random LoadBalance

  • 随机,按权重设置随机概率。

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

RoundRobin LoadBalance

  • 轮询,按公约后的权重设置轮询比率。

  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

  • 一致性 Hash,相同参数的请求总是发到同一提供者。

  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing

  • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />

  • 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

隐式传参

通过 Dubbo 中的 Attachment 在服务消费方和提供方之间隐式传递参数

可以通过 RpcContext 上的 setAttachmentgetAttachment 在服务消费方和提供方之间进行参数的隐式传递。

注意:path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值。

 

代码示例

生产者

@DubboService(
        // 版本    在配置文件里面配置的
        version = "${dubbo.application.version}",
        // 超时时间
        timeout = 5000,
        // 失败重试次数   以消费者的配置为主,如果消费者没有配置那么就以生产者为主
        retries = 2,
        // 分组    如果一个服务中有两个都实现了一个接口那么就是用group进行区分
        group = "b",
        // 连接数
        connections = 100,
        // 并发数
        executes = 100,
        // 权重
        weight = 10,
        methods = {
        // 如果想要其他方法都是上边的设置,但是只要helloUser这个方法是重试1一次,那么 就用Method去指定这个方法,就可以专门为这个方法设置一个设置
        @Method(name = "helloUser",timeout = 5000,retries = 1)
         })
public class PayFaceImpl implements UserFace {

    @Override
    public String helloUser(String userName) {
        return "HelloPay!" + userName;
    }
}

消费者

@RestController
public class UserController {

    @DubboReference(version = "${dubbo.application.version}",check = false,group = "a")
    UserFace userFace;

    @GetMapping("{userName}")
    public String helloUser(@PathVariable("userName") String userName){
        return userFace.helloUser(userName);
    }

}

版本要一样,并且如果消费者配置了就以消费者为主,如果没有配置就以生产者的配置为主

使用步骤

1 导入依赖

<dependencies>
    <!--接口定义层-->
    <dependency>
        <groupId>com.itheima.dubbo</groupId>
        <artifactId>dubbo-interface</artifactId>
    </dependency>
    <!--web支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--nacos支持-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--dubbo支持-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
</dependencies>

第二步 生产者配置

#服务配置
server:
  #端口
  port: 8080
  #服务编码
  tomcat:
    uri-encoding: UTF-8
#spring相关配置
spring:
  #应用配置
  application:
    #应用名称
    name: dubbo-producer
  main:
    allow-bean-definition-overriding: true
  cloud:
    #nacos添加中心
    nacos:
      discovery:
        server-addr: 192.168.112.77:8848
        namespace: public
        group: SEATA_GROUP
dubbo:
  #dubbo服务版本
  application:
    version: 1.0.0
    logger: slf4j
  #dubbo接口扫描路径
  scan:
    base-packages: com.itheima.dubbo
  #dubbo服务添加
  registry:
    address: spring-cloud://192.168.112.77
  #dubbo服务协议类型及端口,线程数【这里是默认配置】
  protocol:
    name: dubbo
    port: 28080
    threads: 200
    accesslog: D:/logs/dubbo-producer-01.log

消费者配置

#服务配置
server:
  #端口
  port: 8081
  #服务编码
  tomcat:
    uri-encoding: UTF-8
#spring相关配置
spring:
  #应用配置
  application:
    #应用名称
    name: dubbo-web
  main:
    allow-bean-definition-overriding: true
  #nacos添加中心
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.112.77:8848
        namespace: public
        group: SEATA_GROUP
#dubbo消费端配置
dubbo:
  application:
    version: 1.0.0
    logger: slf4j
  cloud:
    #表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。
    subscribed-services: dubbo-producer
  scan:
    #扫描路径
    base-packages: com.itheima.dubbo.web
  registry:
    address: spring-cloud://192.168.112.77
    #dubbo服务协议类型及端口,线程数【这里是默认配置】
  protocol:
    name: dubbo
    port: 28081
    threads: 200
    accesslog: D:/logs/dubbo-web-01.log

接下来就可以直接调用,生产者实现接口并且重写,消费者注入该接口进行调用该方法即可

如果有多个实现这个方法那么就可以添加进行区分,生产者添加组名,消费者也添加组名,消费者根据组名匹配对于组名的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值