dubbo系列三—架构

对于架构,我们将从两个层面来理解,一个是屏蔽了细节的使用层面,第二个是关注细节的实现层面。一个外在架构,一个内在的架构,如果我们仅仅是理解下并使用下,那么了解下外在架构就差不多了。而如果需要深入学习使用那么,仅仅了解外在是不够的,我们需要足够多的细节。

外在架构

image

dubbo 主要由三部分组成,服务提供方,服务消费方,注册中心。这是核心的部分,然后是一些外围系统诸如管理,监控等。

Provider :通过容器加载起来服务,然后通过协议将服务注册到注册中心,然后就等待消费方通过预订的协议来调用。

Consumer:消费方也需要向服务注册中心订阅服务,等注册中心将服务信息推送过来之后,消费方就可以透明的通过代理接口通过制定协议及序列化调用服务,并且服务可以是集群的。

Register:注册中心管理服务接口。

更加详细的流程见下图:

image

总结起来dubbo就是个集中管理的分布式服务框架。

架构分层

上述外在架构模型是相对直观,但是其呈现的实现细节较少,现在就来深入的看看其具体实现.

其实不管架构如何变化,其实现目前来说总是脱离不了如下几层:

核心:从上到下依次 1.暴露出来的业务服务接口 2.可选协议的(集群)远程调用3.封装好的网络通讯。

周边:1.服务接口配置管理 2. 服务治理及监控

外在框架其实会把服务接口这一层给讲明白了,同时附带了周边的内容。那么我们就详细看下其具体的分层结构及相互关系:

image

dubbo,框架的10层中分别提供了各自需要关心和扩展的接口,且可灵活的替换对接而不受影响。我们就只将核心的层进行下说明,其他层可以根据官方文档去理解,我们知道核心就是RPC调用及通讯,protocol 就是最核心的那一层,当然我们还要关心集群的实现以及网络通讯。

protocol: 封装了RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

transport:抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。可通过hession,dubbo协议进行序列化通信。

然后我们来看下远程调用的详细过程:

image

dubbo系列二—应用服务的编译安装

dubbo作为一个成熟RPC业务的框架,如果只是使用,那么我们只需要写一些服务,其他的一切诸如协议,通信等都交由dubbo处理即可。学习我们是从上往下学的,所以系列一 我们介绍其周边运维dubbo-admin,现在介绍一个简单的应用服务的编译安装。

编译

其实对于使用第三方的开源产品,有时候最头疼的就是安装编译,经常会缺点什么,环境这不对,那不对,出了问题因为不了解具体实现会比自己写的东西解决起来麻烦一点。那么在编译dubbo里面的示例,dubbo-demo 的时候碰到的最大问题就是各种依赖包找不到了,最终maven 设置文件中加入:

<mirror> <id>kafeitu</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://maven.kafeitu.me/nexus/content/repositories/public</url> </mirror> <mirror> <id>ibiblio.org</id> <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name> <url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url> <mirrorOf>*</mirrorOf> </mirror> <mirror> <id>lvu.cn</id> <name>lvu.cn</name> <url>http://lvu.cn/nexus/content/groups/public</url> <mirrorOf>*</mirrorOf> </mirror>

才顺利编译好了。

安装

历史的provider 服务跟 costomer 服务消费者都是jar包,其运行原理都是由dubbo里面的一个容器进行统一加载启动起来,当然我们也可以直接如测试中一样自己整个main 函数就把服务启动起来。其运行环境目录如下:

\bin:启动脚本 \conf:配置信息 \lib:包,包括自身及依赖包

还有就是修改下配置,配置成你想要的方式,如可以更换下注册中心等。

后记

有点JAVA基础的,那么其简单的使用及业务服务开发应该就已经学会了(还个数据库模块没放进来,这个放后面吧)。会用了后,接下来我们就来看看dubbo到底如何架构的吧。

dubbo系列一—dubbo-admin

dubbo是个分布式带有服务治理的服务框架,提供高性能的的RPC远程服务调用方案。是阿里巴巴开源的SOA核心框架。学习dubbo最快的上手方式我觉得是先学习其提供的基本例子,而dubbo-admin 就是部署管理这些dubbo服务的,可以提供我们最直观的感受。学习dubbo-admin就只要学习其安装及使用吧。同时zookeeper 作为注册中心为dubbo 提供高可用分布式集群。同时也是dubbo-admin提供管理服务的必要组件。

安装zookeeper

http://ibinguo.net/2014/12/28/zookeeper%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/

安装dubbo-admin

诸如dubbo官方的帮助文档进行安装,失败了,于是我就想直接下载源码编译好之后安装,发现了如下错误:

ERROR context.ContextLoader - Context initialization failed

经过查询https://github.com/alibaba/dubbo/issues/50,发现我的TOMCAT8,jdk8太新的缘故,最后也找到了解决方式:

1、webx的依赖改为3.1.6版;

    <dependency>
        <groupId>com.alibaba.citrus</groupId>
        <artifactId>citrus-webx-all</artifactId>
        <version>3.1.6</version>
    </dependency>

2、添加velocity的依赖,我用了1.7;

    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>

3、对依赖项dubbo添加exclusion,避免引入旧spring

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>${project.parent.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

4.修改项目属性

image

即可编译完成然后启动完成,当然启动dubbo-admin 前要先启动 zookeeper.

同时也修改了dubbo-admin的监听端口,因为跟zookeeper 的重复了,image