文档介绍:Sumpay SOA治理方案探讨
2014-04-04
陈涛
内部资料禁止外传
问题
1、服务的暴露和部署
需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明化。
2、需要部署多少机器?什么时候该加机器?
需要一个监控中心:每个服务的调用量、响应时间等统计指标。需要一个注册中心集群,保证高可用性。
需要一个管理后台,对负载、权重等进行配置。
3、负载均衡
允许动态调整权重
内部资料禁止外传
Dubbo架构
内部资料禁止外传
职能
1、注册中心:负责服务地址的注册与查找,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
2、监控中心:负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
3、服务提供者:向注册中心注册其提供的服务,并汇报调用时间到监控中心。服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
4、服务消费者:向注册中心获取服务提供者地址列表;并根据负载算法直接调用提供者;汇报调用时间到监控中心
5、注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
6、宕机:注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者;注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。
7、注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
内部资料禁止外传
Dubbo部署
内部资料禁止外传
内部资料禁止外传
缺省主机端口与协议相关:
支持协议
dubbo: 20880(长连接)
rmi: 1099
http: 80
hessian: 80
webservice: 80
memcached: 11211
redis: 6379
内部资料禁止外传
原理:
服务提供方
停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。
然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
服务消费方
停止时,不再发起新的调用请求,所有新的调用在客户端即报错。
然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
优雅停机
内部资料禁止外传
<!--暴露服务-->
<bean id=“xxxService” class=“”/>
<dubbo:service interface=“” ref=“xxxService”/>
配置方式:服务的暴露和引用
<!-- 增加引用远程服务配置-->
<dubbo:reference id=“xxxService” interface=“”/>
<bean id=“xxxAction” class=“<property name=“xxxService” ref=“xxxService”/>
</bean>
!!侵入性:Dubbo采用全Spring配置方式,
透明化接入应用,对应用没有任何API侵入
内部资料禁止外传
<?xml version="" encoding="UTF-8"?>
<beans xmlns="ema/beans"
xmlns:xsi="1/XMLSchema-instance"
xmlns:dubbo="http://code./schema/dubbo"
xsi:schemaLocation="ema/beans
ema/beans/spring-
http://code./schema/dubbo
http://code./schema/dubbo/">
<!-- 提供方应用信息,用于计算依赖关系-->
<dubbo:application name="hello-world-app" />
<!-- 使用multicast广播注册中心暴露服务地址-->
<dubbo:registry address="multicast://:1234" />
<!-- 用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口-->
<dubbo:service interface="