Dubbo分布式服务框架

来源:互联网 发布:优酷网络电影合作模式 编辑:程序博客网 时间:2024/04/27 14:32
     
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
原创粉丝点击