为什么要用远程通讯
在大部分的web程序中,表现层和服务层是分开的(为什么分开不做讨论),这时就需要进行远程通讯了
为什么不用其他的远程通讯非要用dubbo?
- webservice : 只要是用在web的聊天端,用在此处效率不高,而且是基于soap协议的,此处不推荐使用
- restful 形式的服务,http+json ,几乎每个接口都是这样的,如果这样会造成服务之间的关系混乱,需要治疗服务。
- 使用dubbo 服务,使用rpc 协议进行远程调用,直接使用socket通讯,传输效率高,并且可以统计出调用关系,调用次数等
web 服务的演变
- 1、开始为单一的服务应用架构
- 2、垂直应用架构
- 3、分布式服务架构
- 4、流动计算架构(soa)
dubbo的架构
image.png节点角色说明:
- provider:暴露服务的服务提供方
- consumer:调用服务的远程服务消费方
- registry:服务注册于发现的注册中心
- monitor:统计服务的调用次调和调用时间的监控中心
- containcer:服务运行容器
调用关系说明: - 0、服务容器负责启动,加载,运行服务提供者;
- 1、服务提供者在启动时,向注册中心注册自己提供的服务;
- 2、服务消费者在启动时,向注册中心订阅自己所需的服务;
- 3、注册中心返回服务提供者地址给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,在选另一台调用
- 5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据给监控中心
代码示例
- 服务提供方:
<!-- 使用dubbo发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="e3-manager" />
<dubbo:registry protocol="zookeeper"
address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="cn.e3mall.service.ItemService" ref="itemServiceImpl" />
- 服务消费方
<!-- 引用dubbo服务 -->
<dubbo:application name="e3-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"/>
<dubbo:reference interface="cn.e3mall.service.ItemService" id="itemService" />
网友评论