dubbo使用笔记

最近在研究github的这个项目=> https://github.com/shuzheng/zheng
将其中关于dubbo的使用做一下笔记,方便下次使用。

一、dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
戳这里查看具体介绍https://blog.csdn.net/houshaolin/article/details/76408399

节点角色说明:

Provider: 暴露服务的服务提供方;

Consumer: 调用远程服务的服务消费方;

Registry: 服务注册与发现的注册中心;

Monitor: 统计服务的调用次数和调用时间的监控中心;

Container: 服务运行容器

二、zookepper

zookeeper就相当于上图中的Registry节点(当然,也不一定只能用zookeeper作为注册中心,比如阿里巴巴内部就没有采用zookeeper作为注册中心,而是使用自己实现的基于数据库的注册中心,zookeeper注册中心并没有在阿里内部长时间运行的可靠性保障,此zookeeper桥接实现只为开源版本提供,其可靠性依赖于zookeeper本身的可靠性。),担任注册中心的角色,可以实现集群及负载均衡。

(图片出处:https://www.zhihu.com/question/25070185

流程:

  1. 服务提供者启动时向/dubbo/com.foo.BarService/providers目录下写入URL;
  2. 服务消费者启动时订阅/dubbo/com.foo.BarService/providers目录下的URL, 向/dubbo/com.foo.BarService/consumers目录下写入自己的URL;
  3. 监控中心启动时订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL。

支持一下功能:

  1. 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息;
  2. 当注册中心重启时,能自动恢复注册数据,以及订阅请求;
  3. 当会话过期时,能自动恢复注册数据,以及订阅请求;
  4. 当设置时,记录失败注册和订阅请求,后台定时重试。
  5. 可通过设置zookeeper登录信息;
  6. 可通过 设置zookeeper的根节点,不设置使用默认根节点;
  7. 支持*号通配符,可订阅服务的所有分组和所有版本的提供者。

下载zookeeper,直接解压,采用默认配置即可,下载地址 => http://www.apache.org/dyn/closer.cgi/zookeeper/

启动方式:双击bin\zkServer.cmd文件启动注册中心服务

三、dubbo 实例

1、服务提供方代码

1.1 定义service(其他接口定义省略)

@Service
@Transactional
@BaseService
public class UpmsOrganizationServiceImpl extends BaseServiceImpl<UpmsOrganizationMapper, UpmsOrganization, UpmsOrganizationExample> implements UpmsOrganizationService {

    private static final Logger LOGGER = LoggerFactory.getLogger(UpmsOrganizationServiceImpl.class);

    @Autowired
    UpmsOrganizationMapper upmsOrganizationMapper;
 }

1.2 Spring-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="zheng-upms-rpc-service"/>

    <!-- zkserver在hosts文件定义了映射IP地址 -->
    <dubbo:registry address="zookeeper://zkserver:2181"/>

    <dubbo:protocol name="dubbo" port="20881"/>

    <dubbo:monitor protocol="registry"/>

    <!-- 组织 -->
    <bean id="upmsOrganizationService" class="com.zheng.upms.rpc.service.impl.UpmsOrganizationServiceImpl"/>
    <dubbo:service interface="com.zheng.upms.rpc.api.UpmsOrganizationService" ref="upmsOrganizationService" timeout="10000"/>

    <!-- .....此处省略其他提供服务的定义..... -->

</beans>

2、 服务消费方代码

2.1 spring-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="zheng-upms-server"/>

    <!-- 缓存文件 -->
    <dubbo:registry file="./zheng-upms-server-dubbo.cache" address="zookeeper://zkserver:2181"/>

    <!-- 订阅服务 -->
    <dubbo:consumer check="false"/>


    <!-- 组织 -->
    <dubbo:reference id="upmsOrganizationService" interface="com.zheng.upms.rpc.api.UpmsOrganizationService" mock="true"/>

    <!-- ...此处省略其他的订阅服务 -->

</beans>

注意

是配置了dubbo缓存文件
文件的路径,应用可以根据需要调整,保证这个文件不会在发布过程中被清除。如果有多个应用进程注意不要使用同一个文件,避免内容被覆盖。

这个文件会缓存:

  1. 注册中心的列表
  2. 服务提供者列表

有了这项配置后,当应用重启过程中,Dubbo注册中心不可用时则应用会从这个缓存文件读取服务提供者列表的信息,进一步保证应用可靠性。

2.2 消费方调用

如下方式注入后就可以当成自己的service一样调用了:

@Autowired
private UpmsOrganizationService upmsOrganizationService;

public String organization(@PathVariable("id") int id, ModelMap modelMap) {
    // 所有组织
    List<UpmsOrganization> upmsOrganizations = upmsOrganizationService.selectByExample(new UpmsOrganizationExample());

    // ..省略
    return "/manage/user/organization.jsp";
}

四、小结

dubbo内部是使用RPC进行远程调用的,这里还要提到MQ(比如activemq)消息中间件,也能完成发布订阅的服务。两者在使用起来肯定是有差别的,我个人理解,或许还有偏差,欢迎指正!

  1. dubbo一般应用于程序之间的调用,比如我有两个项目A和项目B, 两者之间的相互调用,有利于解耦,并且更加有利于分布式部署,能够通过增加服务提供方提供处理能力;
  2. activemq的发布订阅一般应用于服务之间的调用,比如一个电商系统中,用户A下单的成功后,需要将数据写入数据库,然后返回成功消息给用户A,如果用户量非常大的情况下,写入数据库这一步骤就会耗费很多时间,导致用户等待的响应时间变成,用户体验变差。而activemq就可以利用发布订阅流程,将写入数据库这一步骤变成异步方式,当用户A下单成功,发布一条用户A下单成功的消息,并立即返回成功消息给用户,发布的消息会被订阅服务获取,并执行写入数据库的操作,这样用户响应时间就变短了。
本站总访问量