dubbo读取配置文件原理|dubbo server 怎么读取spring 配置文件

❶ java bbo配置文件中的“$”是哪个目录

是找不到来schema文件,解决方法如自下:

1、下载一个bbo.xsd文件;

2、在windows->preferrence->xml->xmlcatalogadd->catalog entry ->file system 选择刚刚下载的文件路径;

3、修改key值和配置文件的http://code.alibabatech.com/schema/bbo/bbo.xsd 相同保存。

4、在xml文件右键validate就可以k解决了。

❷ 调用bbo服务时事务配置在哪

bbo实现了分布式远程调用框架,多运行节点既能提高可靠性,又能提升负载能力。bbo配置主要有注册中心(推荐zookeeper或redis)、提供者provider、消费者consumer,注册中心是第三方实现,所以主要配置好服务提供者和消费者就可以了。实际上服务接口和实现都是需要我们自己设计和实现的,bbo做的事情就是将服务实现发布到注册中心,然后消费者从注册中心订阅服务接口,之后对接口的调用就由bbo调度提供者去执行并返回结果。以下配置都有源码,见右侧“免费资源”。提供者provider的配置:提供者是独立运行的节点,可以多实例运行,将服务注册到注册中心必须要有application name,注册中心配置zookeeper,协议bbo,超时6秒失败不重试,提供者加载repository和service层bean,然后发布接口service。<bbo:application name="ite-provider" /><bbo:registry address="zookeeper://127.0.0.1:2181"/><bbo:protocol name="bbo" port="20880" /><bbo:provider timeout="6000" retries="0"/><import resource="classpath:cache.xml"/><import resource="classpath:ite-repository.xml"/><import resource="classpath:ite-service.xml"/><import resource="classpath:ite-provider.xml"/>ite-provider.xml,ref引用的bean是ite-service.xml已经定义好的接口实现,bbo:service就是把接口实现发布到注册中心<bbo:service ref="codeListService" interface="com.itecheast.ite.domain.service.CodeListService" /><bbo:service ref="idService" interface="com.itecheast.ite.domain.service.IdService" /><bbo:service ref="passwordService" interface="com.itecheast.ite.domain.service.PasswordService" /><bbo:service ref="rolePermissionService" interface="com.itecheast.ite.domain.service.RolePermissionService" />provider是可以独立运行的,bbo.jar里面有assembly目录,运行mvn assembly:directory就可以生成能直接运行的provider目录assembly.xml内容,可以切换dir或tar.gz两种格式<assembly> <id>assembly</id> <formats> <!– <format>tar.gz</format> –> <format>dir</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <fileSet> <directory>src/main/assembly/bin</directory> <outputDirectory>bin</outputDirectory> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>src/main/assembly/conf</directory> <outputDirectory>conf</outputDirectory> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>src/test/resources</directory> <outputDirectory>conf</outputDirectory> <fileMode>0644</fileMode> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> </dependencySet> </dependencySets></assembly>bbo.properties,运行start.bat或start.sh时,将从属性文件读取bbo配置信息,provider节点可以多处复制并运行。bbo.container=log4j,springbbo.application.name=ite-providerbbo.registry.address=zookeeper://127.0.0.1:2181bbo.monitor.protocol=registrybbo.protocol.name=bbobbo.protocol.port=20880bbo.spring.config=provider.xmlbbo.log4j.file=logs/ite-provider.logbbo.log4j.level=WARN消费者consumer的配置,使用bbo:reference订阅注册中心里的服务即可,然后就可以@Autowired注入服务接口了。<bbo:application name="ite-consumer" /><bbo:registry address="zookeeper://127.0.0.1:2181"/><bbo:reference id="codeListService" interface="com.itecheast.ite.domain.service.CodeListService" /><bbo:reference id="idService" interface="com.itecheast.ite.domain.service.IdService" /><bbo:reference id="passwordService" interface="com.itecheast.ite.domain.service.PasswordService" /><bbo:reference id="rolePermissionService" interface="com.itecheast.ite.domain.service.RolePermissionService" />如果前端项目是一个消费者,就可以在web.xml里直接加载consumer.xml订阅服务了。<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:consumer.xml,classpath:cache.xml,classpath:shiro.xml,classpath:front.xml</param-value></context-param>实际上本地调试开发时,可以不必启用分布式配置,只需要更改web.xml即可,所有的服务都已经是配置好了的。<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:ite-repository.xml,classpath:ite-service.xml,classpath:cache.xml,classpath:shiro.xml,classpath:front.xml</param-value></context-param>zookeeper的配置很简单,wget http://tool.xlongwei.com/softwares/zookeeper-3.4.6.tar.gztar -zxvf zookeeper-3.4.6.tar.gzcd zookeeper-3.4.6/confcp zoo_sample.cfg zoo.cfgvi zoo.cfg #配置zookeeper参数单机配置(集群配置待研究)tickTime=2000initLimit=10syncLimit=5dataDir=/home/bbo/zookeeper-3.3.3/dataclientPort=2181运行或停止zookeepersh zkServer.sh start | stop

