您的位置:首页 > 编程语言 > Java开发

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

2017-03-12 21:09 1176 查看
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,所以我们还需要dubbo的AnnotionBean类,来扫描指定包下面的类.

 

这里集成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

我们可以再zookeeper的client里面看到相关信息



这个是服务提供者的信息



这个是服务消费者的信息

 

这个是访问结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息