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
里面看到相关信息
这个是服务提供者的信息
这个是服务消费者的信息
这个是访问结果