一篇文章带你熟知Dubbo

Dubbo

什么Dubbo框架?

Apache Dubbo 是一个高可用的,基于Java的开源RPC框架。

Dubbo框架不仅仅是具备RPC访问功能,还包含服务治理功能(其他方式管理服务信息)。

发展史

​ Dubbo是最开始是阿里巴巴内部使用的RPC框架。

​ 2011年对外提供。

​ 2012年停止更新。

​ 2017年开始继续更新。

​ 2019年捐献给Apache,由Apache维护2.7以上版本

架构原理

在这里插入图片描述

虚线

​ 虚线表示异步,实线表示同步。

​ 异步不阻塞线程性能搞,同步阻塞线程必须等待响应结果才能继续执行,相对性能低

Provider

​ 提供者。编写持久成,业务层和事务代码

Container

​ Spring容器,Dubbo完全基于Spring实现的

Registry

​ 注册中心。放置所有Provider对外提供的信息。包含Provider的ip,访问端口,访问遵守的协议,对外提供的接口,接口中有那些方法等相关信息

Consumer

​ 消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以包括页面等)。调用远程服务实现中的方法。

Monitor

​ 监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发给Monitor,由Monitor进行统计

执行流程

  1. start: 启动Spring容器时会把Provider启动
  2. register: 把Provider相关信息注册到Registry里
  3. subscribe: Consumer从Registry中订阅Provider的信息
  4. notify: 通知给Consumer
  5. invoke: Consumer根据Registry通知的信息进行调用Provider中方法
  6. count: Consumer和Provider把调用次数信息异步发送给Monitor进行统计

Dubbo支持协议

  1. Dubbo协议(官方推荐)

    ​ 基于TCP创建的,可复用的长连接协议

    ​ 优点:

    ​ 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) 协议的默认端口是:20880。(端口是服务端Provider占用的)

    ​ 缺点:

    ​ 大文件上传时,可能出现问题(不使用Dubbo实现文件传输)

  2. RMI(Remote Method Invocation)协议

    ​ 优点: JDK自带。

    ​ 缺点: 偶尔连接失败。

  3. Hessian协议

    ​ 优点: 可与原生Hessian互操作,基于HTTP协议,有HTTP大多数特性

    ​ 缺点: 需hessian.jar支持,http短连接的开销大,每次请求需要大量时间在握手和挥手上,不能复用

    ​ 适用于并发高,传输数据量小的场景

Dubbo支持注册中心

  1. Zookeeper(官方推荐)

    ​ 优点: 支持分布式.很多周边产品.

    ​ 缺点: 受限于Zookeeper软件的稳定性.Zookeeper专门分布式辅助软件,稳定较优

  2. Nacos

    ​ 缺点:重量级,需要独立安装

    ​ 优点:阿里自身注册中心,无缝集成。除此还支持配置中心等

  3. Multicast

    ​ 优点: 去中心化,不需要单独安装软件,不需要注册,没有注册中心

    ​ 缺点: 2.2.1 Provider、Consumer和Registry不能跨机房(路由)

  4. Redis

    ​ 优点: 支持集群,性能高

    ​ 缺点: 要求服务器时间同步.否则可能出现集群失败问题

  5. Simple

    ​ 优点: 标准RPC服务.没有兼容问题

    ​ 缺点: 不支持集群.

负载均衡

集群:一个内容,部署多次,形成的整体称为集群。集群中每个个体应该部署到不同的服务器上。

伪集群:集群中内容部署到同一台服务器上,通过不同端口区分不同个体。

负载均衡是在集群前提下,当访问整个集群时,集群中每个节点被访问次数或频率的规则。

Dubbo 内置了四个负载均衡策略。默认为Random

负载均衡策略的决定规则:

1、Provider方默认负载均衡策略是Random,随机策略。

2、Consumer方默认负载均衡策略不设定,使用Provider提供的负载均衡策略。

3、如果双方都设置了负载均衡策略,使用Consumer的负载均衡策略,因为局部优先,Provider是给所有的Consumer提供服务的,负载均衡策略也是给所有的Consumer提供的默认策略。Consumer的负载均衡策略只局限在当前消费端,是一个局部策略。

Random

随机。随机访问集群中节点。访问概率和权重有关。

RoundRobin(推荐)

轮询。访问频率和权重有关。

权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。

LeastActive

活跃数相同的随机,不同的活跃数高的放前面。

ConsistentHash

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

负载均衡的配置

方式一:

​ @Service | @DubboService 注解中属性 loadbalance。代表为Provider集群定义负载均衡策略

​ 默认是random

方式二:

@Reference | @DubboReference 注解中属性 loadbalance。代表为Consumer定义调用Provider负载均衡策略,默认无策略,采用Provider提供的负载均衡策略

方式三:

​ 在配置文件中配置.

