Dubbo分布式服务框架

     
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。说到RPC框架和SOA服务治理,还是从"淘宝技术这十年"听过并尝试着了解这一块的内容,Dubbo是阿里开源的RPC框架,与其类似的还有HSF,但是这个应该是阿里内部框架。


说到RPC之前,首先解释下什么是SOA(service orientied architecture)
        所谓SOA就是面向服务编程,通常我们所写的一个web项目都是分层设计,前端到后端的Http请求,首先到达后端的Controller层,然后Controller调用Service(例如:userService)进行我们所需要进行的操作进而返回我们所需要的数据(Service下面的Dao层就不着重介绍了),这样就完成了一次Web请求。
        而如果另外一个web项目也需要实现的功能和前面这个Web项目一样的userService功能,那我们是不是要在新项目中重新写一个一模一样的userService呢?如果这样写肯定会造成项目的冗余代码,该如何解决这种冗余呢?除了冗余的问题,这样的开发方式还有的一个问题是如果需要访问别人的Service,我们还需要别人的数据源和别人的数据库密码建立数据源,这样的方式很不符合一个大的团队。很自然我们会想到将一个产品下面的几个web项目中的服务(service)都集中放在一个地方,这几个web项目想要调用就直接到这个存放服务的地方去拿,这样我们写Controller就不需要关注底层服务(service)的实现,只需要关注Controller实现就可以了。如果需要维护代码,只需要改动service实现就可以了,所有web项目调用service代码完全不用改动,是不是和工厂模式很像呢?


上面抛出的问题是将所有service服务化(类似于Service工厂),对外开放,下面看一下Dubbo的架构(图来自Dubbo官网):



       从上图可以看到图中主要有几个重要的角色,一个是Consumer(消费端)、Provide(服务提供者)、Registry(注册中心,相当于我上文所说的Service工厂,开源的Registry一般有Zookeeper,Dubbo官网推荐的注册中心也是Zookeeper)。
       


下面就上面的UserService使用Dubbo举例说明:
        1、作为该服务的开发人员,首先需要设计UserService所对应的接口和具体的实现类UserServiceImpl,如果之前的开发我们可能只把UserService的实现类注册成Spring容器本地的Bean,但是这样只能本地或是本应用访问。这时候我们使用Dubbo作为Provide(服务提供者将UserService作为服务提供出去,注册到Zookeeper注册中心),这时候我们本地的UserService就不仅仅是本地的bean,还在注册中心注册了的UserService。
       2、而作为服务的使用者,当我们需要使用UserService,但是又不想自己开发的时候,这时候我们就可以去使用已经别的团队已经开发好并在Zookeeper上注册的UserService。在我们使用的时候,我们首先要连接到Zookeeper注册中心,然后咨询注册中心是不是有一个UserService注册,如果有该服务,那就返回暴露该服务的机器IP地址,然后通过源成RPC协议访问到具体的机器,进而访问到具体的功能,然后返回所需要的数据。


下面举例说明:(来自Dubbo官方使用文档)
本地服务:(Spring配置)

<bean id=“userService” class=“com.test.UserServiceImpl” />
 
<bean id=“userAction” class=“com.test.UserAction”>
    <property name=“userService” ref=“userService” />
</bean>



远程服务:(Spring配置)

在本地服务的基础上,只需做简单配置,即可完成远程化:


将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。
并在提供方增加暴露服务配置<dubbo:service>,在消费方增加引用服务配置<dubbo:reference>。
用Spring配置声明暴露服务:

<?xmlversion="1.0"encoding="UTF-8"?>
<beans>
 
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="hello-world-app" />
 
    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234"/>
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo"port="20880"/>
 
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService"ref="demoService"/>
 
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService"class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
 
</beans>

UserService开发方暴露服务:

<bean id=“userService” class=“com.test.UserServiceImpl” /> <!-- 和本地服务一样实现远程服务 --> 
<dubbo:service interface=“com.test.UserService” ref=“userService” /> <!-- 增加暴露远程服务配置 -->


第三方使用方调用UserService服务:

<dubbo:reference id=“userService” interface=“com.test.userService” /> <!-- 增加引用远程服务配置 -->
 
<bean id=“xxxAction” class=“com.xxx.XxxAction”> <!-- 和本地服务一样使用远程服务 -->
    <property name=“xxxService” ref=“xxxService” />
</bean>





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值