spring boot與dubbo整合(dubbo-spring-boot-starter)


現狀

團隊現有框架是重度依賴dubbo,分層邏輯不清晰,導致開發模式有點重。開發一些非分布式小項目,如果使用統一的編碼規范,依賴框架,就會導致被動依賴dubbo。這種開發模式,在小項目開發時,效率低下,成本過高。

解決方案

現考慮升級框架,對現有框架做拆分,以spring-boot-starter的方式,形成獨立模塊,單獨依賴,並且可以大量簡化較為繁重的xml配置。

由於框架中,最深度依賴的就是dubbo,所以首先針對rpc模塊動刀,開發一個dubbo-spring-boot-starter。

實戰

參照springboot的官方文檔,starter項目分兩個模塊,starter和autoconfigure。

項目地址:https://github.com/coderzl/dubbo-spring-boot

dubbo-spring-boot

新建maven父工程,dubbo-spring-boot

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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>cn.coderzl.dubbo</groupId>
	<artifactId>dubbo-spring-boot</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>pom</packaging>

	<name>dubbo-spring-boot</name>
	<description>dubbo for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<modules>
		<module>dubbo-spring-boot-autoconfigure</module>    
		<module>dubbo-spring-boot-starter</module>          
		<module>dubbo-api-spring-boot-test</module>         <!-- test project -->
        <module>dubbo-provider-spring-boot-test</module>    <!-- test project -->
		<module>dubbo-consumer-spring-boot-test</module>    <!-- test project -->
	</modules>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<project.model.version>1.0-SNAPSHOT</project.model.version>
		<java.version>1.8</java.version>
		<spring-boot.version>1.5.9.RELEASE</spring-boot.version>
		<zookeeper.version>3.4.6</zookeeper.version>
		<dubbo.version>2.5.7</dubbo.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>


</project>

dubbo-spring-boot-autoconfigure

創建module dubbo-spring-boot-autoconfigure

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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>

	<parent>
		<groupId>cn.coderzl.dubbo</groupId>
		<artifactId>dubbo-spring-boot</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<groupId>cn.coderzl.dubbo</groupId>
	<artifactId>dubbo-spring-boot-autoconfigure</artifactId>
	<version>${project.model.version}</version>
	<packaging>jar</packaging>

	<name>dubbo-spring-boot-autoconfigure</name>
	<description>Dubbo Configure for Spring Boot</description>


	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>${dubbo.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring</artifactId>
					<groupId>org.springframework</groupId>
				</exclusion>
				<exclusion>
					<artifactId>zookeeper</artifactId>
					<groupId>org.apache.zookeeper</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>${zookeeper.version}</version>
			<exclusions>
				<exclusion>
					<groupId>io.netty</groupId>
					<artifactId>netty</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.4</version>
		</dependency>
	</dependencies>

</project>

  • 屬性對象

DubboProperties 裝載初始自動配置的相關屬性,下面的對象,只配置了我們項目中暫時用到到一些屬性。。。


@ConfigurationProperties(prefix = DubboProperties.DUBBO_PREFIX)
public class DubboProperties {
    public static final String DUBBO_PREFIX = "dubbo";

    /** 消費者配置開關 默認關閉(暫未生效) */
    private boolean consumerTrigger;
    /** 生產者配置開關 默認關閉(暫未生效) */
    private boolean providerTrigger;
    /** applicationName */
    private String applicationName;
    /** 注冊中心地址 */
    private String registryAddress;
    /** 啟動時是否檢查注冊中心 */
    private boolean registryCheck =  false;
    /** 協議 默認:dubbo */
    private String protocol = "dubbo";
    /** 端口 默認 20800 */
    private int port = 20800;
    /** HOST */
    private String host;
    /** dubbo 線程數, 默認 200  */
    private int threads = 200;
    /** 重試次數 默認不重試 */
    private int retries = 0;
    /** consumerCheck 默認不檢查 */
    private boolean consumerCheck = false;
    /** 消費者過濾器 多個用,隔開 */
    private String consumerFilter;
    /** 提供者者過濾器 多個用,隔開 */
    private String providerFilter;
    /** providerCheck 默認不檢查 */
    private boolean providerCheck = false;
    /** group */
    private String group;
    /** 超時時間 */
    private int timeout;

    //…………省略getter/setter
}    

  • DubboAutoConfiguration

配置了一些通用的基礎config。


@Configuration
@EnableConfigurationProperties(DubboProperties.class)
public class DubboAutoConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(DubboAutoConfiguration.class);

    @Autowired
    private DubboProperties dubboProperties;

    @PostConstruct
    public void checkConfigFileExists(){
        if (!StringUtils.hasText(dubboProperties.getRegistryAddress()) || !StringUtils.hasText(dubboProperties.getApplicationName())){
            throw new IllegalArgumentException("RegistryAddress or ApplicationName is null");
        }
    }

    @Bean
    @ConditionalOnMissingBean
    public ApplicationConfig getApplicationConfig(){
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(dubboProperties.getApplicationName());
        return applicationConfig;
    }

    @Bean
    @ConditionalOnMissingBean
    public RegistryConfig getRegistryConfig(){
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress(dubboProperties.getRegistryAddress());
        registryConfig.setCheck(dubboProperties.isRegistryCheck());
        return registryConfig;
    }

    @Bean
    @ConditionalOnMissingBean
    public ProtocolConfig getProtocolConfig(){
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName(dubboProperties.getProtocol());
        protocolConfig.setHost(dubboProperties.getHost());
        protocolConfig.setPort(dubboProperties.getPort());
        return protocolConfig;
    }

    @Bean
    @ConditionalOnMissingBean
    public MonitorConfig getMonitorConfig(){
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }

}

  • DubboProviderAutoConfiguration
    服務提供者端初始配置

