dubbox功能演示

China☆狼群 提交于 2019-11-29 19:22:16

dubbox功能演示

通过以下内容介绍dubbox框架。

  • dubbo是什么
  • dubbox又是什么
  • dubbo能做什么
  • dubbo框架设计
  • dubbo服务调用过程

1. dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

2. dubbox又是什么

Dubbox now means Dubbo eXtensions. If you know java, javax and dubbo, you know what dubbox is :)。当当网根据自身的需求,为Dubbo实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions)。升级和提供的功能列表:

  • 支持REST风格远程调用(HTTP + JSON/XML)

    输入图片说明

  • 支持基于Kryo和FST的Java高效序列化实现

  • 支持基于Jackson的JSON序列化

  • 支持基于嵌入式Tomcat的HTTP remoting体系

  • 升级Spring

  • 升级ZooKeeper客户端

  • 支持完全基于Java代码的Dubbo配置

  • ......

3. dubbo能做什么

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

4. dubbo框架设计

整体设计图: 输入图片说明

各层说明:

  • 服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
  • config,配置层,对外配置接口,以ServiceConfig, ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类
  • proxy,服务代理层,服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory
  • registry,注册中心层,封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory, Registry, RegistryService
  • cluster,路由层,封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster, Directory, Router, LoadBalance
  • monitor,监控层,RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory, Monitor, MonitorService
  • protocol,远程调用层,封将RPC调用,以Invocation, Result为中心,扩展接口为Protocol, Invoker, Exporter
  • exchange,信息交换层,封装请求响应模式,同步转异步,以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
  • transport,网络传输层,抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel, Transporter, Client, Server, Codec
  • serialize,数据序列化层,可复用的一些工具,扩展接口为Serialization, ObjectInput, ObjectOutput, ThreadPool

5. dubbo服务调用过程

服务提供方和服务消费方之间的调用关系,如图所示: 输入图片说明

图例说明:

  • 图中小方块Protocol, Cluster, Proxy, Service, Container, Registry, Monitor代表层或模块,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。
  • 图中背景方块Consumer, Provider, Registry, Monitor代表部署逻辑拓普节点。
  • 图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
  • 图中只包含RPC的层,不包含Remoting的层,Remoting整体都隐含在Protocol中。

6.应用配置项使用说明

6.1. 应用配置项的介绍

应用配置项主要使用:

<dubbo:application/> 

应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。配置项如下图: dubbo application 一个简单的实例:

<dubbo:application name="demo-provider" 
    				   owner="programmer" 
    				   organization="dubbox"
    				   version="1.0.0"
    				   environment="product"
    				   compiler="javassist"
    				   logger="slf4j"
    				   />

注意:如果同一个应用部署多个实例建议name配置项变更,如: name="demo-provider1" ,name="demo-provider2" ,......,name="demo-providern"

服务启动后查看注册中心(稍后介绍)注册服务地址(格式有所调整)为:

com.alibaba.dubbo.demo.user.UserService?
anyhost=true&
application=demo-provider&
application.version=1.0.0&
compiler=javassist&
dubbo=2.0.0&
environment=product&
generic=false&
group=xmlConfig&
interface=com.alibaba.dubbo.demo.user.UserService&
logger=slf4j&
methods=getUser,registerUser&
optimizer=com.alibaba.dubbo.demo.SerializationOptimizerImpl&
organization=dubbox&
owner=programmer&
pid=6116&
serialization=kryo&
side=provider
×tamp=1477272042362

6.2. 注册中心配置

应用配置项主要使用:

<dubbo:registry  /> 

注册中心配置;配置项如下图: registry 一个简单的实例:

<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

所有的服务就注册到zookeeper上了。 使用时需要在provider和consumer中增加zookeeper客户端jar包依赖:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

支持zkclient和curator两种Zookeeper客户端实现:从2.2.0版本开始缺省为zkclient实现。需要添加一下依赖:

<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

从2.3.0版本开始支持可选curator实现。如果需要改为curator实现,请配置:

<dubbo:registry ... client="curator" />

或:

dubbo.registry.client=curator

或:

zookeeper://10.20.153.10:2181?client=curator

需依赖:

<dependency>
    <groupId>com.netflix.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.5.0</version>
</dependency>

Zookeeper单机配置:

<dubbo:registry address="zookeeper://10.20.153.10:2181" />

or:

<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" />

Zookeeper集群配置:

<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />

Or:

<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />

6.3. 服务提供者协议配置

服务提供者应用配置项主要使用:

<dubbo:protocol /> 

服务提供者协议配置,说明:如果需要支持多协议,可以声明多个dubbo:protocol标签,并在dubbo:service中通过protocol属性指定使用的协议。配置项如下图: 输入图片说明输入图片说明

一个简单的实例:

<dubbo:protocol name="dubbo" serialization="kryo" optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>

另一个:

<dubbo:protocol name="rest" port="8888" threads="500" contextpath="services" server="tomcat" accepts="500"
                    extension="com.alibaba.dubbo.demo.extension.TraceInterceptor,
                    com.alibaba.dubbo.demo.extension.TraceFilter,
                    com.alibaba.dubbo.demo.extension.ClientTraceFilter,
                    com.alibaba.dubbo.demo.extension.DynamicTraceBinding,
                    com.alibaba.dubbo.demo.extension.CustomExceptionMapper,
                    com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>

注意:配置项port建议显示配置、最好将配置添加到配置文件中(dubbo.perties)中。部署集群多个实例时一定要修改port端口,避免端口重复引起服务启动失败。

6.4. 服务提供者缺省值配置

服务提供者配置项主要使用:

<dubbo:provider/> 

说明:该标签为dubbo:servicedubbo:protocol标签的缺省值设置。 部分配置项如下图: provider 配置项都可可选的、因此在使用过程中可以不配置。

6.5. 服务提供者缺省值配置

服务提供者配置项主要使用:

<dubbo:consumer/>

说明:该标签为dubbo:reference标签的缺省值设置。 部分配置项如下图: consumer 配置项都可可选的、因此在使用过程中可以不配置。

6.6 监控配置项

服务监控配置项配置如下图: 输入图片说明

前提需要部署监控程序。监控程序部署在服务治理、监控使用说明中有介绍。

6.7 服务提供者暴露服务配置

服务提供者暴露服务配置部分配置项: 输入图片说明 两个必须的配置项:

  • interface
  • ref 一个简单的实例:
 <dubbo:service interface="com.xdja.hysyb.rpc.api.user.IUserService" 
    			   ref="userService"  
    			   protocol="dubbo" 
    			   /><!-- group="xmlConfig" -->

	<dubbo:service interface="com.xdja.hysyb.rpc.api.user.facade.IUserRestService" 
				   ref="userRestService"  
				   protocol="rest" 
				   validation="true"/>

前期可以先了解简单配置、高级特性等了解完毕后再做使用。

6.8 服务消费者引用服务配置

服务消费者引用服务配置部分配置项: 输入图片说明

注意两个必填项目:

  • id 引用服务名称唯一标识
  • interface 引用服务接口类

一个简单的实例:

 <dubbo:reference id="userRestService"  check="true"
    				 interface="com.xdja.hysyb.rpc.api.user.facade.IUserRestService"/>
    <dubbo:reference id="userService"  check="true"
    				 interface="com.xdja.hysyb.rpc.api.user.IUserService" />

6.9 其他一些配置项

其他一些配置项请参考: http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C

7.简单实例配置使用说明

源代码结构如下图:

输入图片说明

项目名称 介绍
soa-api 接口定义(定义服务的接口)
soa-parent 生产服务、消费服务程序父项目结构
soa-consumer 消费服务端项目
soa-provider 生产服务端项目

7.1 启动生产者服务

soa-provider 项目的测试包下找到如下类: test.com.xdja.hysyb.rpc.api.impl.user.DemoProvider 直接运行main方法。 如果出现以下:

信息: Starting ProtocolHandler ["http-nio-8888"]
[2016-11-04 16:37:09] Dubbo service server started!

启动成功在本机8888端口。

7.2 测试消费端服务

因为生产端发布的有rest服务和dubbo服务、rest服务可以直接通过浏览器模拟测试:

7.2.1 rest协议服务测试

浏览器直接输入:

http://localhost:8888/services/users/1.json

运行效果图: 输入图片说明

7.2.2 dubbo协议服务测试

soa-consumer项目的测试包下找到如下类: test.com.xdja.hysyb.rpc.demo.user.DemoConsumer 运行在控制台查看效果如下:

[ConstraintViolationImpl{interpolatedMessage='User ID must be greater than 1', propertyPath=getUserArgument0, rootBeanClass=class com.xdja.hysyb.rpc.api.user.facade.IUserRestService_GetUserParameter, messageTemplate='User ID must be greater than 1'}]
Client request filter invoked
[04/11/16 04:45:42:042 CST] main  INFO support.LoggingFilter:  [DUBBO] The HTTP headers are: 
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Content-Type: application/json
, dubbo version: 2.8.4, current host: 192.168.18.113
Writer interceptor invoked
Dynamic writer interceptor invoked
[04/11/16 04:45:42:042 CST] main  INFO support.LoggingFilter:  [DUBBO] The contents of response body is: 
{"id":1,"username":"zhangyq"}
, dubbo version: 2.8.4, current host: 192.168.18.113
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!