​ 与注解配置区别:文件配置当前应用全局,注解是当前类对应Provider或Consumer配置

dubbo:
  application:
    name: dubbo-provider
  registry:
    address: zookeeper://192.168.32.128:2181
  protocol:
    port: 20884
  provider:
  # 配置当前应用中所有Provider的默认负载均衡策略,如果注解定义了其他负载均衡策略,局部优先
    loadbalance: random
  consumer:
  # 配置当前应用中所有Consumer的默认负载均衡策略
    loadbalance: random

常用注解

@EnableDubbo

使用Dubbo。启动类,必须要有@EnableDubbo注解,否则Dubbo不生效。

@DubboService

从2.7.7版本开始,Dubbo的**@Service注解过时,提供新注解@DubboService**

注解功能:在Spring容器启动的时候,创建bean对象。并拼接一个URL保存到指定的注册中心

Dubbo自定义了注解Service,用于服务注册过程,注意导包,不要和Spring的Service注解混淆功能和Dubbo的Service注解完全一致

DubboService属性:

  • loadbalance 负载均衡策略

​ 当前服务采用的负载均衡算法, loadbalance。代表,为Provider集群定义负载均衡策略

​ 示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)

  • group 分组

​ 默认环境中,Dubbo的Provider是不分组的

​ 示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)

​ 可以指定服务分组。目的,多客户端并行生效;多服务端分组管理。,商业开发中,服务都需要分组。

​ 当服务端将Provider分组后,消费端的Consumer必须要定位的分组,否则会抛出异常,IllegalStateException, 检查Provider状态发生异常。

  • version 版本

​ 默认环境中,Dubbo的Provider是没有版本

​ 示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)

​ 可以设定版本,目的是多个版本并行提供服务,商业开发中,服务需要版本。代表服务的升级,迭代。

​ 当服务端Provider定义版本后,消费端引用的consumer必须指定要定位的版本。否则抛出异常: IllegalStateException, 检查Provider状态发生异常。

@DubboReference

在2.7.7以前版本,使用**@Reference注解, 2.7.7使用@DubboReference**注解

注解功能:访问注册中心,获取URI统一资源路径,并创建代理对象。

DubboReference属性:

  • loadbalance 负载均衡策略

    当前服务采用的负载均衡算法,示例:@Reference(loadbalance = “roundrobin”)

    ​ loadbalance。代表,为集群定义负载均衡策略

  • group 分组

​ 默认环境中,Dubbo的Provider是不分组的

​ 示例:@DubboReference(group = “firstGroup”, version = “1.0.1”)

​ 可以指定服务分组。目的,多客户端并行生效;多服务端分组管理。,商业开发中,服务都需要分组。

​ 当服务端将Provider分组后,消费端的Consumer必须要定位的分组,否则会抛出异常,IllegalStateException, 检查Provider状态发生异常。

  • version 版本

​ 默认环境中,Dubbo的Provider是没有版本

​ 示例:@DubboReference(group = “userGroup”, version = “1.0”)

​ 可以设定版本,目的是多个版本并行提供服务,商业开发中,服务需要版本。代表服务的升级,迭代。

​ 当服务端Provider定义版本后,消费端引用的consumer必须指定要定位的版本。否则抛出异常: IllegalStateException, 检查Provider状态发生异常。

Dubbo文件配置

dubbo:
  application:
    name: first-dubbo-consumer
  registry:
    address: zookeeper://192.168.1.179:2181
    timeout: 10000
  provider:
    loadbalance: random # 配置当前应用中所有的Provider的默认负载均衡策略。如果注解定义其他负载均衡策略,局部优先。
  consumer:
    loadbalance: roundrobin # 配置当前应用中所有的Consumer的默认负载均衡策略。
    # 幂等性操作(多次访问对结果无影响),可以配置>0。在非幂等性操作(多次访问对,结果由影响,如增删改操作),配置为0。
    # 设计服务的时候,一般,会读写分离。
    retries: 2 # 重试次数,默认为2。Provider因网络问题,无响应,消费端自动重新请求。
    
dubbo:
  registry:
    address: zookeeper://192.168.1.179:2181
    timeout: 10000 #连接多长时间超时 
  application:
    name: first-dubbo-provider   # 定义一个服务的名称。如果多个启动的服务进程命名一致,自动组成集群。
  protocol:
    name: dubbo  # 协议,默认dubbo。 注意,两个配置的默认值是配套的。不要只为一个配置做新的赋值
    port: 20881  # 端口,默认20880
  provider:
  	# payload指请求容量和响应容量的限制,默认限制为8M,8388608字节
  	# 也就是,请求头+请求体容量必须小于8M。响应头+响应体容量必须小于8M。
  	# 只能在配置文件中进行配置,只要配置了,请求和响应的容量同步变更。
    payload: 83886080
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值