开源微服务架构DubboX方超目录Dubbo是什么Dubbo怎么用Dubbo怎么实现的Dubbo是什么Dubbo是什么?•Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Dubbo有何特点?•远程通讯:基于长连接的NIO框架抽象封装,提供多协议支持•集群容错:软负载均衡,失败容错,地址路由,动态配置等集群支持。•自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,支持平滑减少或增加机器为什么要使用DubboDubboX•支持REST风格远程调用(HTTP+JSON/XML):这个REST调用使得Dubbo可以对当今特别流行的“微服务”架构提供基础性支持。另外,REST调用也达到了比较高的性能,在基准测试下,HTTP+JSON与Dubbo2.x默认的RPC协议(即TCP+Hessian2二进制序列化)之间只有1.5倍左右的差距,详见文档中的基准测试报告。•支持基于Kryo和FST的Java高效序列化实现:基于当今比较知名的Kryo和FST高性能序列化库,为Dubbo默认的RPC协议添加新的序列化实现,并优化调整了其序列化体系,比较显著的提高了DubboRPC的性能,详见文档中的基准测试报告。•支持基于Jackson的JSON序列化:基于业界应用最广泛的Jackson序列化库,为Dubbo默认的RPC协议添加新的JSON序列化实现。•支持基于嵌入式Tomcat的HTTPremoting体系:基于嵌入式tomcat实现dubbo的HTTPremoting体系(即dubbo-remoting-http),用以逐步取代Dubbo中旧版本的嵌入式Jetty,可以显著的提高REST等的远程调用性能,并将ServletAPI的支持从2.5升级到3.1。DubboX•升级Spring:将dubbo中Spring由2.x升级到目前最常用的3.x版本,减少版本冲突带来的麻烦。•升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。•支持完全基于Java代码的Dubbo配置:基于Spring的JavaConfig,实现完全无XML的纯Java代码方式来配置dubbo•调整Demo应用:暂时将dubbo的demo应用调整并改写以主要演示REST功能、Dubbo协议的新序列化方式、基于Java代码的Spring配置等等。•修正了dubbo的bug包括配置、序列化、管理界面等等的bug。dubbo系统结构一个具体系统的实例Dubbo常用配置介绍•dubbo:service/服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。•dubbo:reference/引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。•dubbo:protocol/协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。•dubbo:application/应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。•dubbo:registry/注册中心配置,用于配置连接注册中心相关信息。•dubbo:method/方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。•dubbo:module/模块配置,用于配置当前模块信息,可选。•dubbo:monitor/监控中心配置,用于配置连接监控中心相关信息,可选。•dubbo:provider/提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。•dubbo:consumer/消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。Dubbo常用配置介绍(服务提供者)•配置应用程序名称dubbo:applicationname=dbaas-worker/•配置注册中心地址(重要)dubbo:registryprotocol=zookeeperaddress=127.0.0.1:2182/•注册中心支持以下4种类型•Zookeeper(目前在生产环境使用,需要安装zookeeper注册中心服务)•Redis(可用于生产)•Multicast(缺省配置,只适合测试环境,不能跨网段)•Simple(OnlyforTest)Dubbo常用配置介绍(服务提供者)•配置通讯协议(重要)!--用dubbo协议在20880端口暴露服务--dubbo:protocolname=“dubbo”port=“20880”serialization=“hessian2”threads=“100”register=“true”charset=“UTF-8”threadpool=“fixed”accepts=“1000“/•name协议名称:默认为dubbo,支持rmi,hessian2,http,ws,thrift,memcached,redis•port:暴露服务的端口号。(如何为-1表示随机产生端口号)•serialization:支持dubbo,hessian2,java,json默认为hessian2•register:该协议的服务是否注册到注册中心,默认为true•Threads服务线程池大小Dubbo常用配置介绍(服务提供者)•配置需要暴露的服务接口(重要)dubbo:serviceinterface=com.alibaba.dubbo.demo.DemoServiceref=demoService/常用可选项有:–retries:默认为2,如果不需要设置重试设为0–timeout:超时设置–executes:服务器端并发执行(或占用线程数)不超过设置个数–actives:每客户端并发执行(或占连接的请求数)不超过设置个数–deprecated:默认为false,如果需要设置服务过时,设置为true,消费者调用时会打印警告日志。–provider:指定provider,值为dubbo:provider的id属性Dubbo常用配置介绍(服务消费者)•配置应用程序名称•dubbo:applicationname=dbaas-coordinator/•配置注册中心(重要)dubbo:registryprotocol=zookeeperaddress=127.0.0.1:2182“/•配置远程服务代理dubbo:referenceid=demoServiceinterface=com.alibaba.dubbo.demo.DemoService/Dubbo怎么使用(服务提供者)接口定义接口实现服务提供者spring配置Dubbo怎么使用(服务消费者)服务消费者spring配置接口使用Dubbo架构介绍•节点角色说明•Provider:暴露服务的服务提供方。•Consumer:调用远程服务的服务消费方。•Registry:服务注册与发现的注册中心。•Container:服务运行容器。(e.g.)Spring•Monitor:统计服务的调用次调和调用时间的监控中心。Dubbo是怎么实现的DubboClusterDubbo“单机版”实现rpc需要解决的几个问题•序列化•传输•IDL接口描述语言实现rpc需要解决的几个问题Webservice是怎么处理这几个问题的•序列化:只能序列化基本数据类型、枚举及其组合•传输:webserver+http•IDL:xml描述的wsdl文件Dubbo是怎么实现序列化的•序列化–默认使用hessian2–提供高效版的Serializable–FST和Kryo•接口定义–定义Serialization接口–DataInput–DataOutput–ObjectInput–ObjectOutputDubbo是怎么实现传输的•数据传输,肯定是一个点(Endpoint)到另外一个点;两个点直接有一条管道(Channel);有处理管道的(channelHandler),也有编码的(Coderc)•第一次抽象接口Endpoint,Channel,Codec,ChannelHandlerDubbo是怎么实现传输的•数据传输中两个点不是对等的,一个是Server,一个是Client;数据有一个点到另外一个点需要Transporter来传输•有接口大多提供抽象类;AbstractEndpoint,AbstractClient,AbstractServer,AbstractChannel,TransportCodec•业务抽象后,就是具体实现netty,mina,xSocket–MinaServer,MinaClient,MinaChannel,MinaCodecAdapterDubbo是怎么实现交换的•RPC数据不仅仅是传输,还要交换(Exchange)•继承传输接口:ExchangeServer、ExchangeClient、ExchangeChannel、ExchangeHandler、ExchangeCodec•交换大多都有头,参考HTTP协议•通过Header的一组实现类:HeaderExchangeServer、HeaderExchangeClient、HeaderExchangeChannel、HeaderExchangeHandlerDubbo是怎么实现RPC•RPC本质是请求(Request),响应(Response)•远程调用要定规则(Protocol),有发布服务(Exporter),有使用服务(Invoker),怎么使用(Invocation),使用结果(Result)•默认实现类:DubboCodec、DubboExporter、DubboInvoker、DubboProtocol、LazyConnectExchangeClient、HeartBeatTaskDubboRPC模型DubboCluster更像是Dubbo在“单机“的基础上,加了扩展包Dubbo集群容错Dubbo负载均衡Dubbo总体结构服务治理界面谢谢!