dubbo完整的配置文件|eclipse jetty启动dubbo 怎么配置

① Dubbo配置参数详解-generic

画外音:目前Dubbo在开源中国举办的2019年度最受欢迎中国开源软件中排名第3名,支持Dubbo的朋友可以去投票哇。 2019年度最受欢迎中国开源软件

Consumer端正常调用Dubbo服务时,一般都需要服务提供方提供一个jar包,只有在项目中引入该jar包,才能调用相关服务;能不能向http调用那样,我只需手颤要知道我要调用的url就可以直接调用Dubbo服务?

有的,这就是generic做的事。

generic :通用服务调用,当我们已经知道我们要调用的服务的全限定闹薯磨名及方法,就不需要服务提供者的jar就能调用Dubbo服务了。

generic要配合interfaceName参数一起使用,其中interfaceName是Dubbo服务的全限定名,比如:

当provider接收到请求时,会调用一系列的过滤器对请求进行处理,这其中就包含处理generic的过滤器: GenericFilter 该过滤器会判断液斗调用的方法是否是$invoke,如果是则会通过反射调用正在的方法

笔者认为该参数最大的用武之地是作为网关使用,笔者所在公司的网关就提供了http转换成bbo接口调用的功能,前端使用http调用,后端使用bbo服务进行处理;网关提供一个接口配置页面,只需要业务方在页面配置url与bbo接口的转换关系即可,网关不需要引用服务提供者的jar包,如果接口有变动,网关无需知道,只要业务方修改配置即可。

② bbo version: 2.6.0, current host: 192.168.245.1

您可以通过修改橡大缓Dubbo配置文件来设置Dubbo应用的IP地址。Dubbo应用的IP地址可以通过bbo.registry.address配置项来指定。例如,您可以在Dubbo配置文件中添加以下配置项:bbo.registry.address = zookeeper://192.168.245.1:2181这里的IP地址为您希望Dubbo应用使用的IP地址。这个配置仿困项指定了Dubbo应用使用Zookeeper作为注册中心,并将Zookeeper的地址设置为192.168.245.1:2181。您也可以使用其他类型的注册中心,例如Redis、Consul等,具体配置方梁模式可以参考Dubbo文档。

③ Dubbo的多注册中心配置

最近项目中用到了Dubbo,Zookeeper,因为底层不同服务之间的调用,宴团涉及到了不同的注册前祥磨中心。由此写一下关于多注册中心的配置。 SpringBoot框架: 使用yml配置: bbo:     registry:         protocol: zookeeper         address: ****.****:2181|****.****:2181 注意:| 竖线分割线就是表示不同的注册中心 bbo:     registry:         protocol: zookeeper         address: ****.****:2181,****.****:2181 注意:, 逗号表示同慧斗一注册中心不同的集群 Spring xml配置 注册到不同的服务中心<bbo:registry id="bbo" address="****.****:2181"/> <bbo:registry id="bbo" address="****.****:2181"/>个人公号:【排骨肉段】,可以关注一下。

④ 调用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

⑤ Dubbo(一)——Dubbo 集成于 Spring 的原理

最近一直在看bbo的源码部分。在阅读耐团的时候,需要有一个入手点,才能一点一点的进行下去。自己在研究的时候,发现思绪比较乱,于是就以 芋道源码 为基础,一点一点的啃食。芋道源码是直接从bbo的配置和一些核心的API开始讲起,是从bbo已经启动的过程作为开始节点岩亩猜,而这些核心 API 与 Spring 的之间的关系被省略了,这些东西对我来说属于前置的知识点,所以花了比较长的时间又从 Dubbo 的核心 API 倒着往前看。

在阅读 Dubbo 时,发现前置知识越来越多,如:Spring 的 refresh 中的一些核心点,Spring 中 bean 的生命周期,BeanFactory 与 FactoryBean 的区别等。所以这些前置知识花了特别多的时间去补。所幸,虽然补前置知识虽然时间长,但是性价比还是可以的。Dubbo 是依赖于Spring 的上下文环境的框架,其他依赖于 Spring 的框架也是相同的道理。Spring 的一些对外的扩展点,读过之后也会心中有数。

