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

  • Post author:
  • Post category:其他


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


里面看到相关信息





这个是服务提供者的信息






这个是服务消费者的信息

这个是访问结果




版权声明:本文为a67474506原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。