❸ bbo server 怎么读取spring 配置文件

Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止版Spring初始化完成,以权便上线时,能及早发现问题,默认check=true。 如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时

❹ bbo原理和机制

bbo原理和机制:应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。

监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。

服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。

服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。

(4)bbo读取配置文件原理扩展阅读

在大规模bbo服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。

(1)当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。

并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

(2)当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

(3)接着,服务的调用量越来越大,服务的容量问题就暴露出来。

为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

❺ bbo配置文件中register="false" 什么意思

register="true"时才能通过zookeeper找到相应接口的实现(由provider配置)如果配置成register="false",表示当前系统的服回务不发布到答注册中心,部署到生产后,web端会无法启动服务,在使用该接口的controller里会报错。

❻ bbo 配置文件中怎么做声明

Dubbo缺省会在启动时检抄查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上。可以通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。1、关闭某个服务的启动时检查:(没有提供者时报错)<bbo:reference interface="com.foo.BarService" check="false" />2、关闭所有服务的启动时检查:(没有提供者时报错) 写在定义服务消费者一方<bbo:consumer check="false" />3、关闭注册中心启动时检查:(注册订阅失败时报错)<bbo:registry check="false" />

❼ bbo是如何启动的

已知,在项目启动过程中,我们会将bbo的配置文件写到spring的配置文件里,如下xml文件:

<bbo:application name="anyname_provider" /><!– 使用zookeeper注册中心暴露服务地址 –><bbo:registry address="zookeeper://127.0.0.1:2181" /><!– 用bbo协议在20880端口暴露服务 –><bbo:protocol name="bbo" port="20880" /><!– 声明需要暴露的服务接口 –><bbo:service interface="com.shxz130.provider.Provider"ref="demoService" />

从官方文档中,我们能看到如下:

启动过程.png

也就是说spring启动过程中,随着Spring在初始化过程中,碰到bbo命名的标签,如(<bbo:service>,<bbo:registry>)等标签,会由DubboNamespaceHandler类处理,具体原理见链接Spring自定义标签

DubboBeanDefinitionParser代码如下:

public class DubboNamespaceHandler extends NamespaceHandlerSupport { static {Version.checkDuplicate(DubboNamespaceHandler.class);} public void init() {registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));registerBeanDefinitionParser("mole", new DubboBeanDefinitionParser(MoleConfig.class, true));registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));registerBeanDefinitionParser("annotation", new ());}}

遇到不同的标签,会由不同的Parser处理,这里重点看服务发布,这行代码:

registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));

也就是说,当Spring容器处理完<bbo:service>标签后,会在Spring容器中生成一个ServiceBean ,服务的发布也会在ServiceBean中完成。不妨看一下ServiceBean的定义:

public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware {}

该Bean实现了很多接口,关于InitializingBean,DisposableBean,ApplicationContextAware,BeanNameAware,这些接口的使用介绍如下链接:

InitializingBean&DisposableBean

BeanNameAware& ApplicationContextAware

而在Spring初始化完成Bean的组装,会调用InitializingBean的afterPropertiesSet方法,在Spring容器加载完成,会接收到事件ContextRefreshedEvent,调用ApplicationListener的onApplicationEvent方法。

在afterPropertiesSet中,和onApplicationEvent中,会调用export(),在export()中,会暴露bbo服务,具体区别在于是否配置了delay属性,是否延迟暴露,如果delay不为null,或者不为-1时,会在afterPropertiesSet中调用export()暴露bbo服务,如果为null,或者为-1时,会在Spring容器初始化完成,接收到ContextRefreshedEvent事件,调用onApplicationEvent,暴露bbo服务。

部分ServiceBean的代码如下:

public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware { //Spring容器初始化完成,调用public void onApplicationEvent(ContextRefreshedEvent event) { if (isDelay() && !isExported() && !isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } //暴露服务 export(); } } //判断是否延迟发布private boolean isDelay() { Integer delay = getDelay(); ProviderConfig provider = getProvider(); if (delay == null && provider != null) { delay = provider.getDelay(); } return supportedApplicationListener && (delay == null || delay == -1); } //当bean初始化完成调用public void afterPropertiesSet() throws Exception { //……此处省略10000行代码 if (!isDelay()) { //暴露服务 export(); } }}

在export(),暴露服务过程中,如果发现有delay属性,则延迟delay时间,暴露服务,如果没有,则直接暴露服务。

public synchronized void export() { //忽略若干行代码 if (delay != null && delay > 0) { //当delay不为null,且大于0时,延迟delay时间,暴露服务 delayExportExecutor.schele(new Runnable() { public void run() { //暴露服务 doExport(); } }, delay, TimeUnit.MILLISECONDS); } else { //直接暴露服务 doExport(); } }

而在doExport()中,验证参数,按照不同的Protocol,比如(bbo,injvm)暴露服务,在不同的zookeeper集群节点上注册自己的服务。

protected synchronized void doExport() { //忽略10000行代码 doExportUrls(); //忽略10000行代码 } private void doExportUrls() { List<URL> registryURLs = loadRegistries(true); for (ProtocolConfig protocolConfig : protocols) { //按照不同的Protocal暴露服务 doExportUrlsFor1Protocol(protocolConfig, registryURLs); } }

作者:一滴水的坚持链接:https://www.jianshu.com/p/7f3871492c71来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

❽ 如何更好地学习bbo源代码

1、Dubbo与Spring的整合 Dubbo在使用上可以做到非常简单,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用 spring bean一样进行服务暴露和调用了,完全看不到bbo api的存在。这是因为bbo使用了spring提供的可扩展Schema自定义配置支持。在spring配置文件中,可以像、这样进行配置。 META-INF下的spring.handlers文件中指定了bbo的xml解析类:DubboNamespaceHandler。像前面的被解 析成ServiceConfig,被解析成ReferenceConfig等等。 2、jdk spi扩展 由于Dubbo是开源框架,必须要提供很多的可扩展点。Dubbo是通过扩展jdk spi机制来实现可扩展的。具体来说,就是在META-INF目录下,放置文件名为接口全称,文件中为key、value键值对,value为具体实现类 的全类名,key为标志值。由于bbo使用了url总线的设计,即很多参数通过URL对象来传递,在实际中,具体要用到哪个值,可以通过url中的参 数值来指定。 Dubbo对spi的扩展是通过ExtensionLoader来实现的,查看ExtensionLoader的源码,可以看到Dubbo对jdk spi做了三个方面的扩展:(1)jdk spi仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;(2)Adaptive实现,就是生成一个代理类,这样就可以根据实际调用时的一些参数动态决定要调用的类了。(3)自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。 3、url总线设计 Dubbo为了使得各层解耦,采用了url总线的设计。我们通常的设计会把层与层之间的交互参数做成Model,这样层与层之间沟通成本比较大,扩展起来也比较麻烦。因此,Dubbo把各层之间的通信都采用url的形式。比如,注册中心启动时,参数的url为: registry://0.0.0.0:9090?codec=registry&transporter=netty 这就表示当前是注册中心,绑定到所有ip,端口是9090,解析器类型是registry,使用的底层网络通信框架是netty。 二、Dubbo启动过程Dubbo分为注册中心、服务提供者(provider)、服务消费者(consumer)三个部分。 1、注册中心启动过程 注册中心的启动过程,主要看两个类:RegistrySynchronizer、RegistryReceiver,两个类的初始化方法都是start。 RegistrySynchronizer的start方法:(1)把所有配置信息load到内存;(2)把当前注册中心信息保存到数据库;(3)启动5个定时器。 5个定时器的功能是: (1)AutoRedirectTask,自动重定向定时器。默认1小时运行1次。如果当前注册中心的连接数高于平均值的1.2倍,则将多出来的连接数重定向到其他注册中心上,以达到注册中心集群的连接数均衡。 (2)DirtyCheckTask,脏数据检查定时器。作用是:分别检查缓存provider、数据库provider、缓存consumer、数据库 consumer的数据,清除脏数据;清理不存活的provider和consumer数据;对于缓存中的存在的provider或consumer而数 据库不存在,重新注册和订阅。 (3)ChangedClearTask,changes变更表的定时清理任务。作用是读取changes表,清除过期数据。 (4)AlivedCheckTask,注册中心存活状态定时检查,会定时更新registries表的expire字段,用以判断注册中心的存活状态。如果有新的注册中心,发送同步消息,将当前所有注册中心的地址通知到所有客户端。 (5)ChangedCheckTask,变更检查定时器。检查changes表的变更,检查类型包括:参数覆盖变更、路由变更、服务消费者变更、权重变更、负载均衡变更。

❾ springmvc+bbo配置问题

换个javassist包,比如javassist-3.18.2-GA.jar,一定是某些版本的包中少了相关的类导致类加载失败

❿ Dubbo的工作原理

Provider暴露服务方称之为“服务提供者”。Consumer调用远程服务方称之为“服务消费者”。Registry服务注册与发现的中心目录服务称之为“服务注册中心”。Monitor统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”。(1) 连通性:注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表注册中心和监控中心都是可选的,服务消费者可以直连服务提供者(2) 健壮性:监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将自动切换到另一台注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯服务提供者无状态,任意一台宕掉后,不影响使用服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复(3) 伸缩性:注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者


赞 (0)