A. 调用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
B. bbo中No such application config!异常
运行springBoot项目启动报错:java.lang.IllegalStateException: No such application config! Please add <bbo:application name="…" /> to your spring config。 原因洞或在于配置文件问题, 否则在启动时,激销端口号一直是20880,会报错纳铅伍无法连接到bbo!
C. bbo服务消费方注入@Reference失败
Injection of @org.apache.bbo.config.annotation.Reference dependencies is failed; No provider available for the service XXXService 出现这个错误的原因有很多,本篇记录自己遇到的坑,其他原因可自行网络,一大堆儿。。。 进入zookeeper客户端查看提供者接口信息发现服务提供者注册尺锋的ip地址与本机配置的ip不一致,使用了本陵型晌机的虚拟网卡的ip。 通过 ping 命令 192.168.0.102 发现目标ip不可达。 1.查看本机的ip地址 ifconfig命令 2.修改bbo的配置,将协议的host修改为本机正常可达的ip 如:bbo.protocol.host=192.168.0.100. 到此如果你的ip是正常可达的基本服务消费方就能租团正常启动了,并且可调用接口中的方法。
D. 如何通过bbo接口调用别人的服务,找不到服务
直连加不发布服务DUBBO的配置属性里面对消费端提供了不从注册中心发现服务的机制,直接配置远程接口的地址,这样可以保证消费端连接到制定的环境接口。这样消费端是解决了问题,但是服务提供端呢?如上图的B1它即是消费端也是服务提供端,它提供A1所依赖的接口,那么如果B1将它的服务发布到注册中心里面(这里需要提醒,STABLE环境机制里面档喊所有子环境公用一个注册中心),那么势必会导致stable环境里面的A会发现B1提供的服务?势必会导致stable环境的不稳定(stable环境雀凳的机制是stable环境只能进不能出,就是不能调用外部其他子环境的服务)?所以B1不能发布服务到注册中心,bbo也提供了相关的配置属性来支持这一点。下面我例举出通过哪些配置可以实现这种方案:服务消费端:DUBBO在消费端提供了一个url的属性来指定某个服务端的地址<顷蠢旅!–lang:xml–><bbo:reference interface="com.alibaba.bbo.demo.HelloWorldService" check="false" id="helloWorldService"/>默认的方式是从注册中心发现接口为com.alibaba.bbo.demo.HelloWorldService的服务,但是如果需要直连,可以在bbo.properties下面配置bbo.reference.helloWorldService.url=bbo://ip:port/com.alibaba.bbo.demo.HelloWorldService可以通过配置bbo.reference.url=bbo://ip:port/来让某个消费者系统的服务都指向制定的服务器地址(关于配置信息可以参考《DUBBO配置规则详解》)
E. RpcException: Invalid token! Failed to invoke method
问题:直连bbo应用时,提示错误:RpcException: Invalid token! Failed to invoke method 原因:这是因辩唯宽为provide 配置了token验证,调试时可以暂时去掉这个配置。 关于bbo token 配置的说明如下: bbo:service tokentokenstring/boolean可选false服务治理令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌,否则使用静态令牌,令牌的作用是防止消费者绕过注册中心直接访问,保证注册中心的授权功能有效,如山枝果使用点对点调用,需关闭令牌功能携亮 解决:关闭token验证后就可以正常调用了。
F. bbo java环境下出现Cannot resolve reference to bean 'carDao' setting bean property 'carDao'错误
往service里注入失败了。改成:ref="CarServiceImpl"
G. 关于升级 Dubbo 版本到 2.6.5 后启动失败的“坑”
Dubbo 从低版本升级到 2.6.5 版本后,启动失败,报错如下: <b><font color='red'>上终极方案:使用 2.6.2 以下版本或者 2.7.0 以上版本的 bbo ;</font></b> 具体解决方式需要根据项目的情况解决,提供一些其他方案: 删除 web.xml 中如下的配置: Spring Boot 工程没有特别好的解决方案,提供两个解决思路: 这个方案也没有绕过添加 web.xml 的命运,做法如下: 观察报错日志,报错位置很明显是 Spring 框架初始化时的报错,重点是: there is already a root application 。 这个错误抛出位置余汪返位于: Spring-web 包的 ContextLoader 类的 initWebApplicationContext 方法。 原因很明显, ContextLoader 被调用了至少两遍,第二遍报错导致项目初始化失败,其主要的“罪魁祸首”是 bbo 包下面的 web-fragment.xml 。 Servlet 3.0 是随着 Java EE 6 规范发布的,主要新增特性: 支持 Servlet 3.0 规范的容器,在启动后会扫描工程的 jar 包,找到符合规范的 添加了相关注解的类 和 web-fragment.xml 然后跟 web.xml 的配置合并作为整个项目的初始化配置。 上述问题的发生原因很明显了: 这个是 Servlet 3.0 提供的一个属性,等同一个开关,设置为 true 则表示 web.xml 已经提供了全部的配置信息,不需要容器再去各个 jar 包找配置了陵罩,换句话就是:关闭 可插特性 ; 这个属性是 注释里面提供的解决思路。这个属性可以理解为指定 web-fragment.xml 的加载顺序,和 ordering 标签的区别是, absolute-ordering 仅仅针对我们指定的 web-fragment.xml 做排序。 轻易升级一个基础框架不是一个好的做法竖饥,<b>升级基础框架还是应该关注下当前版本和目标升级版本,框架作者做了些什么事情,出现过什么BUG。</b> 当前的 Spring Boot 的解决方案并不让人满意,毕竟 Spring Boot 的无Xml的感觉还是很爽的,为了这个升级引入了 web.xml 会有一点点不爽。
H. eclipse导入maven管理的项目时,pom.xml第一行报错。错误如图1。而且bbo的xml也不识别。
bbo的问题是因为他的官网关了对应的xsd无法获取到
对于 eclipse 来说这个文件只能改为从本地读取才能正常
修改方法是提取bbo.jarMETA-INF中的bbo.xsd文件到随意一个目录,建议放Eclipse目录下就好
打开Eclipse的Window-preferences选择XMLCatalog
右边userspecifiedentries下add两条记录
Location选择你的bbo.xsd文件
keytype选Namespacename
key填入http://code.alibabatech.com/schema/bbo
然后再add一条
Location选择你的bbo.xsd文件
keytype选schemalocation
key填入http://code.alibabatech.com/schema/bbo/bbo.xsd
(这部分记得要复制,一般人为了省事直接在后面加上xsd,其实少了/bbo/ 这个目录)
ok保存以后刷新你的项目过一会儿bbo相关的错误就没了
补充刷新方法:eclipse工具栏的 project – clean… 选择所有或者单独你用到的工程
ok之后等项目重新build
截图有点问题~ 截了两次 不过这个不是重点 无所谓了
MyEclipse可能位置不同,我没有这个ide 自行搜索对应的位置吧 XML Catalog
bbo的问题如果解决了,我要求的不多 点个“给力”就好~ 谢了