SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)

    xiaoxiao2021-03-25  51

    Dubbo是什么东西我这里就不详细介绍了,自己可以去谷歌

     

    SpringBoot整合Dubbo的话我们首先要先对Dubbo的启动这块了解一哈

     

    dubbo源码分析:http://blog.csdn.net/flashflight/article/details/44318447

     

    Dubbo会注册各种解析器,因为我们这边不会在使用XML配置了,所以主要关注的地方就是这块

    通过BeanDefinitionParser解析,然后注册到Ioc容器中,而这里我们通过SpringBoot的自动配置,读取yml配置生成SpringBean

     

    基本上我们只有用到 registry,provider, protocol ,application这些

    然后暴漏服务和引用服务 通过annotationBean这个东东

    因为使用了yml或者properties的方式来配置dubbo,所以我们还需要dubboAnnotionBean,来扫描指定包下面的类.

     

    这里集成dubbo的时候和前面集成其他东西的是差不多的,不过在使用了AnnotionBean类的时候,因为AnnotionBean类实现了BeanFactoryPostProcessor接口.

    这里还有一篇资料:

    http://blog.csdn.net/u011686226/article/details/53841227

    刚开始不知道的时候日志里面提示是这样的

    @Bean method DubboAutoConfiguration.annotationBean is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.

    解决了这个问题之后,下面的就可以直接按照原先的步骤来搞

    dubbo-spring-boot-starter

    Pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ibigsea</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <boot.version>1.3.5.RELEASE</boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>${boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>${boot.version}</version> </dependency> <!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> </dependencies> </project>

    DubboProperties.java

    package com.ibigsea.dubbo.autoconfigure; import org.springframework.boot.context.properties.ConfigurationProperties; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.RegistryConfig; @ConfigurationProperties(prefix = DubboProperties.DUBBO_PREFIX) public class DubboProperties { public static final String DUBBO_PREFIX = "dubbo"; private String scan; private ApplicationConfig application; private ProtocolConfig protocol; private RegistryConfig registry; public String getScan() { return scan; } public void setScan(String scan) { this.scan = scan; } public ApplicationConfig getApplication() { return application; } public void setApplication(ApplicationConfig application) { this.application = application; } public ProtocolConfig getProtocol() { return protocol; } public void setProtocol(ProtocolConfig protocol) { this.protocol = protocol; } public RegistryConfig getRegistry() { return registry; } public void setRegistry(RegistryConfig registry) { this.registry = registry; } }

    DubboAutoConfiguration.java

    package com.ibigsea.dubbo.autoconfigure; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.AnnotationBean; @Configuration @EnableConfigurationProperties(DubboProperties.class)//开启属性注入,通过@autowired注入 @ConditionalOnClass({AnnotationBean.class,ApplicationConfig.class,ProtocolConfig.class,RegistryConfig.class}) public class DubboAutoConfiguration { @Autowired private DubboProperties prop; @Bean @ConditionalOnMissingBean(AnnotationBean.class)//容器中如果没有这个类,那么自动配置这个类 public static AnnotationBean annotationBean(@Value("${dubbo.packageName}")String packageName) { AnnotationBean annotationBean = new AnnotationBean(); annotationBean.setPackage(packageName); return annotationBean; } @Bean @ConditionalOnMissingBean(ApplicationConfig.class)//容器中如果没有这个类,那么自动配置这个类 public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(prop.getApplication().getName()); return applicationConfig; } @Bean @ConditionalOnMissingBean(ProtocolConfig.class)//容器中如果没有这个类,那么自动配置这个类 public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName(prop.getProtocol().getName()); protocolConfig.setPort(prop.getProtocol().getPort()); return protocolConfig; } @Bean @ConditionalOnMissingBean(RegistryConfig.class)//容器中如果没有这个类,那么自动配置这个类 public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(prop.getRegistry().getAddress()); return registryConfig; } }

    resource目录下面的META-INF添加spring.factories文件

    # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.ibigsea.dubbo.autoconfigure.DubboAutoConfiguration

    目录结构

    服务提供者dubbo-provider

    Pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ibigsea</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <boot.version>1.3.7.RELEASE</boot.version> </properties> <dependencies> <dependency> <groupId>com.ibigsea</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${boot.version}</version> <scope>test</scope> </dependency> </dependencies> </project>

    定义一个接口BaseService.java

    为了贪图方便,我就不在重新弄一个jar,然后服务提供者和服务消费都引用这个jar

    package com.ibigsea.service; public interface BaseService { public String build(String str); }

    HelloService.java

    package com.ibigsea.dubbo_provider.impl; import com.alibaba.dubbo.config.annotation.Service; import com.ibigsea.service.BaseService; @Service(group="helloService", version="1.0") public class HelloService implements BaseService { @Override public String build(String str) { return "hello "+str+" !"; } }

    启动类APP

    package com.ibigsea; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RestController; /** * 是Spring Boot项目的核心注解,主要是开启自动配置 */ @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan @RestController public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }

    application.yml配置

    dubbo : protocol : prot : -1 name : dubbo application : name : hello-world-app registry : address : zookeeper://127.0.0.1:2181 packageName : com.ibigsea.dubbo_provider.impl server : port : 8083

    目录结构

    服务消费者dubbo-consume

    Pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ibigsea</groupId> <artifactId>dubbo-consume</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <boot.version>1.3.5.RELEASE</boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${boot.version}</version> <scope>test</scope> </dependency> <!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.ibigsea</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project> 同样的一个接口 BaseService

    package com.ibigsea.service; public interface BaseService { public String build(String str); }

    RefService.java

    package com.ibigsea.dubbo_consume.reference; import org.springframework.stereotype.Service; import com.alibaba.dubbo.config.annotation.Reference; import com.ibigsea.service.BaseService; @Service("refService") public class RefService { @Reference(group="helloService", version="1.0") private BaseService baseService; public String sayHello(String name){ return baseService.build(name); } }

    启动类APP

    package com.ibigsea; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ibigsea.dubbo_consume.reference.RefService; /** * 是Spring Boot项目的核心注解,主要是开启自动配置 */ @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan @RestController public class App { @Autowired private RefService refService; public static void main(String[] args) { SpringApplication.run(App.class, args); } @RequestMapping("/say") public String sayHello(String name) { return refService.sayHello(name); } }

    Application.yml

    dubbo : protocol: prot : -1 name : dubbo application: name : hello-world-app registry: address : zookeeper://127.0.0.1:2181 packageName : com.ibigsea.dubbo_consume.reference server : port : 8085

    项目结构

    分别启动dubbo-provider dubbo-consume

    我们可以再zookeeperclient里面看到相关信息

    这个是服务提供者的信息

    这个是服务消费者的信息

     

    这个是访问结果

    转载请注明原文地址: https://ju.6miu.com/read-36577.html

    最新回复(0)