1、本篇主要是描述了 Dubbo 在 Spring 创建上下文的时候,是如何从创建,到能完整提供一个RPC调用能力的一些相关点。 2、由于源码比较多,直接贴断点也太过臃肿,所以仅仅贴一些关键点来概括整个流程。 3、本文是依赖于前面的 bbo 项目进行断点分析,项目结构可以参照这里。项目中 bbo 的配置方式是 xml 文件,所以本篇主要说 xml 配置方式。其他方式道理相同,并不是问题的关键点。

4、项目启动的是 bbo-user 服务,所以 UserService 为 bbo:service,OrderService 为 bbo:reference。

下图为Spring 启动时是如何加载 Dubbo 的,其中省略了大量过程,只保留了一些关键节点,省略的部分可以略微脑补一下。

整个流程的入口是 Spring 的 refresh 方法。每个方法都有比较深的调用栈。与 Dubbo 有关的入口是 refresh 中的 方法

这个方法是执行 beanFactory 的一些后处理操作,其核心流程为在Spring容器中找出实现了BeanFactoryPostProcessor接口的processor并执行。Spring容器会委托给的方法执行。 是比较核心的类,在这里我们关注一下这个类。它的作用是对项目中配置的类进行处理。具体处理粗型可以分为几步:

在加载类信息时,spring 会去用各种方式扫到注册的 bean 信息。我们在 spring 中注册的 bean,逃不出这个方法的扫描方式。 核心方法是:

扫描之后,会将扫描到的 bean 注册到 beanDefinitionMap 中

首先是此处 org.springframework.beans.factory.xml.#parseBeanDefinitions,可以看出方法会以配置文件根节点起,遍历所有子节点。

其次是这里 org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element, org.springframework.beans.factory.config.BeanDefinition), 此方法会通过解析出来的节点,获取对应的 Spring 的 namespaceUri ,进而获取对应的配置文件处理器。 此处 ele 参数实际值为 <bbo:service … />,namespaceUri 为 http://code.alibabatech.com/schema/bbo

我们看一下 resolve 方法中的细节。因为这个方法内部才是 Dubbo 依赖于 Spring 的关键点。

此处的 NamespaceHandler 为 DubboNamespaceHandler,再创建结束之后,进行 init 初始化。

可以看到,DubboNamespaceHandler 在初始化的时候,会创建所有 bbo 标签对应的Config 类的 DubboBeanDefinitionParser。并将 DubboBeanDefinitionParser 和 对应的 bbo 标签类注册到 NamespaceHandlerSupport 的 parsers 中。

最后,会在 com.alibaba.bbo.config.spring.schema.DubboBeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, java.lang.Class<?>, boolean) 方法中进行处理

Dubbo 服务比较特殊,beanDefinition 跟普通的 bean 不太一样。在向 beanDefinitionMap 注册时,普通的 beanDefinition 的 beanName 与 beanClass 是对应的;而 bbo 服务的 beanDefinition 的 beanName 是bbo 服务的名称,beanClass 为 bbo 对应的 Bean。

普通的 beanDefinition:

bbo 引用的服务的 beanDefinition:

这一步的核心流程是从 beanFactory 中获取所有的 ApplicationListener,然后注册到监听器集合中。它的关键点其实是 ServiceBean。因为 ServiceBean 是 ApplicationListener 的实现。

所以 beanFactory 中 ServiceBean 也会被注册到监听器集合中。项目中的 ServiceBean 的 beanClass 实际是 UserService。

这一步的核心点,主要是创建剩余的各类对象,并将其保存到 singletonObjects 中。其中关联的前置知识为 Spring 中 bean 的生命周期 。它的核心方法是: org.springframework.beans.factory.support.#doCreateBean

它的具体流程为:

ps:此处并不是只有这一步才会跟 bean 生命周期相关,bean 生命周期贯穿在 refresh 的很多流程中,只要执行doGetBean 方法,都会走这个流程。此处仅仅借楼关联一下。

这一步的核心点,是通知所有的监听器上下文刷新结束的事件。在这一步执行时,会通知到 ServiceBean。

此处暴露的是 UserService。

Dubbo 的启动条件是完全依赖于 Spring 的启动流程,Spring 的启动流程中核心的点是 refresh 方法。所以只要搞懂 refresh 方法,其他的拓展框架流程也会明白。只不过关联的知识点太多了,还是需要时间的积累才能一点一点的搞懂。 如果本篇有描述不清,或者描述有误的地方,还望在下方留言,大家一起交流,一起学习,一起进步~

