ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:40.58KB ,
资源ID:9454766      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9454766.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(Dubbo服务调用动态选择版本.docx)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Dubbo服务调用动态选择版本.docx

1、Dubbo服务调用动态选择版本 问题说明 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,致力于高性能和透明化的远程服务调用方案和服务治理方案。官方文档见:http://alibaba.github.io/dubbo-doc-static/Home-zh.htm。Dubbo可以和Spring无缝集成,示例如下: 1. 服务提供端 Provider.xml

2、bbo:registry address="zookeeper://132.228.12.40:2181" /> HelloServiceImpl.java package com.telecom.dubbo.provider; import org.springframework.stereot

3、ype.Service; import com.telecom.dubbo.intf.IHelloService; @Service("helloService") public class HelloServiceImpl implements IHelloService{ @Override public String sayHello(String name) { return "Hello "+name; } } 2. 客户端调用 Consumer.xml

4、onent-scan base-package="com.telecom.**" /> 服务端 dubbo:service 和 客户端 dubbo:reference 分别有1个version属性。说明:服务端发布provider时可以为服务分配1个版本号,客户端调用服务端的provider时,需要指定调用哪1个版本的服务。项目实施过程碰到一些问题: 1. version属性在xml文件中配置,意味着服务端升级版本号,客户端也要相应修改配置文件并重启应用。 2. 项目中存在灰度发布的要求,服务端的provider可能同时存在多个版本,客户端根据用户工号来选择调用哪个版本,比如指定一批测试工号,来测试新版本的

6、provider。整个发布过程需要不重启web应用实现无缝切换,客户端在xml文件中指定版本号就显得不够,dubbo需要支持客户端自行实现版本选择规则,根据规则决定调用相应版本的provider。 本文描述了如何重载dubbo的部分代码实现客户端版本规则。 实现思路 通过分析dubbo 2.5.3 的源码, 标签对应的类是 com.alibaba.dubbo.config.spring.ReferenceBean 的version属性被写到ReferenceBean的version属性中,可以通过Referen

7、ceBean.getVersion() 来获取配置文件中指定的远程服务的版本号。 该类是工厂类,实现 org.springframework.beans.factory.FactoryBean,第64行代码 public Object getObject() throws Exception {         return get(); } 返回IHelloService的代理对象,调用该对象的sayHello方法即可调用远程dubbo服务,远程服务的版本号由ReferenceBean的version属性决定。 本文的实现方法是重载 ReferenceBean 的get()

8、方法,使用javassist技术构造一个新的代理,根据用户自定义的规则来调用相应版本的dubbo服务。 实现方法 重写ReferenceBean package com.telecom.dubbo.extend; import java.lang.reflect.Method; import java.util.concurrent.ConcurrentHashMap; import org.springframework.context.ApplicationContext; import com.alibaba.dubbo.config.ReferenceCo

9、nfig; import com.alibaba.dubbo.config.annotation.Reference; import javassist.util.proxy.MethodHandler; import javassist.util.proxy.ProxyFactory; import javassist.util.proxy.ProxyObject; /** * 自定义的referencebean,该类会创建动态代理,运行时根据上下文的版本号选择远程服务 * @author wuchangzheng * * @param */

10、public class ReferenceBean extends com.alibaba.dubbo.config.spring.ReferenceBean implements Cloneable{ private static final long serialVersionUID = 8383612147446385736L; private transient T proxy;//代理 private transient IVersionDesider versionDesider;//版本决定器 private transient Appl

11、icationContext applicationContext; private transient ReferenceBean self_=this; private transient ConcurrentHashMap versionMap = new ConcurrentHashMap(); private transient final String DEFAULT_VERSION="DEFAULT_VERSION"; @SuppressWarnings({ "all"

12、}) public void setApplicationContext(ApplicationContext applicationContext){ super.setApplicationContext(applicationContext); this.applicationContext=applicationContext; } @SuppressWarnings({ "all"}) public void afterPropertiesSet() throws Exception{ super.afterPropertiesSet();

13、 try{ versionDesider=applicationContext.getBean(IVersionDesider.class);//从上下文中查找IVersionDesider实现,该实现代表用户自定义版本规则 }catch(Exception ex){ versionDesider = null; } proxy=getVersionDecideProxy();//创建代理对象 } /** * * @return * @throws ClassNotFoundException * @throws Insta

14、ntiationException * @throws IllegalAccessException */ @SuppressWarnings({ "all"}) private T getVersionDecideProxy() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ // 创建代理工厂 ProxyFactory proxyFactory = new ProxyFactory(); Class[] interf

15、aces={Class.forName(this.getInterface())}; proxyFactory.setInterfaces(interfaces); // 创建代理类型的Class Class proxyClass = proxyFactory.createClass(); T proxy = (T) proxyClass.newInstance(); ((ProxyObject) proxy).setHandler(new MethodHandler()

16、 { @Override public T invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable { T target = null; String version=DEFAULT_VERSION; if (versionDesider!=null){ version

17、versionDesider.desideVersion(self_); } if (version==null) version=DEFAULT_VERSION; ReferenceConfig config =null; synchronized(self_){ config=versionMap.get(version); if (config==null){ config=(ReferenceConfig)self_.clone(

18、); config.setVersion(version); config.setCheck(false);// versionMap.put(version, config); } } target = (T)config.get(); T retObj = (T)thisMethod.invoke(target, args); return retObj;

19、 } }); return proxy; } public Object getObject() throws Exception { return proxy; } } 重载dubbo命名空间解析器 /* * Copyright 1999-2011 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use

20、this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS,

21、 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.telecom.dubbo.extend; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; i

22、mport mon.Version; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ConsumerConfig; import com.alibaba.dubbo.config.ModuleConfig; import com.alibaba.dubbo.config.MonitorConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.Pro

23、viderConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.AnnotationBean; import com.telecom.dubbo.extend.ReferenceBean; import com.alibaba.dubbo.config.spring.ServiceBean; /** * DubboNamespaceHandler * * @author william.liangf * @export */

24、 public class DubboNamespaceHandler extends NamespaceHandlerSupport { static { Version.checkDuplicate(DubboNamespaceHandler.class); } public void init() { registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true)); registerB

25、eanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true)); registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true)); registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, tr

