前言:如果你的系统基于SOA(面向服务)的架构,就必须实现两个 子系统之间的远程通信
问题:如何实现子系统之间的远程通信?
解决办法:
1、WebService:效率不高,基于soap协议,项目中不建议使用。多用于跨语言跨平台之间的通信,比如两个公司之间的通信。
2、restful形式的服务:http+json 可以使用springMVC或者cxf 实现,就是一个风格、一种形式(URL中包含一些参数,并且 URL是没有后缀),本质其实就是get请求传json数据。缺点: 如果服务太多,服务之间调用关系混乱,需要治理服务。
3、Dubbo:基于rpc协议进行远程通信,底层使用socket通信, 传输效率高。具有服务的治理工具(注册中心)进行统一管理, 并且可以统计出系统之间的调用关系、调用次数。
一、Dubbo
1、dubbo是什么
百度百科给出的定义:Dubbo是一个开源的高性能优秀 的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和spring框架无缝集成。
2、走进dubbo
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应 用架构已无法应对,分布式服务架构以及流动计算架构势在必 行,亟需一个治理系统确保架构有条不紊的演进。
dubbo官网给出的一张图:
·单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
·垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
·分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
·流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
Dubbo就是资源调度和治理中心的管理工具。
3、Dubbo的架构
节点角色说明:
Provider:暴露服务的服务提供方。
Consumer:调用远程服务的服务消费方。
Registry:服务注册与发现的注册中心(类似于房产中介的作用)。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器(在这里其实就是指的spring)。
调用关系说明:
(0). 服务容器负责启动,加载,运行服务提供者。也就是说当我们初始化一个spring容器的时候,服务就发布了。
(1). 服务提供者在启动时,向注册中心注册自己提供的服务。
(2). 服务消费者在启动时,向注册中心订阅自己所需的服务。
(3). 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(4). 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
(5). 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
4、使用方法
其实dubbo就是几个jar包,需要我们服务端加入dubbo jar包来发布服务,客户端如果需要调用服务端分布的服务,肯定也需要dubbo的jar包。至于注册中心是一个独立的服务,因此还需要zookeeper作为注册中心。
二、注册中心
1、Zookeeper
(动物园管理员,也可以作为集群管理工具)当然注册中心也不定非得使用Zookeeper,也可以是redis,官方推 荐使用Zookeeper
2、Zookeeper的安装:
Zookeeper是Apacahe Hadoop的子项目,一般Apacahe底下都是java开发,包括Zookeeper。因此A、安装Zookeeper 之前需要安装jdk,B、跨平台的,windows、linux下安装都可以
安装步骤:
第一步:安装jdk
第二步:把zookeeper的压缩包上传到linux系统。
第三步:解压缩压缩包 tar -zxvf zookeeper-3.4.6.tar.gz
第四步:进入zookeeper-3.4.6目录,创建data文件夹。
第五步:进入conf目录,将zoo_sample.cfg改名为zoo.cfg [root@localhost conf]# mv zoo_sample.cfg zoo.cfg
第六步:使用vim编辑zoo.cfg,修改dataDir属性:dataDir=/root/zookeeper-3.4.6/data
第七步:进入bin目录,启动zookeeper [root@localhost bin]# ./zkServer.sh start
关闭zookeeper :[root@localhost bin]# ./zkServer.sh stop
查看状态:[root@localhost bin]# ./zkServer.sh status
注意:需要关闭防火墙。
三、发布、引用服务(Spring整合)
1、加入dubbo相关的jar包、zookeeper的jar包以及zookeeper的客户端jar、引入约束
2、发布服务<dubbo:service>:容器启动的时候自动发布服务
<!-- 和本地服务一样实现远程服务 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
具体事例:<dubbo:application name="xxx"/>在注册中心登记的时候的名字(一般就是工程名)
<dubbo:registry protocol="zookeeper" address="ip+端口(2181)" />链接注册中心就得知道注册中心的地址
<dubbo:protocol name="dubbo" port="20880" />使用dubbo协议暴露服务,服务自己的端口号(20880)
<dubbo:service interface="xxx" ref="xxxImpl" />
3、引用服务<dubbo:reference>
<!-- 增加引用远程服务配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服务一样使用远程服务 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
具体事例:
<dubbo:application name="xxx"/>
<dubbo:registry protocol="zookeeper" address="ip+端口"/>
<dubbo:reference interface="xxx" id="xxx" />
注意:引入接口jar包