⑥ Dubbo简介

Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。 Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。 Dubbo的特点: (1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。 (2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不像使用WebService一样每个服务都得记录好接口调用方式。 (3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。 (4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。 (5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。 Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。1、监控中心的配置文件-bbo.properties文件 (1)容器,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j     bbo.container = log4j,spring,registry,jetty (2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务     bbo.application.name = simple-monitor (3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人     bbo.application.owner = coselding (4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。     bbo.registr.address = multicast://{ip}:{port} //广播     bbo.registr.address = zookeeper://{ip}:{port} //zookeper     bbo.registr.address = redis://{ip}:{port} //redis     bbo.registr.address = bbo://{ip}:{port} //bbo (5)bbo协议端口号     bbo.protocol.port = 7070 (6)jetty工作端口号     bbo.jetty.port = 8082 (7)工作目录,用于存放监控中心的数据     bbo.jetty.directory = ${user.home}/monitor (8)监控中心报表存放目录     bbo.charts.directory=${bbo.jetty.directory}/charts (9)监控中心数据资料目录     bbo.statistics.directory=${user.home}/monitor/statistics (10)监控中心日志文件路径     bbo.log4j.file=logs/bbo-monitor-simple.log (11)监控中心日志记录级别     bbo.log4j.level=WARN 2、Dubbo提供负载均衡方式 (1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。 (2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。 (3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。 (4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。 3、Dubbo过滤器 Dubbo初始化过程加载ClassPath下的META-INF/bbo/internal/,META-INF/bbo/,META-INF/services/三个路径下的com.alibaba.bbo.rpc.Filter文件。文件内容:     Name = FullClassName,这些类必须实现Filter接口。自定义Filter类: 配置文件在配置过滤器,consumer.xml中:Dubbo对过滤器的加载过程:     先加载三个路径下的com.alibaba.bbo.rpc.Filter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。     自定义的类中@Active注解是过滤器设定的全局基本属性。     Spring在加载consumer.xml文件时,通过 <bbo:consumer filter="xxx" id = "xxx" retrries = "0">这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。 @Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有bbo URL中包含该参数名且参数值不为空才被加载,这个参数会以bbo协议的一个参数K-V对传到Provider。 4、Dubbo的Provider配置 5、Dubbo的Consumer配置 1、Dubbo是什么? Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。 2、为什么使用Dubbo? 很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。 使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。 Dubbo的服务治理图: 3、Dubbo和Spring Cloud的区别 两个没有关联,但是非要说区别,有如下几点: (1)通信方式不同,Dubbo使用RPC通信,Spring Cloud使用HTTP Restful方式 (2)组成部分不同4、Dubbo支持的协议 bbo://  (推荐);rmi:// ;hessian:// ;http:// ;webservice:// ;thrift:// ;memcached:// ;redis:// ;rest:// 。 5、Dubbo需要容器吗? 不需要,如果硬要容器的话,会增加复杂性,同时也浪费资源。 6、Dubbo内置的服务容器 Spring Container;Jetty Container;Log4j Container。 7、Dubbo中节点角色 Register,Monitor,Provider,Consumer,Container(服务运行的容器)。 8、Dubbo的服务注册和发现的流程图 9、Dubbo的注册中心 默认使用Zookeper作为注册中心,还有Redis,Multicast,bbo注册中心。 10、Dubbo的配置方式 Spring配置方式和Java API配置方式 11、Dubbo的核心配置 (1)bbo:service 服务配置 (2)bbo:referece 引用配置 (3)bbo:protocol 协议配置 (4)bbo:application 应用配置 (5)bbo:registry 注册中心配置 (6)bbo:monitor 监控中心配置 (7)bbo:provider 提供方配置 (8)bbo:consumer 消费方配置 (9)bbo:method 方法配置 (10)bbo:argument 参数配置 12、在Provider 节点上可以配置Consumer端的属性有哪些? (1)timeout:方法调用超时 (2)retries:失败重试次数,默认是2次 (3)loadbalance:负载均衡算法,默认随机 (4)actives消费者端,最大并发调用控制 13、Dubbo启动时如果依赖的服务不可用会怎样 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。默认check ="true"。 14、Dubbo序列化框架 推荐使用Hessian序列化,还有Dubbo,Fastjson,Java自带序列化。 15、Dubbo的通信框架 默认使用Netty框架,另外也提供了Mina,Grizzly。 16、Dubbo集群容错方案 (1)Failover Cluster,失败自动切换,自动重试其他服务器。 (2)Failfast Cluster,快速失败,立即报错,只发起一次调用。 (3)Failsafe Cluster,失败安全,出现异常时,直接忽略。 (4)Failback Cluster,失败自动恢复,记录失败请求,定时重发。 (5)Forking Cluster,并行调用多个服务器,只要一个返回成功即可。 (6)Broadcast Cluster,广播逐个调用所有提供者,任意一个报错则报错。 17、Dubbo的负载均衡策略 (1)Random LoadBalance,随机,按权重设置随机概率,默认。 (2)RoundRobin LoadBalace,轮询,按公约后的权重设置轮训比例。 (3)LeastActive LoadBalace,最少活跃调用数,相同活跃数的随机。 (4)ConsistenHash LoadBalance,一致性hash,相同参数的请求总是发到用一个服务器。 18、指定某一个服务 可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。 <bbo:reference interface="com.weidian.bbo.IMyDemo" version="1.0" id="myDemo" url="bbo://127.0.0.1:20880/"></bbo:reference> 19、Dubbo多协议 Dubbo允许配置多协议,在不同服务器上支持不同协议,或者同一服务支持多种协议。 20、当一个服务有多种实现时怎么做? 当一个接口有多种是现实,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。 21、兼容旧版本 使用版本号过度,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。 22、Dubbo可以缓存吗? Dubbo提供声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。 23、Dubbo服务之间的调用时阻塞的吗? 默认是同步等待结果阻塞的,支持异步调用。Dubbo是基于NIO的非阻塞实现并行调用的,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个Future对象。 24、Dubbo不支持分布式事务 25、Dubbo必须依赖的包 Dubbo必须依赖JDK,其他为可选。 26、Dubbo使用过程中的问题 Dubbo的设计目的是为了满足高并发小数据量的rpc请求,在大数据量下性能表现不是很好,建议使用rmi或http协议。 27、Dubbo的管理控制台的作用 路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡。 28、Spring boot整合Dubbo (1)添加依赖         <!– https://mvnrepository.com/artifact/com.alibaba.boot/bbo-spring-boot-project –>         <dependency>             <groupId>com.alibaba.boot</groupId>             <artifactId>bbo-spring-boot-starter</artifactId>             <version>0.1.0</version>         </dependency>         <!– https://mvnrepository.com/artifact/com.101tec/zkclient –>         <dependency>             <groupId>com.101tec</groupId>             <artifactId>zkclient</artifactId>             <version>0.10</version>         </dependency>(2)配置bbo     ## Dubbo 服务提供者配置     spring.bbo.application.name=provider     spring.bbo.registry.address=zookeeper://127.0.0.1:2181     spring.bbo.protocol.name=bbo     spring.bbo.protocol.port=20880     spring.bbo.scan=org.spring.springboot.bbo    ## Dubbo 服务消费者配置     spring.bbo.application.name=consumer     spring.bbo.registry.address=zookeeper://127.0.0.1:2181     spring.bbo.scan=org.spring.springboot.bbo

⑦ eclipse jetty启动bbo 怎么配置

eclipse jetty启动

DUBBO安装配置注意事项

管理端:

记得更改TOMCAT的端口号,不然会和监控器的8080冲突(如何部署在同一机器)

bbo.properties 文件bbo.registry.address=zookeeper://x.x.x.x:2181bbo.admin.root.password=用户bbo.admin.guest.password=密码

=============

监控端:

bbo.properties文件

bbo.container=log4j,spring,registry,jettybbo.application.name=simple-monitorbbo.application.owner=#bbo.registry.address=multicast://224.5.6.7:1234#bbo.registry.address=zookeeper://127.0.0.1:2181#bbo.registry.address=redis://127.0.0.1:6379#bbo.registry.address=bbo://127.0.0.1:9090bbo.registry.address=zookeeper://x.x.x.x:2181bbo.protocol.port=7070bbo.jetty.port=8080bbo.jetty.directory=${user.home}/monitorbbo.charts.directory=${bbo.jetty.directory}/chartsbbo.statistics.directory=${user.home}/monitor/statisticsbbo.log4j.file=logs/bbo-monitor-simple.logbbo.log4j.level=WARN

在安装的时候,小峤同学遇到了一个妖怪的问题,就是监控端可能只能在JDK1.8以上的版本才能启动,在JDK1.7上启动时,老是说什么MONITOR进程已存在启动,然后就停了。

我直接注释相关的SHELL就搞定了。。

不知对不对。。

if [ -z "$SERVER_NAME" ]; thenSERVER_NAME=`hostname`fi#PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`#if [ -n "$PIDS" ]; then# echo "ERROR: The $SERVER_NAME already started!"# echo "PID: $PIDS"# exit 1#fiif [ -n "$SERVER_PORT" ]; thenSERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l` if [ $SERVER_PORT_COUNT -gt 0 ]; thenecho "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"exit 1fifi

⑧ Dubbo与Zookeeper集群配置

bbo.properties配置: bbo.application.name=sdp_order_srv #zk集群的时候bbo只能这样配置 bbo.service.register.address=zookeeper://10.10.100.152:3181?backup=10.10.100.152:4181,10.10.100.152:5181 #zk单点的话下面两种简辩配置都可乎念以 #bbo.service.register.address=zookeeper:/拦顷缺/${zookeeper.address} #bbo.service.register.address=zookeeper://10.1.203.171:2181 bbo.service.protocol.name=bbo bbo.service.protocol.port=20885 zk配置 #\u7cfb\u7edf\u53c2\u6570\u914d\u7f6e zookeeper.sessionTimeout=60000 zookeeper.connectionTimeout=5000 #zk集群配置 zookeeper.address=10.10.100.152:3181,10.10.100.152:4181,10.10.100.152:5181 zookeeper.connect.status=true zookeeper.connect.countersign=false zookeeper.connect.username= zookeeper.connect.password=

⑨ Dubbo——HTTP 协议 + JSON-RPC

Protocol 还有一个实现分支是 AbstractProxyProtocol,如下图所示: 从图中我们可以看到:gRPC、HTTP、WebService、Hessian、Thrift 等协议对应的 Protocol 实现,都是继承自 AbstractProxyProtocol 抽象类。 目前互联网的技术栈百花齐放,很多公司会使用 Node.js、Python、Rails、Go 等语言来开发 一些 Web 端应用,同时又有很多服务会使用 Java 技术栈实现,这就出现了大量的跨语言调用的需求。Dubbo 作为一个 RPC 框架,自然也希望能实现这种跨语言的调用,目前 Dubbo 中使用“HTTP 协议 + JSON-RPC”的方式来达到这一目的,其中 HTTP 协议和 JSON 都是天然跨语言的标准,在各种语言中都有成熟的类库。 下面就重点来分析 Dubbo 对 HTTP 协议的支持。首先,会介绍 JSON-RPC 的基础,并通过一个示例,快速入门,然后介绍 Dubbo 中 HttpProtocol 的具体实现,也就是如何将 HTTP 协议与 JSON-RPC 结合使用,实现跨语言调用的效果。 Dubbo 中支持的 HTTP 协议实际上使用的是 JSON-RPC 协议。 JSON-RPC 是基于 JSON 的跨语言远程调用协议。Dubbo 中的 bbo-rpc-xml、bbo-rpc-webservice 等模块支持的 XML-RPC、WebService 等协议与 JSON-RPC 一样,都是基于文本的协议,只不过 JSON 的格式比 XML、WebService 等格式更加简洁、紧凑。与 Dubbo 协议、Hessian 协议等二进制协议相比,JSON-RPC 更便于调试和实现,可见 JSON-RPC 协议还是一款非常优秀的远程调用协议。 在 Java 体系中,有很多成熟的 JSON-RPC 框架,例如 jsonrpc4j、jpoxy 等,其中,jsonrpc4j 本身体积小巧,使用方便,既可以独立使用,也可以与 Spring 无缝集合,非常适合基于 Spring 的项目。 下面先来看看 JSON-RPC 协议中请求的基本格式: JSON-RPC请求中各个字段的含义如下: 在 JSON-RPC 的服务端收到调用请求之后,会查找到相应的方法并进行调用,然后将方法的返回值整理成如下格式,返回给客户端: JSON-RPC响应中各个字段的含义如下: Dubbo 使用 jsonrpc4j 库来实现 JSON-RPC 协议,下面使用 jsonrpc4j 编写一个简单的 JSON-RPC 服务端示例程序和客户端示例程序,并通过这两个示例程序说明 jsonrpc4j 最基本的使用方式。 首先,需要创建服务端和客户端都需要的 domain 类以及服务接口。先来创建一个 User 类,作为最基础的数据对象: 接下来创建一个 UserService 接口作为服务接口,其中定义了 5 个方法,分别用来创建 User、查询 User 以及相关信息、删除 User: UserServiceImpl 是 UserService 接口的实现类,其中使用一个 ArrayList 集合管理 User 对象,具体实现如下: 整个用户管理业务的核心大致如此。下面我们来看服务端如何将 UserService 与 JSON-RPC 关联起来。 首先,创建 RpcServlet 类,它是 HttpServlet 的子类,并覆盖了 HttpServlet 的 service() 方法。我们知道,HttpServlet 在收到 GET 和 POST 请求的时候,最终会调用其 service() 方法进行处理;HttpServlet 还会将 HTTP 请求和响应封装成 HttpServletRequest 和 HttpServletResponse 传入 service() 方法之中。这里的 RpcServlet 实现之中会创建一个 JsonRpcServer,并在 service() 方法中将 HTTP 请求委托给 JsonRpcServer 进行处理: 最后,创建一个 JsonRpcServer 作为服务端的入口类,在其 main() 方法中会启动 Jetty 作为 Web 容器,具体实现如下: 这里使用到的 web.xml 配置文件如下: 完成服务端的编写之后,下面再继续编写 JSON-RPC 的客户端。在 JsonRpcClient 中会创建 JsonRpcHttpClient,并通过 JsonRpcHttpClient 请求服务端: 在 AbstractProxyProtocol 的 export() 方法中,首先会根据 URL 检查 exporterMap 缓存,如果查询失败,则会调用 ProxyFactory.getProxy() 方法将 Invoker 封装成业务接口的代理类,然后通过子类实现的 doExport() 方法启动底层的 ProxyProtocolServer,并初始化 serverMap 集合。具体实现如下: 在 HttpProtocol 的 doExport() 方法中,与前面介绍的 DubboProtocol 的实现类似,也要启动一个 RemotingServer。为了适配各种 HTTP 服务器,例如,Tomcat、Jetty 等,Dubbo 在 Transporter 层抽象出了一个 HttpServer 的接口。 bbo-remoting-http 模块的入口是 HttpBinder 接口,它被 @SPI 注解修饰,是一个扩展接口,有三个扩展实现,默认使用的是 JettyHttpBinder 实现,如下图所示: HttpBinder 接口中的 bind() 方法被 @Adaptive 注解修饰,会根据 URL 的 server 参数选择相应的 HttpBinder 扩展实现,不同 HttpBinder 实现返回相应的 HttpServer 实现。HttpServer 的继承关系如下图所示: 这里以 JettyHttpServer 为例简单介绍 HttpServer 的实现,在 JettyHttpServer 中会初始化 Jetty Server,其中会配置 Jetty Server 使用到的线程池以及处理请求 Handler: 可以看到 JettyHttpServer 收到的全部请求将委托给 DispatcherServlet 这个 HttpServlet 实现,而 DispatcherServlet 的 service() 方法会把请求委托给对应接端口的 HttpHandler 处理: 了解了 Dubbo 对 HttpServer 的抽象以及 JettyHttpServer 的核心之后,回到 HttpProtocol 中的 doExport() 方法继续分析。 在 HttpProtocol.doExport() 方法中会通过 HttpBinder 创建前面介绍的 HttpServer 对象,并记录到 serverMap 中用来接收 HTTP 请求。这里初始化 HttpServer 以及处理请求用到的 HttpHandler 是 HttpProtocol 中的内部类,在其他使用 HTTP 协议作为基础的 RPC 协议实现中也有类似的 HttpHandler 实现类,如下图所示: 在 HttpProtocol.InternalHandler 中的 handle() 实现中,会将请求委托给 skeletonMap 集合中记录的 JsonRpcServer 对象进行处理: skeletonMap 集合中的 JsonRpcServer 是与 HttpServer 对象一同在 doExport() 方法中初始化的。最后,我们来看 HttpProtocol.doExport() 方法的实现: 介绍完 HttpProtocol 暴露服务的相关实现之后,下面再来看 HttpProtocol 中引用服务相关的方法实现,即 protocolBindinRefer() 方法实现。该方法首先通过 doRefer() 方法创建业务接口的代理,这里会使用到 jsonrpc4j 库中的 JsonProxyFactoryBean 与 Spring 进行集成,在其 afterPropertiesSet() 方法中会创建 JsonRpcHttpClient 对象: 下面来看 doRefer() 方法的具体实现: 在 AbstractProxyProtocol.protocolBindingRefer() 方法中,会通过 ProxyFactory.getInvoker() 方法将 doRefer() 方法返回的代理对象转换成 Invoker 对象,并记录到 Invokers 集合中,具体实现如下: 本文重点介绍了在 Dubbo 中如何通过“HTTP 协议 + JSON-RPC”的方案实现跨语言调用。首先介绍了 JSON-RPC 中请求和响应的基本格式,以及其实现库 jsonrpc4j 的基本使用;接下来我们还详细介绍了 Dubbo 中 AbstractProxyProtocol、HttpProtocol 等核心类,剖析了 Dubbo 中“HTTP 协议 + JSON-RPC”方案的落地实现。

⑩ 【bbo源码】5.配置信息解析-注解版

用于把bbo.properties读到spring的environment中, 这个工作是由Spring的类来完成的.检测到某个需要注册的Bean上有@PropertySource注解,就会读该文件的配置信息,弄到environment对象的MutablePropertySources对象中。 后期会把配置信息弄到bbo 配置类中. 该注解上还有@DubboComponentScan,@EnableDubboConfig,这两个注解是bbo用注解与spring集成的核心了 该注解用@import导入了这个类 实现了ImportBeanDefinitionRegistrar接口,那么spring在实例化的时候会调用重写ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,并且将用亮逗@Import导入的类的元数据包装成importingClassMetadata对象。 其实就是为了获取入口类AnnoBean上的@EnableDubboConfig注解里的multiple属性配置的值,默认是true. 然后注册了两个DubboConfigConfiguration的内部类 通过读Class对象注册到ioc容器 类上有@EnableDubboConfigBindings,值为@EnableDubboConfigBinding数组 通过绑定,将有对应前缀的配置信拍键含息赋值到对应的配置类中 又用@Import导入DubboConfigBindingsRegistrar类,DubboConfigBindingsRegistrar这个类又实现了ImportBeanDefinitionRegistrar,EnvironmentAware接口 实现ImportBeanDefinitionRegistrar肯定是为了另外导袭笑入一些类,并且拿到导入的源类,获取源类上配置的信息 实现EnvironmentAware是为了拿到spring的environment对象,因为 bbo.properties 已经被@PropertySource注解机制加载到了environment.MutablePropertySources中,在这里只对beanName的创建有作用。 registrar.registerBeanDefinitions : 注册的过程中,需要从environment对象中拿bbo相关的配置,比如ApplicationConfig只拿 bbo.application.*相关的配置,然后创建ApplicationConfig的BeanDefinition. 如果 @EnableDubboConfigBinding配置的multiple为true(默认为false),并且在配置文件中配置了同样前缀的属性,如: 这样会为同一种配置类型,生成两个BD.beanName不同的配置Bean,名称规则如下所示, #0表示的是'.'在配置的key中出现的位置 之后还会注册一个BeanPostProcessor类型的类的beanDefinition,BeanPostProcessor类型 会在每一个Bean实例化的过程中,根据配置的前缀,从environment拿出所需的配置,根据beanName来处理beanName相同的这一个配置Bean,把配置信息绑定到配置类的属性中。 . 利用 bboConfigBinder 对象来绑定前缀为bbo.application的配置信息到配置Bean中 这里bboConfigBinder对象是中的一个属性,是在因为这个类实现了InitializingBean这个接口的afterPropertiesSet方法,bboConfigBinder对象就是在这里初始化的 最后用的DataBinder的api把一个MutablePropertyValues绑定到Bean的属性 @import进来了DubboComponentScanRegistrar类 DubboComponentScanRegistrar又实现了ImportBeanDefinitionRegistrar接口,实现registerBeanDefinitions方法. 跟xml的逻辑一样,同样是


赞 (0)