欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dubbo要怎么基础使用入门,一起看看这篇文章把!

程序员文章站 2022-03-14 16:37:56
...
0x00 概述

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
1、远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2、集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3、自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

总体流程图

Dubbo要怎么基础使用入门,一起看看这篇文章把!
注:图片来源于apache官方仓库

0x01 dubbo配置方式
xml配置方式

dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        
    http://www.springframework.org/schema/beans/spring-beans.xsd        
    http://code.alibabatech.com/schema/dubbo        
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="xxx"  />
 
    <!-- 使用multicast广播注册中心暴露服务地址 -->
   <!--  <dubbo:registry address="multicast://xx.xxx.xxx.xx:1234" /> -->
 
     <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://xx.xxxx.xx:2181" />
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 声明需要暴露的服务接口(注意是接口,不是实现类) -->
    <dubbo:service interface="完整包路径" ref="对象名" />
    
    <!-- 这里是具体实现类,id和上面的暴露的服务接口ref要一致,dubbo就是通过这个来注册对应的服务 -->
    <bean id="对象名" class="实现类的包路径"></bean>
    
</beans>

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo        
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="dubbo-consumer"/>
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
    <dubbo:registry address="zookeeper://xxx.xx.xx:2181" />
    <!-- 生成远程服务代理,可以和本地bean一样调用 -->
    <dubbo:reference id="对象名" interface="完整包路径" />
</beans>
注解配置

provider(生产者)
@Service // com.alibaba.dubbo.config.annotation.Service
@Component //注册为spring bean

若使用上面的dubbo的@Service注解,在Controller中需要使用@Reference注解来进行注入

在配置文件中进行相关配置(以yml为例子)

dubbo:
  application:
    name: user-service
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    port: 20880
    name: dubbo

启动类配置
使用@EnableDubbo
consumer(消费者)
使用 @Reference 进行引入

属性配置

如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器*享配置,那么,我们可以直接使用
dubbo.properties作为默认配置。

Dubbo可以自动加载classpath根目录下的dubbo.properties,但是你同样可以使用JVM参数来指定路径:-Ddubbo.properties.file=xxx.properties。

Java API配置

API使用范围说明:API 仅用于 OpenAPI, ESB, Test, Mock 等系统集成,普通服务提供方或消费方,请采用XML 配置方式使用 Dubbo
dubbo官方介绍:http://dubbo.apache.org/zh-cn/docs/user/configuration/api.html

常用的一般是xml配置

0x02 dubbo支持的通信协议

dubbo:// 默认缺省协议
采用单一长连接和NIO异步通讯,适合小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数。基于TCP,Hessian二进制序列化。

RMI:// 协议
采用JDK标准java.rmi.*实现,采用阻塞短链接和jdk标准序列化方式。采用标准二进制序列化,适合传入传出参数数据包大小混合,消费者和提供者个数差不多,可传文件,闯关远程服务方法调用,与原生RMI服务互相操作。

hessian:// 协议
Hessian协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作。适合页面传输,文件传输,或与原生hessian服务互操作。

http:// 协议
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现,传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件,需同时给应用程序和浏览器 JS 使用的服务

webservice:// 协议
基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现。可以和原生 WebService 服务互操作,系统集成,跨语言调用

thrift:// 协议
当前 dubbo 支持 1的 thrift 协议是对 thrift 原生协议 2 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。

rest:// 协议
类似restful风格

缓存协议
memcached:基于 memcached 实现的 RPC 协议 。
redis:基于 Redis 实现的 RPC 协议 。

0x03 负载均衡策略(面试考的呀~)

dubbo内置4中负载均衡策略,默认使用的是random随机调调用策略

Random LoadBalance(随机负载均衡)
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
实现思路:如果服务多实例权重相同,则进行随机调用;如果权重不同,按照总权重取随机数,根据总权重数生成一个随机数,然后和具体服务实例的权重进行相减做偏移量,然后找出偏移量小于0的,比如随机数为10,某一个服务实例的权重为12,那么10-12=-2<0成立,则该服务被调用,这种策略在随机的情况下尽可能保证权重大的服务会被随机调用。

RoundRobin LoadBalance(轮询模式)
按公约后的权重设置轮询比例。但存在响应慢的服务提供者会累积请求
实现思路:首先计算出多服务实例的最大最小权重,如果权重都一样(maxWeight=minWeight),则直接取模轮询;如果权重不一样,每一轮调用,都计算出一个基础的权重值,然后筛选出权重值大于基础权重值得invoker进行取模随机调用。

LeastActiveLoadBalance(最小活跃数调用)
dubbo框架自定义了一个Filter,用于计算服务被调用的次数
实现思路:首先查找最小活跃数的服务并统计权重和出现的频次,如果最小活跃次数只出现一次,直接使用该服务;如果出现多次且权重不相同,则按照总权重数随机;如果出现多次且权重相同,则随机调用

ConsistentHashLoadBalance(一致性hash)
一致性Hash负载均衡涉及到两个主要的配置参数为hash.arguments 与hash.nodes。根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者,若服务挂了,则会基于虚拟节点平摊到其他提供者上。
hash.arguments : 当进行调用时候根据调用方法的哪几个参数生成key,并根据key来通过一致性hash算法来选择调用结点
hash.nodes: 为结点的副本数。

相关标签: 积累