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

現狀

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

解決方案

現考慮升級框架,對現有框架作拆分,以spring-boot-starter的方式,造成獨立模塊,單獨依賴,而且能夠大量簡化較爲繁重的xml配置。git

因爲框架中,最深度依賴的就是dubbo,因此首先針對rpc模塊動刀,開發一個dubbo-spring-boot-starter。github

實戰

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

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

dubbo-spring-boot

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

pom文件api

<?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-autoconfigurespringboot

pom.xml文件app

<?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。maven

@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
相關文章
相關標籤/搜索