配置中心:Spring Cloud Config
我们知道,一个微服务系统可能由成千上万的服务组成,每个服务都会有自己的配置,不同服务之间的有些配置是相同的,比如数据库。如果对于每个服务,我们都复制相同的配置,一旦该配置发生了变化,那么每个服务都需要修改,代价可想而知。
Spring Cloud已经考虑到了这一点,它为我们提供了一整套解决方案,那就是强大的Spring CloudConfig。
Spring Cloud Config简介
Spring Cloud Config是一个高可用的分布式配置中心,它支持将配置存放到内存(本地),也支持将其放到SVN、Git等版本管理工具进行统一管理。对于Spring Cloud Config,其官方网站是这样介绍的:
Centralized external configuration management backed by a git repository. The configuration resourcesmap directly to Spring Environment but could be used by non-Spring applications if desired.
大致含义是:通过Git仓库以支持集中式外部配置管理器,配置资源直接映射到Spring环境,但如果有必要,可以由非 Spring应用程序使用。
那么,本篇将引入 Spring Cloud Config组件,带领读者领略它的风采!
创建配置中心
创建配置中心一般分为以下几个步骤。
(1)创建Git仓库。为了方便测试,笔者已事先创建好Git仓库,地址为
https:/github.com/lynnlovemin/SpringCloudActivity.git。
(2)创建配置中心服务端。
在原有工程中创建一个moudle,命名为config,在pom.xml加入配置中心的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</ artifactId></ dependency>
<dependency>
<artifactId>common</ artifactId><groupId>com. lynn.blog</groupId>
<version>1.8-SNAPSHOT</version>
</dependency>
在上述依赖中,我们加入了
spring-cloud-config-server依赖,该依赖为配置中心的服务端依赖,有了它我们就可以将当前工程作为配置中心的服务端工程。
(3)创建启动类ConfigApplication:
@EnableConfigServer
public class ConfigApplication extends Application{
public static void main(String[] args){
Application.startup(ConfigApplication.class,args);
}
}
可以看到,我们添加了@EnableConfigServer注解,用来启用配置中心服务端。启动类ConfigApplication继承了Application类。
其实,Application类是一个公共的启动父类,所有工程的启动入口都继承了该类并提供了一个静态方法以调用SpringApplication。我们提供这样一个类主要是因为每个SpringCloud子工程的启动类都需要加入了@SpringCloudApplication注解,于是每个子工程的启动类只要继承了Application类,就无须再添加@SpringCloudApplication注解,Application类的代码如下:
@SpringCloudApplication
@Componentscan(basePackages = "com.lynn.blog")public abstract class Application {
public static void startup(class<?> cls,string[] args){
SpringApplication.run(cls,args);
}
}
我们将Application 设置为抽象类,因为它无须实例化并且提供了静态方法 startup,该方法调用了SpringApplication.run方法,因此在ConfigApplication中直接调用startup方法就可以启动该应用。
读者应该也会注意到,Application类除了添加了@SpringCloudApplication 注解外,还添加了@ComponentScan注解,该注解可以在应用启动后,指定扫描的根包名。由于每个工程的根包名都不一样,比如 register工程为 com.lynn.blog.register,config 工程为 com.lynn.blog.config,而Application类是放到common工程中的,其根包名为com.lynn.blog.common,所以如果不指定扫描的包名,Spring容器会默认扫描com.lynn.blog.common包,导致每个子工程的服务和控制器都