dubbo 2.5.3.jar 结合javassist-3.18.2-GA.jar校验出现javassist.CannotCompileException: cannot add

dubbo-User-Guide_学霸学习网
dubbo-User-Guide
DashboardDubboHome-zhUser Guide-zhBrowseLog In SearchAddAdded by 梁 飞, last edited by 梁 飞 on 一月 23, 2013 (view change)ToolsEnglish | 中文 首页 || 下载 || 用户指南 || 开发者指南 || 管理员指南 || 培训文档 || 常见问题解答 || 发布记录 || 发展路线 || 社区用户指南入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 直连提供者 只订阅Use our professional PDF creation service at http://www.htm2pdf.co.uk! 只注册 静态服务 多协议 多注册中心 服务分组 多版本 分组聚合 参数验证 结果缓存 泛化引用 泛化实现 回声测试 上下文信息 隐式传参 异步调用 本地调用 参数回调 事件通知 本地存根 本地伪装 延迟暴露 并发控制 连接控制 延迟连接 粘滞连接 令牌验证 路由规则 配置规则 服务降级 优雅停机 主机绑定 日志适配 访问日志 服务容器 Reference Config缓存 分布式事务 API参考手册 配置API 注解API 模型API 上下文API 服务API 配置参考手册Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:service/& &dubbo:reference/& &dubbo:protocol/& &dubbo:registry/& &dubbo:monitor/& &dubbo:application/& &dubbo:module/& &dubbo:provider/& &dubbo:consumer/& &dubbo:method/& &dubbo:argument/& &dubbo:parameter/& 协议参考手册 dubbo:// rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// 注册中心参考手册 Multicast 注册中心 Zookeeper注册中心 Redis 注册中心 Simple注册中心 Simple监控中心 Telnet 命令参考手册 ls ps cd pwd trace count invoke status log help clear exit Maven插件参考手册 mvn dubbo:registry mvn dubbo:createUse our professional PDF creation service at http://www.htm2pdf.co.uk! 服务化最佳实践 分包 粒度 版本 兼容性 枚举值 序列化 异常 调用 推荐用法 容量规划 基准测试工具包 性能测试报告 测试说明 测试环境 测试目的 测试脚本 测试结果 测试分析 测试覆盖率报告入门(+) (#)背景(#) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。 此时,用于简化增删改查工作量的 数据访问框架 (ORM) 是关键。 垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。 此时,用于加速前端页面开发的 Web框架 (MVC) 是关键。 分布式服务架构 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架 (RPC) 是关键。 流动计算架构 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率的 资源调度和治理中心 (SOA) 是关键。需求(#)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。 (1) 当服务越来越多时,服务 URL配置管理变得非常困难, F5硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。 并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。 (2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。 (3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。 其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数 反推总容量。 以上是Dubbo最基本的几个需求,更多服务治理问题参见: http://code.alibabatech.com/blog/experience_1402/service-governance-process.htmlUse our professional PDF creation service at http://www.htm2pdf.co.uk! 架构(#)节点角色说明: Provider: 暴露服务的服务提供方。 Consumer: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。 Monitor: 统计服务的调用次调和调用时间的监控中心。 Container: 服务运行容器。 调用关系说明: 0. 1. 2. 3. 4. 5. 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。(1) 连通性: 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销Use our professional PDF creation service at http://www.htm2pdf.co.uk! 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者 (2) 健状性: 监控中心宕掉不影响使用,只是丢失部分采样数据 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务 注册中心对等集群,任意一台宕掉后,将自动切换到另一台 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯 服务提供者无状态,任意一台宕掉后,不影响使用 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复 (3) 伸缩性: 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者 (4) 升级性: 当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力:Use our professional PDF creation service at http://www.htm2pdf.co.uk! Deployer: 自动部署服务的本地代理。 Repository: 仓库用于存储服务应用发布包。 Scheduler: 调度中心基于访问压力自动增减服务提供者。 Admin: 统一管理控制台。用法(#)本地服务: (Spring配置 )local.xml &bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /& &bean id=“xxxAction” class=“com.xxx.XxxAction”& &property name=“xxxService” ref=“xxxService” /&Use our professional PDF creation service at http://www.htm2pdf.co.uk! &property name=“xxxService” ref=“xxxService” /& &/bean&远程服务: (Spring配置 )在本地服务的基础上,只需做简单配置,即可完成远程化: 将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。 并在提供方增加暴露服务配置&dubbo:service& ,在消费方增加引用服务配置&dubbo:reference& 。 如下: remote-provider.xml &bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /& &!-- 和本地服务一样实现远程服务 --& &dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /& &!-- 增加暴露远程服务配置 --&remote-consumer.xml &dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /& &!-- 增加引用远程服务配置 --& &bean id=“xxxAction” class=“com.xxx.XxxAction”& &!-- 和本地服务一样使用远程服务 --& &property name=“xxxService” ref=“xxxService” /& &/bean&快速启动(+) (#) Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐),请参见:API配置 (+)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 服务提供者(#) 完整安装步骤,请参见:示例提供者安装 (+) 定义服务接口: (该接口需单独打包,在服务提供方和消费方共享) DemoService.java package com.alibaba.dubbo. public interface DemoService { String sayHello(String name); }在服务提供方实现接口:(对服务消费方隐藏实现) DemoServiceImpl.java package com.alibaba.dubbo.demo. import com.alibaba.dubbo.demo.DemoS public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return &Hello & + } }用Spring配置声明暴露服务: provider.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans&Use our professional PDF creation service at http://www.htm2pdf.co.uk! &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &!-- 提供方应用信息,用于计算依赖关系 --& &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&加载Spring配置: Provider.java import org.springframework.context.support.ClassPathXmlApplicationC public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {&http://10.20.160.198/wiki/display/dubbo/provider.xml&}); context.start(); } } System.in.read(); // 按任意键退出服务消费者(#)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 完整安装步骤,请参见:示例消费者安装 (+) 通过Spring配置引用远程服务: consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --& &dubbo:application name=&consumer-of-helloworld-app& /& &!-- 使用multicast广播注册中心暴露发现服务地址 --& &dubbo:registry address=&multicast://224.5.6.7:1234& /& &!-- 生成远程服务代理,可以和本地bean一样使用demoService --& &dubbo:reference id=&demoService& interface=&com.alibaba.dubbo.demo.DemoService& /& &/beans&加载Spring配置,并调用远程服务:(也可以使用IoC注入) Consumer.java import org.springframework.context.support.ClassPathXmlApplicationC import com.alibaba.dubbo.demo.DemoS public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {&http://10.20.160.198/wiki/display/dubbo/consumer.xml&}); context.start(); DemoService demoService = (DemoService)context.getBean(&demoService&); // 获取远程服务代理 String hello = demoService.sayHello(&world&); // 执行远程方法 } System.out.println( hello ); // 显示调用结果Use our professional PDF creation service at http://www.htm2pdf.co.uk! } }依赖(+) (#)必需依赖JDK1.5+ 理论上Dubbo可以只依赖JDK ,不依赖于任何三方库运行,只需配置使用JDK 相关实现策略。缺省依赖通过mvn dependency:tree & dep.log命令分析,Dubbo缺省依赖以下三方库:[INFO] [INFO] [INFO] [INFO] [INFO] [INFO]+- com.alibaba:dubbo:jar:2.1.2:compile | +- log4j:log4j:jar:1.2.16:compile | +- org.javassist:javassist:jar:3.15.0-GA:compile | +- org.springframework:spring:jar:2.5.6.SEC03:compile | +- commons-logging:commons-logging:jar:1.1.1:compile | \- org.jboss.netty:netty:jar:3.2.5.Final:compile这里所有依赖都是换照Dubbo缺省配置选的,这些缺省值是基于稳定性和性能考虑的。 log4j.jar和commons-logging.jar日志输出包。 可以直接去掉,dubbo本身的日志会自动切换为JDK 的java.util.logging输出。 但如果其它三方库比如spring.jar间接依赖commons-logging,则不能去掉。 javassist.jar 字节码生成。 如果&dubbo:provider proxy=&jdk& /& 或&dubbo:consumer proxy=&jdk& /& ,以及&dubbo:application compiler=&jdk& /& ,则不需要。 spring.jar 配置解析。 如果用ServiceConfig和ReferenceConfig的API调用,则不需要。 netty.jar 网络传输。 如果&dubbo:protocol server=&mina&/& 或&dubbo:protocol server=&grizzly&/& ,则换成mina.jar或grizzly.jar。 如果&protocol name=&rmi&/& ,则不需要。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 可选依赖以下依赖,在主动配置使用相应实现策略时用到,需自行加入依赖。 mina: 1.1.7 grizzly: 2.1.4 httpclient: 4.1.2 hessian_lite: 3.2.1-fixed xstream: 1.4.1 fastjson: 1.1.8 zookeeper: 3.3.3 jedis: 2.0.0 xmemcached: 1.3.6 jfreechart: 1.0.13 hessian: 4.0.7 jetty: 6.1.26 hibernate-validator: 4.2.0.Final zkclient: 0.1 curator: 1.1.10 cxf: 2.6.1 thrift: 0.8.0 JEE: servlet: 2.5 bsf: 3.1 validation-api: 1.0.0.GA jcache: 0.4成熟度(+) (#)功能成熟度(#) Feature 并发控制 连接控制 Maturity Tested Tested Strength 并发控制 连接数控制 Problem Advise 试用 试用 UserUse our professional PDF creation service at http://www.htm2pdf.co.uk! 直连提供者 Tested 分组聚合 参数验证 结果缓存 泛化引用 泛化实现 回声测试 隐式传参 异步调用 本地调用 参数回调 事件通知 本地存根 本地伪装 延迟暴露 延迟连接 粘滞连接 令牌验证 路由规则 配置规则 访问日志 Tested Tested Tested Stable Stable Tested Stable Tested Tested Tested Tested Stable Stable Stable Tested Tested Tested Tested Tested Tested点对点直连服务提供方,用于测试 分组聚合返回值,用于菜单聚合等服务 参数验证,JSR303验证框架集成 结果缓存,用于加速请求 泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等 泛化实现,无需业务接口类实现任意接口,用于Mock 平台 回声测试 附加参数 不可靠异步调用 本地调用 参数回调 事件通知,在远程调用执行前后触发 在客户端执行部分逻辑 伪造返回结果,可在失败时执行,或直接执行,用于服务降级 延迟暴露服务,用于等待应用加载warmup数据,或等待spring加载完成 延迟建立连接,调用时建立 粘滞连接,总是向同一个提供方发起请求,除非此提供方挂掉,再切换到另一台 令牌验证,用于服务授权 动态决定调用关系 动态下发配置,实现功能的开关 访问日志,用于记录调用信息 需注册中心支持 需注册中心支持 需注册中心支持 需注册中心支持 特殊场景使用 特殊场景使用 对性能有影响测试环境使用 可用于生产环境 试用 试用AlibabaLaiWang可用于生产环境 Alibaba 可用于生产环境 Alibaba 试用 可用于生产环境 试用 试用 试用 试用 可用于生产环境 Alibaba 可用于生产环境 Alibaba 可用于生产环境 Alibaba 试用 试用 试用 试用 试用 Registry Registry Registry本地存储,影响性能,受磁盘大小限制 试用 不稳定 不可用分布式事务 Research JTA/XA 三阶段提交事务策略成熟度(#) Feature Maturity Strength Problem Advise UserUse our professional PDF creation service at http://www.htm2pdf.co.uk! Zookeeper注册 中心 Redis 注册中心Stable Stable支持基于网络的集群方式,有广泛周边开源产品,建议使用dubbo-2.3.3以上 版本(推荐使用) 支持基于客户端双写的集群方式,性能高 去中心化,不需要安装注册中心依赖于Zookeeper的稳定性 要求服务器时间同步,用于检查心跳过期脏数 据 依赖于网络拓普和路由,跨机房有风险可用于生产 环境 可用于生产 环境 小规模应用 或开发测试 环境 试用 Advise 可用于生产 环境 Advise 可用于生产 环境 可用于生产 环境 可用于生产 环境 Advise 可用于生产 环境 可用于生产 环境 试用 Advise 可用于生产 环境 试用 试用 User Alibaba User Alibaba Alibaba User Alibaba Alibaba UserMulticast 注册中 Tested 心 Simple注册中心 Tested FeatureDogfooding,注册中心本身也是一个标准的RPC服务没有集群支持,可能单点故障 Problem 没有集群支持,可能单点故障,但故障后不影 响RPC运行 Problem 在大文件传输时,单一连接会成为瓶颈 偶尔会连接失败,需重建Stub 需hessian.jar支持,http短连接的开销大 Problem 一次请求派发两种事件,需屏蔽无用事件 待发送消息队列派发不及时,大压力下,会出 现FullGC 线程池不可扩展,Filter不能拦截下一Filter Problem Hessian的各版本兼容性不好,可能和应用使用 的Hessian冲突,Dubbo内嵌了hessian3.2.1的 源码 当参数对象增加字段时,需外部文件声明 性能较差Maturity Strength 支持JFreeChart 统计报表Simple监控中心 Stable Feature Dubbo协议 Rmi协议 Hessian协议 Feature Netty Transporter Mina Transporter Grizzly Transporter Feature Hessian Serialization Dubbo Serialization JsonMaturity Strength Stable Stable Stable 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并 发效率,性能较好(推荐使用) 可与原生RMI互操作,基于TCP 协议 可与原生Hessian互操作,基于HTTP 协议Maturity Strength Stable Stable Tested JBoss 的NIO框架,性能较好(推荐使用) 老牌NIO框架,稳定 Sun的NIO框架,应用于GlassFish服务器中Maturity Strength Stable 性能较好,多语言支持(推荐使用)Tested Tested通过不传送POJO的类元信息,在大量POJO传输时,性能较好 纯文本,可跨语言解析,缺省采用FastJson解析Use our professional PDF creation service at http://www.htm2pdf.co.uk! Serialization Java Serialization Feature Javassist ProxyFactory Jdk ProxyFactory Feature Failover Cluster Failfast Cluster Stable Java原生支持 性能较差 Problem 依赖于javassist.jar包,占用JVM的Perm内 存,Perm可能要设大一些:java XX:PermSize=128m 性能较差 Problem 重试会带来更长延迟 如果有机器正在重启,可能会出现调用失败 调用信息丢失 不可靠,重启丢失 需要浪费更多服务资源 速度慢,任意一台报错则报错 Problem 在一个截面上碰撞的概率高,重试时,可能出 现瞬间压力不均 存在慢的机器累积请求问题,极端情况可能产 生雪崩 不支持权重,在容量规划时,不能通过权重把 压力导向一台机器压测容量 压力分摊不均 可用于生产 环境 Advise 可用于生产 环境 可用于生产 环境 Advise 可用于生产 环境 可用于生产 环境 可用于生产 环境 可用于生产 环境 可用于生产 环境 可用于生产 环境 Advise 可用于生产 环境 可用于生产 环境 可用于生产 环境 可用于生产 环境 User Alibaba User Alibaba Alibaba Monitor Registry User AlibabaMaturity Strength Stable 通过字节码生成代替反射,性能比较好(推荐使用)StableJDK 原生支持Maturity Strength Stable Stable 失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使 用) 快速失败,只发起一次调用,失败立即报错, 通常用于非幂等性的写操作 失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作 并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读 操作 广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供 方本地状态Failsafe Cluster Stable Failback Cluster Forking Cluster Broadcast Cluster Feature Random LoadBalance RoundRobin LoadBalance LeastActive LoadBalance Tested Tested TestedMaturity Strength Stable Stable Stable 随机,按权重设置随机概率(推荐使用) 轮循,按公约后的权重设置轮循比率 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机 器收到更少请求 一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时, 原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧 烈变动ConsistentHash Stable LoadBalanceUse our professional PDF creation service at http://www.htm2pdf.co.uk! Feature 条件路由规则 脚本路由规则 Feature Spring Container Jetty ContainerMaturity Strength Stable Tested 基于条件表达式的路由规则,功能简单易用 基于脚本引擎的路由规则,功能强大Problem 有些复杂多分支条件情况,规则很难描述 没有运行沙箱,脚本能力过于强大,可能成为 后门 ProblemAdvise 可用于生产 环境 试用 Advise 可用于生产 环境User AlibabaMaturity Strength Stable Stable 自动加载META-INF/spring目录下的所有Spring配置 启动一个内嵌Jetty ,用于汇报状态 自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录User Alibaba Alibaba Alibaba大量访问页面时,会影响服务器的线程和内存 用户不能控制log4j的配置,不灵活可用于生产 环境 可用于生产 环境Log4j Container Stable配置(+) (#)Xml配 置(+) (#) 配置项说明 详细配置项,请参见:配置参考手册 (+)API使用说明 如果不想使用Spring配置,而希望通过API的方式进行调用,请参见:API配置 (+)配置使用说明 想知道如何使用配置,请参见:快速启动 (+) 示例: provider.xmlUse our professional PDF creation service at http://www.htm2pdf.co.uk! &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&hello-world-app& /& &dubbo:registry address=&multicast://224.5.6.7:1234& /& &dubbo:protocol name=&dubbo& port=&20880& /& &dubbo:service interface=&com.alibaba.dubbo.demo.DemoService& ref=&demoServiceLocal& /& &dubbo:reference id=&demoServiceRemote& interface=&com.alibaba.dubbo.demo.DemoService& /& &/beans&所有标签者支持自定义参数,用于不同扩展点实现的特殊配置。 如:&dubbo:protocol name=&jms&& &dubbo:parameter key=&queue& value=&http://10.20.160.198/wiki/display/dubbo/10.20.31.22& /& &/dubbo:protocol&或:(2.1.0开始支持) 注意声明:xmlns:p=&http://www.springframework.org/schema/p&&beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xmlns:p=&http://www.springframework.org/schema/p& xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&&Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:protocol name=&jms& p:queue=&http://10.20.160.198/wiki/display/dubbo/10.20.31.22& /& &/beans&Configuration Relation:&dubbo:service/& 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。 &dubbo:reference/& 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。 &dubbo:protocol/& 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。 &dubbo:application/& 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。 &dubbo:module/& 模块配置,用于配置当前模块信息,可选。 &dubbo:registry/& 注册中心配置,用于配置连接注册中心相关信息。 &dubbo:monitor/& 监控中心配置,用于配置连接监控中心相关信息,可选。 &dubbo:provider/& 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。 &dubbo:consumer/& 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:method/& 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。 &dubbo:argument/& 用于指定方法参数配置。 Configuration Override:上图中以timeout 为例,显示了配置的查找顺序,其它retries, loadbalance, actives 等类似。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 方法级优先,接口级次之,全局配置再次之。 如果级别一样,则消费方优先,提供方次之。 其中,服务提供方配置,通过URL经由注册中心传递给消费方。 建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。 理论上ReferenceConfig的非服务标识配置,在ConsumerConfig,ServiceConfig, ProviderConfig均可以缺省配置。属性配置(+) (#) 如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个Spring容器想共享配置,可以使用dubbo.properties 作为缺省配置。Dubbo将自动加载classpath根目录下的dubbo.properties ,可以通过JVM启动参数:-Ddubbo.properties.file=xxx.properties 改变缺省配置位置。如果classpath根目录下存在多个dubbo.properties ,比如多个jar包中有dubbo.properties ,Dubbo会任意加载,并打印Error日志,后续可能改为抛异常。 映射规则: 将XML配置的标签名,加属性名,用点分隔,多个属性拆成多行: 比如:dubbo.application.name=foo等价于&dubbo:application name=&foo& /& 比如:dubbo.registry.address=10.20.153.10:9090等价于&dubbo:registry address=&10.20.153.10:9090& /& 如果XML有多行同名标签配置,可用id号区分,如果没有id号将对所有同名标签生效: 比如:dubbo.protocol.rmi.port=1234等价于&dubbo:protocol id=&rmi& name=&rmi& port=&1099& /& (协议的id没配时,缺省使用协议名作为id) 比如:dubbo.registry.china.address=10.20.153.10:9090等价于&dubbo:registry id=&china& address=&10.20.153.10:9090& /& 典型配置如: dubbo.properties dubbo.application.name=foo dubbo.application.owner=bar dubbo.registry.address=10.20.153.10:9090Use our professional PDF creation service at http://www.htm2pdf.co.uk! 覆盖策略: JVM启动-D参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。 XML次之,如果在XML中有配置,则dubbo.properties 中的相应配置项无效。 Properties 最后,相当于缺省值,只有XML没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。注解配置(+) (#) 2.2.1以上版本支持 服务提供方注解:import com.alibaba.dubbo.config.annotation.S @Service(version=&1.0.0&) public class FooServiceImpl implements FooService {Use our professional PDF creation service at http://www.htm2pdf.co.uk! public class FooServiceImpl implements FooService { // ...... }服务提供方配置:&!-- 公共信息,也可以用dubbo.properties配置 --& &dubbo:application name=&annotation-provider& /& &dubbo:registry address=&127.0.0.1:4548& /& &!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 --& &dubbo:annotation package=&com.foo.bar.service& /&服务消费方注解:import com.alibaba.dubbo.config.annotation.R import org.springframework.stereotype.C @Component public class BarAction { @Reference(version=&1.0.0&) private FooService fooS }服务消费方配置:&!-- 公共信息,也可以用dubbo.properties配置 --& &dubbo:application name=&annotation-consumer& /& &dubbo:registry address=&127.0.0.1:4548& /& &!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 --& &dubbo:annotation package=&com.foo.bar.action& /&也可以使用:(等价于前面的:&dubbo:annotation package=&com.foo.bar.service& /&)Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:annotation /& &context:component-scan base-package=&com.foo.bar.service&& &context:include-filter type=&annotation& expression=&com.alibaba.dubbo.config.annotation.Service& /& &/context:component-scan&Spring2.5及以后版本支持component-scan,如果用的是Spring2.0及以前版本,需配置:&!-- Spring2.0支持@Service注解配置,但不支持package属性自动加载bean的实例,需人工定义bean的实例。--& &dubbo:annotation /& &bean id=&barService& class=&com.foo.BarServiceImpl& /&API配 置(+) (#) API使用范围 API仅用于OpenAPI, ESB, Test, Mock 等系统集成,普通服务提供方或消费方,请采用配置方式使用Dubbo,请参见:Xml配置 (+)API属性含义参考 API属性与配置项一对一,各属性含义,请参见:配置参考手册 (+), 比如:ApplicationConfig.setName(&xxx&) 对应 &dubbo:application name=&xxx& /&(1) 服务提供者:import com.alibaba.dubbo.rpc.config.ApplicationC import com.alibaba.dubbo.rpc.config.RegistryC import com.alibaba.dubbo.rpc.config.ProviderC import com.alibaba.dubbo.rpc.config.ServiceC import com.xxx.XxxS import com.xxx.XxxServiceI // 服务实现 XxxService xxxService = new XxxServiceImpl();Use our professional PDF creation service at http://www.htm2pdf.co.uk! // 当前应用配置 ApplicationConfig application = new ApplicationConfig(); application.setName(&xxx&); // 连接注册中心配置 RegistryConfig registry = new RegistryConfig(); registry.setAddress(&10.20.130.230:9090&); registry.setUsername(&aaa&); registry.setPassword(&bbb&); // 服务提供者协议配置 ProtocolConfig protocol = new ProtocolConfig(); protocol.setName(&dubbo&); protocol.setPort(12345); protocol.setThreads(200); // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口 // 服务提供者暴露服务配置 ServiceConfig&XxxService& service = new ServiceConfig&XxxService&(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接 泄漏 service.setApplication(application); service.setRegistry(registry); // 多个注册中心可以用setRegistries() service.setProtocol(protocol); // 多个协议可以用setProtocols() service.setInterface(XxxService.class); service.setRef(xxxService); service.setVersion(&1.0.0&); // 暴露及注册服务 service.export();(2) 服务消费者:import com.alibaba.dubbo.rpc.config.ApplicationC import com.alibaba.dubbo.rpc.config.RegistryC import com.alibaba.dubbo.rpc.config.ConsumerC import com.alibaba.dubbo.rpc.config.ReferenceC import com.xxx.XxxS // 当前应用配置 ApplicationConfig application = new ApplicationConfig(); application.setName(&yyy&); // 连接注册中心配置 RegistryConfig registry = new RegistryConfig();Use our professional PDF creation service at http://www.htm2pdf.co.uk! RegistryConfig registry = new RegistryConfig(); registry.setAddress(&10.20.130.230:9090&); registry.setUsername(&aaa&); registry.setPassword(&bbb&); // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接 // 引用远程服务 ReferenceConfig&XxxService& reference = new ReferenceConfig&XxxService&(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓 存,否则可能造成内存和连接泄漏 reference.setApplication(application); reference.setRegistry(registry); // 多个注册中心可以用setRegistries() reference.setInterface(XxxService.class); reference.setVersion(&1.0.0&); // 和本地bean一样使用xxxService XxxService xxxService = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用(3) 特殊场景注:下面只列出不同的地方,其它参见上面的写法(3.1) 方法级设置:... // 方法级配置 List&MethodConfig& methods = new ArrayList&MethodConfig&(); MethodConfig method = new MethodConfig(); method.setName(&createXxx&); method.setTimeout(10000); method.setRetries(0); methods.add(method); // 引用远程服务 ReferenceConfig&XxxService& reference = new ReferenceConfig&XxxService&(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓 存,否则可能造成内存和连接泄漏 ... reference.setMethods(methods); // 设置方法级配置 ...Use our professional PDF creation service at http://www.htm2pdf.co.uk! (3.2) 点对点直连:... ReferenceConfig&XxxService& reference = new ReferenceConfig&XxxService&(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓 存,否则可能造成内存和连接泄漏 // 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心, // 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值, // 路径对应service.setPath()的值,如果未设置path,缺省path为接口名 reference.setUrl(&dubbo://10.20.130.230:20880/com.xxx.XxxService&); ...示例(+) (#) 想完整的运行起来,请参见:快速启动 (+),这里只列出各种场景的配置方式以下示例全部使用基于Spring的Xml配置 (+)作为参考,如果不想使用Spring,而希望通过API的方式进行调用,请参见:API配置 (+)启动时检查(+) (#) Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=tr?ue。如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check ,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会 返回引用,当服务恢复时,能自动连上。 可以通过check=&false& 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。 关闭某个服务的启动时检查:(没有提供者时报错)Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:reference interface=&com.foo.BarService& check=&false& /&关闭所有服务的启动时检查:(没有提供者时报错)&dubbo:consumer check=&false& /&关闭注册中心启动时检查:(注册订阅失败时报错)&dubbo:registry check=&false& /&也可以用dubbo.properties 配置: dubbo.properties dubbo.reference.com.foo.BarService.check=false dubbo.reference.check=false dubbo.consumer.check=false dubbo.registry.check=false也可以用-D参数:java java java java-Ddubbo.reference.com.foo.BarService.check=false -Ddubbo.reference.check=false -Ddubbo.consumer.check=false -Ddubbo.registry.check=false注意区别 dubbo.reference.check=false,强制改变所有reference的check 值,就算配置中有声明,也会被覆盖。 dubbo.consumer.check=false,是设置check 的缺省值,如果配置中有显式的声明,如:&dubbo:reference check=&true&/& ,不会受影响。 dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定 时重试。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 引用缺省是延迟初始化的,只有引用被注入到其它Bean,或被getBean()获取,才会初始化。 如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:&dubbo:reference interface=&com.foo.BarService& init=&true& /&集群容错(+) (#) 在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。各节点关系: 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。 Directory 代表多个Invoker,可以把它看成List&Invoker& ,但与List 不同的是,它的值可能是动态变化的,比如注册中心推送变更。 Cluster将Directory 中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。 Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。 LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。集群容错模式:Use our professional PDF creation service at http://www.htm2pdf.co.uk! 可以自行扩展集群容错策略,参见:集群扩展 Failover Cluster 失败自动切换,当出现失败,重试其它服务器。(缺省) 通常用于读操作,但重试会带来更长延迟。 可通过retries=&2& 来设置重试次数(不含第一次)。 Failfast Cluster 快速失败,只发起一次调用,失败立即报错。 通常用于非幂等性的写操作,比如新增记录。 Failsafe Cluster 失败安全,出现异常时,直接忽略。 通常用于写入审计日志等操作。 Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。 通常用于消息通知操作。 Forking Cluster 并行调用多个服务器,只要一个成功即返回。 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。 可通过forks=&2& 来设置最大并行数。 Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持) 通常用于通知所有提供者更新缓存或日志等本地资源信息。 重试次数配置如:(failover集群模式生效)&dubbo:service retries=&2& /&或:&dubbo:reference retries=&2& /&Use our professional PDF creation service at http://www.htm2pdf.co.uk! 或:&dubbo:reference& &dubbo:method name=&findFoo& retries=&2& /& &/dubbo:reference&集群模式配置如:&dubbo:service cluster=&failsafe& /&或:&dubbo:reference cluster=&failsafe& /&负载均衡(+) (#) 在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。 可以自行扩展负载均衡策略,参见:负载均衡扩展 Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 LeastActive LoadBalanceUse our professional PDF creation service at http://www.htm2pdf.co.uk! 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing。 缺省只对第一个参数Hash,如果要修改,请配置&dubbo:parameter key=&hash.arguments& value=&0,1& /& 缺省用160份虚拟节点,如果要修改,请配置&dubbo:parameter key=&hash.nodes& value=&320& /& 配置如:&dubbo:service interface=&...& loadbalance=&roundrobin& /&或:&dubbo:reference interface=&...& loadbalance=&roundrobin& /&或:&dubbo:service interface=&...&& &dubbo:method name=&...& loadbalance=&roundrobin&/& &/dubbo:service&或:&dubbo:reference interface=&...&& &dubbo:method name=&...& loadbalance=&roundrobin&/& &/dubbo:reference&线程模型(+) (#)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。 但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。 如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。Dispatcher all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。 direct 所有消息都不派发到线程池,全部在IO线程上直接执行。 message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。 execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。 connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。 ThreadPool fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省) cached 缓存线程池,空闲一分钟自动删除,需要时重建。 limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。 配置如:&dubbo:protocol name=&dubbo& dispatcher=&all& threadpool=&fixed& threads=&100& /&直连提供者(+) (#) 在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连, 点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表, A 接口配置点对点,不影响B 接口从注册中心获取列表。Use our professional PDF creation service at http://www.htm2pdf.co.uk! (1) 如果是线上需求需要点对点,可在&dubbo:reference& 中配置url指向提供者,将绕过注册中心,多个地址用分号隔开 多个地址用分号隔开 ,配置如下:(1.0.6及以上版本支持)&dubbo:reference id=&xxxService& interface=&com.alibaba.xxx.XxxService& url=&dubbo://localhost:20890& /&(2) 在JVM启动参数中加入-D参数映射服务地址,如: (key 为服务名,value为服务提供者url,此配置优先级最高,1.0.15及以上版本支持)java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890注意 为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。 (3) 如果服务比较多,也可以用文件映射,如: (用-Ddubbo.resolve.file指定映射文件路径,此配置优先级高于&dubbo:reference& 中的配置,1.0.15及以上版本支持) (2.0以上版本自动加载${user.home}/dubbo-resolve.properties 文件,不需要配置)java -Ddubbo.resolve.file=xxx.propertiesUse our professional PDF creation service at http://www.htm2pdf.co.uk! 然后在映射文件xxx.properties 中加入: (key 为服务名,value为服务提供者url)com.alibaba.xxx.XxxService=dubbo://localhost:20890注意 为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。只订阅(+) (#) 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。解决方案 可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。禁用注册配置:Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:registry address=&10.20.153.10:9090& register=&false& /&或者:&dubbo:registry address=&10.20.153.10:9090?register=false& /&只注册(+) (#) 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服 务,所以需要将服务同时注册到两个注册中心,但却不能让此服务同时依赖两个注册中心的其它服务。解决方案 可以让服务提供者方,只注册服务到另一注册中心,而不从另一注册中心订阅服务。 禁用订阅配置:&dubbo:registry id=&hzRegistry& address=&10.20.153.10:9090& /& &dubbo:registry id=&qdRegistry& address=&10.20.141.150:9090& subscribe=&false& /&或者:&dubbo:registry id=&hzRegistry& address=&10.20.153.10:9090& /& &dubbo:registry id=&qdRegistry& address=&10.20.141.150:9090?subscribe=false& /&静态服务(+) (#)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。&dubbo:registry address=&10.20.141.150:9090& dynamic=&false& /&或者:&dubbo:registry address=&10.20.141.150:9090?dynamic=false& /&服务提供者初次注册时为禁用状态,需人工启用,断线时,将不会被自动删除,需人工禁用。 如果是一个第三方独立提供者,比如memcached等,可以直接向注册中心写入提供者地址信息,消费者正常使用: (通常由脚本监控中心页面等调用)RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); Registry registry = registryFactory.getRegistry(URL.valueOf(&zookeeper://10.20.153.10:2181&)); registry.register(URL.valueOf(&memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&));多协议(+) (#) 可以自行扩展协议,参见:协议扩展(1) 不同服务不同协议比如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。 consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&&Use our professional PDF creation service at http://www.htm2pdf.co.uk! beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /& &dubbo:registry id=&registry& address=&10.20.141.150:9090& username=&admin& password=&hello1234& /& &!-- 多协议配置 --& &dubbo:protocol name=&dubbo& port=&20880& /& &dubbo:protocol name=&rmi& port=&1099& /& &!-- 使用dubbo协议暴露服务 --& &dubbo:service interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& ref=&helloService& protocol=&dubbo& /& &!-- 使用rmi协议暴露服务 --& &dubbo:service interface=&com.alibaba.hello.api.DemoService& version=&1.0.0& ref=&demoService& protocol=&rmi& /& &/beans&(2) 多协议暴露服务比如:需要与http客户端互操作 consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /& &dubbo:registry id=&registry& address=&10.20.141.150:9090& username=&admin& password=&hello1234& /& &!-- 多协议配置 --& &dubbo:protocol name=&dubbo& port=&20880& /& &dubbo:protocol name=&hessian& port=&8080& /& &!-- 使用多个协议暴露服务 --& &dubbo:service id=&helloService& interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& protocol=&dubbo,hessian& /& &/beans&多注册中心Use our professional PDF creation service at http://www.htm2pdf.co.uk! (+) (#) 可以自行扩展注册中心,参见:注册中心扩展(1) 多注册中心注册比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。 consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /& &!-- 多注册中心配置 --& &dubbo:registry id=&hangzhouRegistry& address=&10.20.141.150:9090& /& &dubbo:registry id=&qingdaoRegistry& address=&10.20.141.151:9010& default=&false& /& &!-- 向多个注册中心注册 --& &dubbo:service interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& ref=&helloService& registry=&hangzhouRegistry,qingdaoRegistry&/&&/beans&(2) 不同服务使用不同注册中心比如:CRM有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。 consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /&Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:application name=&world& /& &!-- 多注册中心配置 --& &dubbo:registry id=&chinaRegistry& address=&10.20.141.150:9090& /& &dubbo:registry id=&intlRegistry& address=&10.20.154.177:9010& default=&false& /& &!-- 向中文站注册中心注册 --& &dubbo:service interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& ref=&helloService& registry=&chinaRegistry& /& &!-- 向国际站注册中心注册 --& &dubbo:service interface=&com.alibaba.hello.api.DemoService& version=&1.0.0& ref=&demoService& registry=&intlRegistry& /& &/beans&(3) 多注册中心引用比如:CRM需同时调用中文站和国际站的PC2服务,PC2在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。 consumer.xml &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /& &!-- 多注册中心配置 --& &dubbo:registry id=&chinaRegistry& address=&10.20.141.150:9090& /& &dubbo:registry id=&intlRegistry& address=&10.20.154.177:9010& default=&false& /& &!-- 引用中文站服务 --& &dubbo:reference id=&chinaHelloService& interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& registry=&chinaRegistry& /& &!-- 引用国际站站服务 --& &dubbo:reference id=&intlHelloService& interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& registry=&intlRegistry& /& &/beans&如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址: consumer.xmlUse our professional PDF creation service at http://www.htm2pdf.co.uk! &?xml version=&1.0& encoding=&UTF-8&?& &beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:dubbo=&http://code.alibabatech.com/schema/dubbo& xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd&& &dubbo:application name=&world& /& &!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 --& &dubbo:registry address=&10.20.141.150:.154.177:9010& /& &!-- 引用服务 --& &dubbo:reference id=&helloService& interface=&com.alibaba.hello.api.HelloService& version=&1.0.0& /& &/beans&服务分组(+) (#) 当一个接口有多种实现时,可以用group区分。&dubbo:service group=&feedback& interface=&com.xxx.IndexService& /& &dubbo:service group=&member& interface=&com.xxx.IndexService& /&&dubbo:reference id=&feedbackIndexService& group=&feedback& interface=&com.xxx.IndexService& /& &dubbo:reference id=&memberIndexService& group=&member& interface=&com.xxx.IndexService& /&任意组:(2.2.0以上版本支持,总是只调一个可用组的实现)&dubbo:reference id=&barService& interface=&com.foo.BarService& group=&*& /&Use our professional PDF creation service at http://www.htm2pdf.co.uk! 多版本(+) (#) 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。在低压力时间段,先升级一半提供者为新版本 再将所有消费者升级为新版本 然后将剩下的一半提供者升级为新版本&dubbo:service interface=&com.foo.BarService& version=&1.0.0& /&&dubbo:service interface=&com.foo.BarService& version=&2.0.0& /&&dubbo:reference id=&barService& interface=&com.foo.BarService& version=&1.0.0& /&&dubbo:reference id=&barService& interface=&com.foo.BarService& version=&2.0.0& /&不区分版本:(2.2.0以上版本支持)&dubbo:reference id=&barService& interface=&com.foo.BarService& version=&*& /&分组聚合(+) (#) 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚 合菜单项。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 从2.1.0版本开始支持代码参见:https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge 配置如:(搜索所有分组)&dubbo:reference interface=&com.xxx.MenuService& group=&*& merger=&true& /&或:(合并指定分组)&dubbo:reference interface=&com.xxx.MenuService& group=&aaa,bbb& merger=&true& /&或:(指定方法合并结果,其它未指定的方法,将只调用一个Group)&dubbo:reference interface=&com.xxx.MenuService& group=&*&& &dubbo:method name=&getMenuItems& merger=&true& /& &/dubbo:service&或:(某个方法不合并结果,其它都合并结果)&dubbo:reference interface=&com.xxx.MenuService& group=&*& merger=&true&&Use our professional PDF creation service at http://www.htm2pdf.co.uk! &dubbo:reference interface=&com.xxx.MenuService& group=&*& merger=&true&& &dubbo:method name=&getMenuItems& merger=&false& /& &/dubbo:service&或:(指定合并策略,缺省根据返回值类型自动匹配,如果同一类型有两个合并器时,需指定合并器的名称) 参见:[ 合并结果扩展]&dubbo:reference interface=&com.xxx.MenuService& group=&*&& &dubbo:method name=&getMenuItems& merger=&mymerge& /& &/dubbo:service&或:(指定合并方法,将调用返回结果的指定方法进行合并,合并方法的参数类型必须是返回结果类型本身)&dubbo:reference interface=&com.xxx.MenuService& group=&*&& &dubbo:method name=&getMenuItems& merger=&.addAll& /& &/dubbo:service&参数验证(+) (#) 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来实现验证。2.1.0以上版本支持 完整示例代码参见:https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation 验证方式可扩展,参见:Validation扩展点 参数标注示例:import java.io.S import java.util.D import javax.validation.constraints.F import javax.validation.constraints.MUse our professional PDF creation service at http://www.htm2pdf.co.uk! import javax.validation.constraints.M import javax.validation.constraints.M import javax.validation.constraints.NotN import javax.validation.constraints.P import javax.validation.constraints.P import javax.validation.constraints.S public class ValidationParameter implements Serializable { private static final long serialVersionUID = 8000392L; @NotNull // 不允许为空 @Size(min = 1, max = 20) // 长度或大小范围 private S @NotNull(groups = ValidationService.Save.class) // 保存时不允许为空,更新时允许为空 ,表示不更新该字段 @Pattern(regexp = &^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$&) private S @Min(18) // 最小值 @Max(100) // 最大值 @Past // 必须为一个过去的时间 private Date loginD @Future // 必须为一个未来的时间 private Date expiryD public String getName() { } public void setName(String name) { this.name = } public String getEmail() { } public void setEmail(String email) { this.email = } public int getAge() { } public void setAge(int age) {Use our professional PDF creation service at http://www.htm2pdf.co.uk! public void setAge(int age) { this.age = } public Date getLoginDate() { return loginD } public void setLoginDate(Date loginDate) { this.loginDate = loginD } public Date getExpiryDate() { return expiryD } public void setExpiryDate(Date expiryDate) { this.expiryDate = expiryD } }分组验证示例:public interface ValidationService { // 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class) @interface Save{} // 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选 void save(ValidationParameter parameter); void update(ValidationParameter parameter); }关联验证示例:import javax.validation.GroupS public interface ValidationService { @GroupSequence(Update.class) // 同时验证Update组规则 @interface Save{} void save(ValidationParameter parameter); @interface Update{}Use our professional PDF creation service at http://www.htm2pdf.co.uk! @interface Update{} void update(ValidationParameter parameter); }参数验证示例:import javax.validation.constraints.M import javax.validation.constraints.NotN public interface ValidationService { void save(@NotNull ValidationParameter parameter); // 验证参数不为空 void delete(@Min(1) int id); // 直接对基本类型参数验证 }在客户端验证参数:&dubbo:reference id=&validationService& interface=&com.alibaba.dubbo.examples.validation.api.ValidationService& validation=&true& /&在服务器端验证参数:&dubbo:service interface=&com.alibaba.dubbo.examples.validation.api.ValidationService& ref=&validationService& validation=&true& /&验证异常信息:import javax.validation.ConstraintViolationE import javax.validation.ConstraintViolationE import org.springframework.context.support.ClassPathXmlApplicationC import com.alibaba.dubbo.examples.validation.api.ValidationP import com.alibaba.dubbo.examples.validation.api.ValidationS import com.alibaba.dubbo.rpc.RpcE public class ValidationConsumer {Use our professional PDF creation service at http://www.htm2pdf.co.uk! public class ValidationConsumer { public static void main(String[] args) throws Exception { String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + &/validation-consumer.xml&; ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config); context.start(); ValidationService validationService = (ValidationService)context.getBean(&validationService&); // Error try { parameter = new ValidationParameter(); validationService.save(parameter); System.out.println(&Validation ERROR&); } catch (RpcException e) { // 抛出的是RpcException ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // 里面嵌了一个ConstraintViolationException Set&ConstraintViolation&?&& violations = ve.getConstraintViolations(); // 可以拿到一个验证错误详细信息的集合 System.out.println(violations); } } }需要加入依赖:&dependency& &groupId &javax.validation&/groupId & &artifactId &validation-api&/artifactId & &version&1.0.0.GA&/version& &/dependency& &dependency& &groupId &org.hibernate&/groupId & &artifactId &hibernate-validator&/artifactId & &version&4.2.0.Final&/version& &/dependency&结果缓存(+) (#) 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量。2.1.0以上版本支持Use our professional PDF creation service at http://www.htm2pdf.co.uk! 示例代码:https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。 threadlocal 当前线程缓存,比如一个页面渲染,用到很多portal,每个portal都要去查用户信息,通过线程缓存,可以减少这种多余访问。 jcache 与JSR107集成,可以桥接各种缓存实现。 缓存类型可扩展,参见:CacheFactory 扩展点 配置如:&dubbo:reference interface=&com.foo.BarService& cache=&lru& /&或:&dubbo:reference interface=&com.foo.BarService&& &dubbo:method name=&findBar& cache=&lru& /& &/dubbo:reference&泛化引用(+) (#) 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试 框架,可通过GenericService调用所有服务实现。&dubbo:reference id=&barService& interface=&com.foo.BarService& generic=&true& /&GenericService barService = (GenericService) applicationContext.getBean(&barService&); Object result = barService.$invoke(&sayHello&, new String[] { &java.lang.String& }, new Object[] { &World& });import com.alibaba.dubbo.rpc.service.GenericSUse our professional PDF creation service at http://www.htm2pdf.co.uk! import com.alibaba.dubbo.rpc.service.GenericS ... // 引用远程服务 ReferenceConfig&GenericService& reference = new ReferenceConfig&GenericService&(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连 接,请缓存 reference.setInterface(&com.xxx.XxxService&); // 弱类型接口名 reference.setVersion(&1.0.0&); reference.setGeneric(true); // 声明为泛化接口 GenericService genericService = reference.get(); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用 // 基本类型以及Date,List,Map等不需要转换,直接调用 Object result = genericService.$invoke(&sayHello&, new String[] {&java.lang.String&}, new Object[] {&world&}); // 用Map表示POJO参数,如果返回值为POJO也将自动转成Map Map&String, Object& person = new HashMap&String, Object&(); person.put(&name&, &xxx&); person.put(&password&, &yyy&); Object result = genericService.$invoke(&findPerson&, new String[]{&com.xxx.Person&}, new Object[]{person}); // 如果返回POJO将自动转成Map ...假设存在POJO如:package com. public class PersonImpl implements Person { private S private S public String getName() { } public void setName(String name) { this.name = } public String getPassword() { } public void setPassword(String password) { this.password= } }则POJO数据:Use our professional PDF creation service at http://www.htm2pdf.co.uk! Person person = new PersonImpl(); person.setName(&xxx&); person.setPassword(&yyy&);可用下面Map表示:Map&String, Object& map = new HashMap&String, Object&(); map.put(&class&, &com.xxx.PersonImpl&); // 注意:如果参数类型是接口,或者List等丢失泛型,可通过class属性指定类型。 map.put(&name&, &xxx&); map.put(&password&, &yyy&);泛化实现(+) (#) 泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服 务Mock 框架,可通过实现GenericService接口处理所有服务请求。&bean id=&genericService& class=&com.foo.MyGenericService& /& &dubbo:service interface=&com.foo.BarService& ref=&genericService& /&package com. public class MyGenericService implements GenericService { public Object $invoke(String methodName, String[] parameterTypes, Object[] args) throws GenericException { if (&sayHello&.equals(methodName)) { return &Welcome & + args[0]; } } }...Use our professional PDF creation service at http://www.htm2pdf.co.uk! ... GenericService xxxService = new XxxGenericService(); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口实现 ServiceConfig&GenericService& service = new ServiceConfig&GenericService&(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 service.setInterface(&com.xxx.XxxService&); // 弱类型接口名 service.setVersion(&1.0.0&); service.setRef(xxxService); // 指向一个通用服务实现 // 暴露及注册服务 service.export();回声测试(+) (#) 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService,即可使用。&dubbo:reference id=&memberService& interface=&com.xxx.MemberService& /&MemberService memberService = ctx.getBean(&memberService&); // 远程服务引用 EchoService echoService = (EchoService) memberS // 强制转型为EchoService String status = echoService.$echo(&OK&); // 回声测试可用性 assert(status.equals(&OK&))上下文信息(+) (#) 上下文中存放的是当前调用过程中所需的环境信息。Use our professional PDF creation service at http://www.htm2pdf.co.uk! 所有配置信息都将转换为URL的参数,参见《配置项一览表》中的“对应URL参数”一列。注意 RpcContext 是一个ThreadLocal的临时状态记录器,当接收到RPC请求,或发起RPC请求时,RpcContext 的状态都会变化。 比如:A 调B ,B 再调C,则B 机器上,在B 调C之前,RpcContext 记录的是A 调B 的信息,在B 调C之后,RpcContext 记录的是B 调C的信息。(1) 服务消费方xxxService.xxx(); // 远程调用 boolean isConsumerSide = RpcContext.getContext().isConsumerSide(); // 本端是否为消费端,这里会返回true String serverIP = RpcContext.getContext().getRemoteHost(); // 获取最后一次调用的提供方IP地址 String application = RpcContext.getContext().getUrl().getParameter(&application&); // 获取当前服务配置信息,所有配置信息都将转换为URL的参数 // ... yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化 // ...(2) 服务提供方public class XxxServiceImpl implements XxxService { public void xxx() { // 服务方法实现 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 本端是否为提供端,这里会返回true String clientIP = RpcContext.getContext().getRemoteHost(); // 获取调用方IP地址 String application = RpcContext.getContext().getUrl().getParameter(&application&); // 获取当前服务配置信息,所有配置信息都将转换为URL的参数 // ... yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 此时本端变成消费端,这里会返回false // ... } }隐式传参Use our professional PDF creation service at http://www.htm2pdf.co.uk!(+) (#) 注:path,group,version,dubbo,token,timeout 几个key 有特殊处理,请使用其它key 值。(1) 服务消费方RpcContext.getContext().setAttachment(&index&, &1&); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议 常规业务使用 xxxService.xxx(); // 远程调用 // ...【注】 setAttachment 设置的KV ,在完成下面一次远程调用会被清空。即多次远程调用要多次设置。(2) 服务提供方public class XxxServiceImpl implements XxxService { public void xxx() { // 服务方法实现 String index = RpcContext.getContext().getAttachment(&index&); // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用 // ... } }异步调用(+) (#)Use our professional PDF creation service at http://www.htm2pdf.co.uk! 基于NIO的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。2.0.6及其以上版本支持配置声明: consumer.xml &dubbo:reference id=&fooService& interface=&com.alibaba.foo.FooService&& &dubbo:method name=&findFoo& async=&true& /& &/dubbo:reference& &dubbo:reference id=&barService& interface=&com.alibaba.bar.BarService&& &dubbo:method name=&findBar& async=&true& /& &/dubbo:reference&调用代码:fooService.findFoo(fooId); // 此调用会立即返回null Future&Foo& fooFuture = RpcContext.getContext().getFuture(); // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。 barService.findBar(barId); // 此调用会立即返回null Future&Bar& barFuture = RpcContext.getContext().getFuture(); // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。 // 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成。 Foo foo = fooFuture.get(); // 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒。 Bar bar = barFuture.get(); // 同理等待bar返回。Use our professional PDF creation service at http://www.htm2pdf.co.uk! // 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。你也可以设置是否等待消息发出:(异步总是不等待返回) sent=&true& 等待消息发出,消息发送失败将抛出异常。 sent=&false& 不等待消息发出,将消息放入IO队列,即刻返回。&dubbo:method name=&findFoo& async=&true& sent=&true& /&如果你只是想异步,完全忽略返回值,可以配置return=&false& ,以减少Future对象的创建和管理成本:&dubbo:method name=&findFoo& async=&true& return=&false& /&本地调用(+) (#) 本地调用,使用了Injvm协议,是一个伪协议,它不开启端口,不发起远程调用,只在JVM内直接关联,但执行Dubbo的Filter链。 Define injvm protocol:&dubbo:protocol name=&injvm& /&Set default protocol:&dubbo:provider protocol=&injvm& /&Set service protocol:&dubbo:service protocol=&injvm& /&Use our professional PDF creation service at http://www.htm2pdf.co.uk! Use injvm first:&dubbo:consumer injvm=&true& .../& &dubbo:provider injvm=&true& .../&或&dubbo:reference injvm=&true& .../& &dubbo:service injvm=&true& .../&注意:服务暴露与服务引用都需要声明injvm=&true& 自动暴露、引用本地服务 从 dubbo 2.2.0 开始,每个服务默认都会在本地暴露;在引用服务的时候,默认优先引用本地服务;如果希望引用远程服务可以使用一下配置强制引用远程服务。... ...&dubbo:reference ... scope=&remote& /&参数回调(+) (#) 参数回调方式与调用本地callback 或listener相同,只需要在Spring的配置文件中声明哪个参数是callback 类型即可,Dubbo将基于长连接生成反向代理,这样就可以 从服务器端调用客户端逻辑。2.0.6及其以上版本支持 代码参见:https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback (1) 共享服务接口:Use our professional PDF creation service at http://www.htm2pdf.co.uk! 服务接口示例: CallbackService.java package com. public interface CallbackService { void addListener(String key, CallbackListener listener); }CallbackListener.java package com. public interface CallbackListener { void changed(String msg); }(2) 服务提供者: 服务提供者接口实现示例: CallbackServiceImpl.java package com.callback. import java.text.SimpleDateF import java.util.D import java.util.M import java.util.concurrent.ConcurrentHashM import com.callback.CallbackL import com.callback.CallbackS public class CallbackServiceImpl implements CallbackService { private final Map&String, CallbackListener& listeners = new ConcurrentHashMap&String, CallbackListener&(); public CallbackServiceImpl() { Thread t = new Thread(new Runnable() { public void run() { while(true) {Use our professional PDF creation service at http://www.htm2pdf.co.uk! }} }); t.setDaemon(true); t.start();while(true) { try { for(Map.Entry&String, CallbackListener& entry : listeners.entrySet()){ try { entry.getValue().changed(getChanged(entry.getKey())); } catch (Throwable t) { listeners.remove(entry.getKey()); } } Thread.sleep(5000); // 定时触发变更通知 } catch (Throwable t) { // 防御容错 t.printStackTrace(); } }public void addListener(String key, CallbackListener listener) { listeners.put(key, listener); listener.changed(getChanged(key)); // 发送变更通知 } private String getChanged(String key) { return &Changed: & + new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss&).format(new Date()); } }服务提供者配置示例:&bean id=&callbackService& class=&com.callback.impl.CallbackServiceImpl& /& &dubbo:service interface=&com.callback.CallbackService& ref=&callbackService& connections=&1& callbacks=&1000&& &dubbo:method name=&addListener&& &dubbo:argument index=&1& callback=&true& /& &!--也可以通过指定类型的方式--& &!--&dubbo:argument type=&com.demo.CallbackListener& callback=&true& /&--& &/dubbo:method & &/dubbo:service&(2) 服务消费者: 服务消费者配置示例:Use our professional PDF creation service at http://www.htm2pdf.co.uk! consumer.xml &dubbo:reference id=&callbackService& interface=&com}

我要回帖

更多关于 dubbo jar包下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信