spring boot配置duboo注意事项

来源:互联网 发布:怎么剔除异常数据 编辑:程序博客网 时间:2024/06/07 07:10

spring boot配置dubbo注意事项

  通过前两篇文章,知道了spring boot配置dubbo有两种方式。具体请回顾前两篇文章吧。

  现在主要是说下spring boot在自己的application.properties 文件里配置dubbo内容,这种方式遇到的问题。

问题一:dubbo接口发布不成功。

原因一:注意application.properties 文件中配置的,dubbo扫描发布接口包是否正确,即

#这是你要发布到dubbo的接口所在包位置spring.dubbo.scan=test.spring.dubboService

  这里的test.spring.dubboService包下,就是要发布的dubbo接口所放的位置。

原因二:所发布接口的实现类包位置一定要比接口位置低。即正确配置如下图所示

这里写图片描述

原因三:发布接口的实现类上是否忘记添加com.alibaba.dubbo.config.annotation.Service@Service 注解。

原因四:发布接口实现类除了有@Service 注解,是否还存在事务注解@Transactional ,原因是alibaba的@Service 注解与事务的注解,不能共用,去掉事务注解即可。(详情请看下一个问题)。

问题二:dubbo发布的接口不能再添加事务注解@Transactional

原因:是alibaba的@Service 注解与事务的注解,不能共用

解决方法有三个:

1. 方法一:修改alibaba的@Service 注解,具体办法请参考这里,这种只是让大家看下,最好别用,因为谁闲着没事去修改源代码。

2. 方法二:可以将dubbo发布接口和添加注解的接口分开,两者之间有个调用关系即可,详情请看下图:

这里写图片描述

  上图将发布的接口和访问数据库的接口分离,即将alibaba的@Service 注解,加到TestDubboServiceImpl 上,然后在该实现类中,再引入TestService 接口,然后进入到TestServiceImpl ,将事务注解添加到TestServiceImpl 类中即可,这样就解决了,@Service@Transactional 的分离。具体如下:

import com.alibaba.dubbo.config.annotation.Service;import test.spring.dubboService.TestDubboService;import test.spring.localService.TestService;@Servicepublic class TestDubboServiceImpl implements TestDubboService {    @Autowired //引入本地TestService接口    TestService testService;    @Override    public String getName(String name) {        // TODO Auto-generated method stub        return testService.getName(name);    }}

TestService的实现类如下:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;//这里的注解就是这个import test.spring.localService.TestService;@Servicepublic class TestServiceImpl implements TestService{    @Autowired    TestMapper testMapper;    @Override    @Transactional    public String getName(String name) {        //具体的查询数据库的逻辑           return testMapper.selectByName(name);;    }}

3.方法三:将dubbo的配置由在spring boot 的application.properties文件配置改为传统的那种dubbo xml形式配置。也不会造成冲突。因为传统的dubbo xml形式配置,不用alibaba的那个@Service 注解。

问题三:dubbo消费者调用接口不成功

原因一:还是application.properties,是否没有配置,或配置位置错误。

#这是你要调用的dubbo的接口所在包位置spring.dubbo.scan=test.spring.dubboService

原因二:一般我们的消费者调用都是在controller调用,也就是下图所示

import org.springframework.web.bind.annotation.RestController;import com.alibaba.dubbo.config.annotation.Reference;@RestControllerpublic class TestController {    @Reference    TestDubboService testDubboService;    @RequestMapping(value="abc/akf",method=RequestMethod.GET)    public String abc(String name){          return testDubboService.getName(name);    }}

  这种情况就要考虑是否controller位置比dubbo调用接口的位置低。即下图所示为正确配置:

这里写图片描述

原创粉丝点击