美文网首页
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