Dubbo要怎么基础使用入门,一起看看这篇文章把!
0x00 概述
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
1、远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2、集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3、自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
总体流程图
注:图片来源于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: 为结点的副本数。
上一篇: 3 个不可思议的 Python 返回值
下一篇: Java8新特性——stream表达