美文网首页
boot集成dubbo踩过的坑

boot集成dubbo踩过的坑

作者: java_飞 | 来源:发表于2018-11-07 16:11 被阅读65次

这里只阐述如何集成生产者端,消费者端差不多雷同就不多叙述了:

1.首先映入相关依赖

            <dependency>
                <groupId>io.dubbo.springboot</groupId>
                <artifactId>spring-boot-starter-dubbo</artifactId>
                <version>1.0.0</version>
            </dependency>

2.然后配置文件

spring.dubbo.application.name=自己的项目名称
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=扫描dubbo实现的类的路径

3.编写测试类

public interface DubboTest{
  void test();
}

public class MyDubboTestImpl implements DubboTest{
  @Override
  public void test(){
      System.out.println("dubbo服务");
    } 
}

4.启动本地zk,然后再启动服务
5.观察zk信息可以看到服务被注册上

注意:

这里在使用配置文件的时候有一个坑需要注意,目前应该是只有在用这个jar包集成dubbo的时候才会出现,
我们在使用内部配置文件的时候没有任何问题;但是当使用外部配置文件,例如
@PropertySource(value={"xxxx"})来引入时,会发现dubbo服务无法注册到zk上;
我经过调试源码发现,当我们通过引入外部配置文件的方式启动程序时,发现

package io.dubbo.springboot;

import com.alibaba.dubbo.config.spring.AnnotationBean;
import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;

public class DubboConfigurationApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        Environment env = applicationContext.getEnvironment();
        String scan = env.getProperty("spring.dubbo.scan");
        if (scan != null) {
            AnnotationBean scanner = BeanUtils.instantiate(AnnotationBean.class);
            scanner.setPackage(scan);
            scanner.setApplicationContext(applicationContext);
            applicationContext.addBeanFactoryPostProcessor(scanner);
            applicationContext.getBeanFactory().addBeanPostProcessor(scanner);
            applicationContext.getBeanFactory().registerSingleton("annotationBean", scanner);
        }

    }


}

上面这个类中的scan 参数为null,但是使用内部配置文件的时候scan这个参数不为空;
然后再查看env以及applicationContext的参数信息,发现没相关配置的信息,看下图:
1.不正常:


image.png

2.正常的:


image.png image.png

解决办法:
1.首先想到的解决办法是直接继承这个类,然后重写该方法,然后尝试了发现不生效,通过追查引用发现,这个类是通过spring.factories这个文件配置的


image.png

2.下载这个jar的源码重新编写这个类,然后打包传入本地私服的第三方jar上,通过pom导入使用;

3.寻找能否覆盖这个文件,指定使用自己重写的配置类(不知道有没有,还没有找到);

目前遇到了这些问题和注意事项,文章可能有出入,如果有问题,请联系QQ:1107156537

相关文章

网友评论

      本文标题:boot集成dubbo踩过的坑

      本文链接:https://www.haomeiwen.com/subject/rkjvxqtx.html