/**
 * <p> dubbo提供者自動配置 </p>
 *
 * @author coderzl
 * @Title DubboProviderAutoConfiguration
 * @date 2017/12/4 10:27
 * @package cn.coderzl.dubbo.spring.boot.autoconfigure
 */
@Configuration
@EnableConfigurationProperties(DubboProperties.class)
@AutoConfigureAfter(DubboAutoConfiguration.class)
public class DubboProviderAutoConfiguration {

    @Autowired
    private DubboProperties dubboProperties;

    @Bean
    @ConditionalOnMissingBean
    public ProviderConfig getProviderConfig(){
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setRetries(dubboProperties.getRetries());
        providerConfig.setFilter(dubboProperties.getConsumerFilter());
        providerConfig.setTimeout(dubboProperties.getTimeout());
        providerConfig.setGroup(dubboProperties.getGroup());
        return providerConfig;
    }
}
  • DubboConsumerAutoConfiguration
    服務消費者端自動配置

/**
 * <p> dubbo消費者自動配置 </p>
 *
 * @author coderzl
 * @Title DubboConsumerAutoConfiguration
 * @date 2017/12/4 10:26
 * @package cn.coderzl.dubbo.spring.boot.autoconfigure
 */
@Configuration
@EnableConfigurationProperties(DubboProperties.class)
@AutoConfigureAfter(DubboAutoConfiguration.class)
public class DubboConsumerAutoConfiguration {

    @Autowired
    private DubboProperties dubboProperties;

    @Bean
    @ConditionalOnMissingBean
    public ConsumerConfig getConsumerConfig(){
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setRetries(dubboProperties.getRetries());
        consumerConfig.setTimeout(dubboProperties.getTimeout());
        consumerConfig.setCheck(dubboProperties.isConsumerCheck());
        consumerConfig.setGroup(dubboProperties.getGroup());
        return consumerConfig;
    }
}

  • spring.factories
    在META-INF目錄下配置spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.coderzl.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration,\
cn.coderzl.dubbo.spring.boot.autoconfigure.DubboConsumerAutoConfiguration,\
cn.coderzl.dubbo.spring.boot.autoconfigure.DubboProviderAutoConfiguration

dubbo-spring-boot-starter

這是一個空項目

  • pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.coderzl.dubbo</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>${project.model.version}</version>

	<name>dubbo-spring-boot-starter</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>cn.coderzl.dubbo</groupId>
		<artifactId>dubbo-spring-boot</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>cn.coderzl.dubbo</groupId>
			<artifactId>dubbo-spring-boot-autoconfigure</artifactId>
			<version>${project.model.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>

</project>

  • spring.provides

在META-INF目錄下創建spring.provides

provides: dubbo-spring-boot-autoconfigure


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM