團隊現有框架是重度依賴dubbo,分層邏輯不清晰,致使開發模式有點重。開發一些非分佈式小項目,若是使用統一的編碼規範,依賴框架,就會致使被動依賴dubbo。這種開發模式,在小項目開發時,效率低下,成本太高。java
現考慮升級框架,對現有框架作拆分,以spring-boot-starter的方式,造成獨立模塊,單獨依賴,而且能夠大量簡化較爲繁重的xml配置。git
因爲框架中,最深度依賴的就是dubbo,因此首先針對rpc模塊動刀,開發一個dubbo-spring-boot-starter。github
參照springboot的官方文檔,starter項目分兩個模塊,starter和autoconfigure。spring
新建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>
建立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 }
配置了一些通用的基礎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; } }
/** * <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; } }
/** * <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; } }
# 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
這是一個空項目
<?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>
在META-INF目錄下建立spring.provides
provides: dubbo-spring-boot-autoconfigure