Dubbo前言
单一应用访问服务
使用独立应用访问服务
RPC
(1)协议
协议指多方共同遵循的规范,在网络中的计算机进行数据交换依靠各种协议。例如 http, ftp 等。
一台计算机按规定好的格式发送数据,另一台计算的程序按指定的格式接收数据,两台计算使用互相理解的格式读写数据。达到数据交换的目的。
(2)RPC-远程过程调用协议
RPC 是什么?
PRC 是 Remote Procedure Call Protocol ,称为:远程过程调用协议。是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。该协议允许运行于一台计算机的程序调用另一台计算机的程序。程序员无需编为网络交互功能编码。
RPC 的作用?
主要功能是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本 地调用的语义简洁性。在一台计算的程序使用其他计算机上的功能就是使用自己的功能一样。 RPC 技术提供了透明的访问其他服务的底层实现细节。使用分布式系统中的服务更加方便。
分布式?
分布式指多台计算机位于网络系统中,多台计算给形成一个整体对外界提供服务。用户使用系统不知道是多台计算机,使用不同的操作系统,不同的应用程序提供服务。
Dubbo简介
Dubbo 是一个高性能的,基于 java 的,开源 RPC 框架。
Dubbo 是一个框架
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案、服务治理方案。
Dubbo 是阿里巴巴服务化治理方案的核心框架,每天为 2,000+ 个服务提供
3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点
底层原理
Dubbo 的底层实现是动态代理, 由 Dubbo 框架创建远程服务(接口)对象的代理对象,通过代理对象调用远程方法。
dubbo支持的协议
2.2Dubbo 支持的协议
支持 8 种协议:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。 dubbu 官方推荐使用 dubbo 协议。dubbo 协议默认端口 20880
2.2.1Ddubbo 协议
A、Dubbo 协议特点
Dubbo 协议采用单一长连接和异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
B、 网络通信
Dubbo 协议底层网络通信默认使用的是 netty,性能非常优秀,官方推荐使用
C、 不适合的地方
Dubbo 协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低
D、使用 Dubbo 协议
<dubbo:protocol name=“dubbo” port=“20880” />
长连接和短连接
长连接和短连接接:
所谓长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发检测包。短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。
Dubbo的组件
点对点直连方式
dubbo需要的jar包
1、dubbo
2、spring-context //从容器中获取对象
3、netty //实现网络通信
4、log4j //日志
5、javassist //动态生成代理对象
服务提供者
1、只需要导出带有服务接口的接口的jar包。
服务器会动态生成代理对象javassist(类似于Mybatis),因此
不用采用硬编码的方式写Serviceimpl类。
2、编写xml文件
指定服务提供者名称
<dubbo:application name=“瞎写”/>
暴露提供的服务
<dubbo:service interface=“接口的全限定类名” ref=“ServiceImpl” protocol=“dubbo” registry=“N/A”/>
ref:实现服务接口的bean的id
protocol:访问服务使用的协议
registry:注册中心信息,N/A,采用点对点直连方式。
项目结构
服务消费者
服务消费者需要定义与服务接口有关的实体类,编写配置文件,唯一定位服务者。
1、编写xml文件
声明消费者的名称
<dubbo:application name=“瞎写”/>
声明使用的服务
<dubbo:reference id=“消费者Service对象的名称” interface=“服务接口的全限定类名” url=“dubbo://ip:端口”/>
服务提供者和服务消费者都有Service,提供者是接口,消费者是自己的Service,远程调用提供者的Service
在测试类中从容器中获取服务消费者Bean对象,通过注入方式远程调用服务提供者中的方法。
注意要先启动服务提供者,将web应用发布到tomcat上运行再运行Consume程序
项目结构
导出jar包
公共接口jar包
一个公司中有很多部门,很多服务,很多小组,一般都是出现任务了,部门将服务分派给小组进行,然后收集各个小组完成的数据。
不同小组负责不同的服务,有一个公共服务部门分发任务给小组,如果有很多服务,那么每个小组都会发过来一个公共接口jar,太多了,我们应该用一个公共接口包揽所有的接口jar包。
1、新建java项目,只定义接口和序列化的数据类,无需导入jar包。
导出包含所有接口的jar
2、服务提供者接口实现
编写xml文件
声明公共接口服务
<dubbo:application name="瞎写'/>
暴露提供的服务
<dubbo:service interface="接口的全限定类名" ref="实现类的id" protocol="dubbo" registry="N/A"/>
<dubbo:service interface="接口的全限定类名" ref="实现类的id" protocol="dubbo" registry="N/A"/>
服务消费者
声明消费者服务名称
<dubbo:application name="瞎写"/>
声明消费者使用的服务
<dubbo:reference id="消费者对接服务提供者的id,对应消费者远程调用方法的service类"
interface="服务提供者的接口的全限定类名"
url="dubbo://ip:端口"/>
测试类中以注入方式远程调用服务提供者中的方法。
dubbo常用标签
Dubbo 中常用标签。分为三个类别:公用标签,服务提供者标签,服务消费者标签
公用标签
<dubbo:application/> 和 <dubbo:registry/>
A、 配置应用信息
<dubbo:application name=”服务的名称”/>
B、 配置注册中心
<dubbo:registry address=”ip:port” protocol=”协议”/>
2.6.2服务提供者标签
A、配置访问服务提供者的协议信息
<dubbo:protocol name=”dubbo” port=”20880”/>
B、 配置暴露的服务
<dubbo:service interface=”服务接口名” ref=”服务实现对象 bean”>
2.6.3服务消费者
A、配置服务消费者引用远程服务
<dubbo:reference id=”服务引用 bean 的 id” interface=”服务接口名”/>
2.7常用配置项目
check , retries 等
2.7.1关闭检查 check
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring初始化完成,以便上线时,能及早发现问题,默认 check=true。通过 check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
例 1:关闭某个服务的启动时检查
<dubbo:reference interface="com.foo.BarService" check="false" />
例 2:关闭注册中心启动时检查
<dubbo:registry check=“false” />
默认启动服务时检查注册中心存在并已运行。不启动报错。
2.7.2请求重试 retries
远程服务调用重试次数,不包括第一次调用,默认是 2 次。 加上第一次共 3 次。
<dubbo:reference retries=”5”>
注册中心
见文件pdf
服务提供者
新建项目,在原来的jar包基础上加入zookeeper 的jar包
修改spring配置文件
加入注册中心<dubbo:registry address="zookeeper://ip:端口号"/>
去掉<dubbo:service >中的protocol="dubbo" registry="N/A"
服务消费者
新建项目,在原来的jar包基础上加入zookeeper 的jar包
修改 dubbo-consume.xml
1)加入注册中心:<dubbo:registry address="zookeeper://ip:端口" />
2)去掉<dubbo:reference>
中 url=“dubbo://ip:端口”/>
运行顺序:
先运行zookeeper注册中心,再启动服务提供者,最后运行服务消费者。因为服务提供者要向Zookeeper注册服务,服务消费者需要在Zookeeper中查找使用的服务。
监控中心
dubbo 的使用,其实只需要有注册中心,消费者,提供者这三个就可以使用了,但是并不能看到有哪些消费者和提供者,为了更好的调试,发现问题,解决问题,因此引入 dubbo-admin。通过 dubbo-admin 可以对消费者和提供者进行管理。可以在 dubbo 应用部署做动态的调整,服务的管理。
负载均衡
集群:集群是一种计算机系统,是一种服务器结构。把一组多个计算机,包括硬件和软件组织在一个网络中。相互连接起来共同完成某个工作。对用户来说使用的是一个计算机,集群对用户是透明的。
负载均衡:负载均衡是以集群为前提的。英文名称为 Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行。
对于网络应用而言,并不是一开始就需要负载均衡,当网络应用的访问量不断增长,单个处理单元无法满足负载需求时,网络应用流量将要出现瓶颈时,负载均衡才会起到作用。一般通过一个或者多个前端负载均衡器,将工作负载分发到后端的一组服务器上,从而达到整个系统的高性能和高可用性。
负载均衡有两方面的含义:首先,单个重负载的工作分配到多台服务器做并行处理,每个服务器处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高,这是集群
(cluster)技术带来的优势。第二层含义是:大量的并发访问或数据流量分担到多台服务器分别处理,减少用户等待响应的时间。每个访问分配给不同的服务器处理。
Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
A、Random LoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
B、 RoundRobin LoadBalance
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
C、 LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
D、ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。算法参见:http://en.wikipedia.org/wiki/Consistent_hashing。
缺省只对第一个参数 Hash,如果要修改,请配置<dubbo:parameter key=“hash.arguments” value=“0,1” />
5.1.2配置方式:
<dubbo:service interface=“…” loadbalance=“roundrobin” />
或
<dubbo:reference interface=“…” loadbalance=“roundrobin” />
随机:loadbalance=” random”
轮询:loadbalance=” roundrobin”
最少活跃:loadbalance=” leastactive”
一致性 Hash:loadbalance=” consistenthash”