26、ue)); registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true)); registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true)); registerBeanDefinitionParser("protocol", new DubboBeanDefinitionP

27、arser(ProtocolConfig.class, true)); registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true)); registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false)); registerBeanDefinitionParser("annotati

28、on", new DubboBeanDefinitionParser(AnnotationBean.class, true)); } } /* * Copyright 1999-2011 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the Li

29、cense at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See

30、the License for the specific language governing permissions and * limitations under the License. */ package com.telecom.dubbo.extend; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Date; import java.util.HashSet; import java.util.Set; import java.ut

31、il.regex.Pattern; import org.springframework.beans.PropertyValue; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframew

32、ork.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionPa

33、rser; import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import mon.Constants; import mon.extension.ExtensionLoader; import mon.logger.Logger; import mon.logger.Logg

34、erFactory; import mon.utils.ReflectUtils; import mon.utils.StringUtils; import com.alibaba.dubbo.config.ArgumentConfig; import com.alibaba.dubbo.config.ConsumerConfig; import com.alibaba.dubbo.config.MethodConfig; import com.alibaba.dubbo.config.MonitorConfig; import com.alibaba.dubbo.config.

35、ProtocolConfig; import com.alibaba.dubbo.config.ProviderConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.telecom.dubbo.extend.ReferenceBean; import com.alibaba.dubbo.config.spring.ServiceBean; import com.alibaba.dubbo.rpc.Protocol; /** * AbstractBeanDefinitionParser *

36、 * @author william.liangf * @export */ public class DubboBeanDefinitionParser implements BeanDefinitionParser { private static final Logger logger = LoggerFactory.getLogger(DubboBeanDefinitionParser.class); private final Class beanClass; private final boolean requi

37、red; public DubboBeanDefinitionParser(Class beanClass, boolean required) { this.beanClass = beanClass; this.required = required; } public BeanDefinition parse(Element element, ParserContext parserContext) { return parse(element, parserContext, beanCla

38、ss, required); } @SuppressWarnings("unchecked") private static BeanDefinition parse(Element element, ParserContext parserContext, Class beanClass, boolean required) { RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.setBeanClass(b

39、eanClass); beanDefinition.setLazyInit(false); String id = element.getAttribute("id"); if ((id == null || id.length() == 0) && required) { String generatedBeanName = element.getAttribute("name"); if (generatedBeanName == null || generatedBeanName.length(

40、) == 0) { if (ProtocolConfig.class.equals(beanClass)) { generatedBeanName = "dubbo"; } else { generatedBeanName = element.getAttribute("interface"); } } if (generatedBeanName == null || generatedBeanNam

41、e.length() == 0) { generatedBeanName = beanClass.getName(); } id = generatedBeanName; int counter = 2; while(parserContext.getRegistry().containsBeanDefinition(id)) { id = generatedBeanName + (counter ++); }

42、 } if (id != null && id.length() > 0) { if (parserContext.getRegistry().containsBeanDefinition(id)) { throw new IllegalStateException("Duplicate spring bean id " + id); } parserContext.getRegistry().registerBeanDefinition(id, beanDefini

43、tion); beanDefinition.getPropertyValues().addPropertyValue("id", id); } if (ProtocolConfig.class.equals(beanClass)) { for (String name : parserContext.getRegistry().getBeanDefinitionNames()) { BeanDefinition definition = parserContext.getR

44、egistry().getBeanDefinition(name); PropertyValue property = definition.getPropertyValues().getPropertyValue("protocol"); if (property != null) { Object value = property.getValue(); if (value instanceof ProtocolConfig && id.e

45、quals(((ProtocolConfig) value).getName())) { definition.getPropertyValues().addPropertyValue("protocol", new RuntimeBeanReference(id)); } } } } else if (ServiceBean.class.equals(beanClass)) { String cla

46、ssName = element.getAttribute("class"); if(className != null && className.length() > 0) { RootBeanDefinition classDefinition = new RootBeanDefinition(); classDefinition.setBeanClass(ReflectUtils.forName(className)); classDefinition.setL

47、azyInit(false); parseProperties(element.getChildNodes(), classDefinition); beanDefinition.getPropertyValues().addPropertyValue("ref", new BeanDefinitionHolder(classDefinition, id + "Impl")); } } else if (ProviderConfig.class.equals(beanClass))

48、{ parseNested(element, parserContext, ServiceBean.class, true, "service", "provider", id, beanDefinition); } else if (ConsumerConfig.class.equals(beanClass)) { parseNested(element, parserContext, ReferenceBean.class, false, "reference", "consumer", id, beanDefiniti

49、on); } Set props = new HashSet(); ManagedMap parameters = null; for (Method setter : beanClass.getMethods()) { String name = setter.getName(); if (name.length() > 3 && name.startsWith("set") && Modifier.isPublic(setter.getModifiers()) && setter.getParameterTypes().length == 1) { Class type = setter.getParameterT

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服