八、Spring Cloud Config

八、Spring Cloud Config

    提供了在分布式系统的外部配置的客户端支持。通过配置服务(Config Server)来为所有的环境和应用提供外部配置的集中管理。这些概念都通过Spring的Environment和PropertySource来抽象,所以它可以适用于各类Spring应用,同时支持任何语言的任何应用。它也能为你支持对应用开发环境、测试环境、生产环境的配置、切换、迁移。默认的配置实现通过git实现,同时也支持其他的扩展(比如svn等)。

    1、组件

        (1)、配置仓库:为配置中心服务端提供配置信息存储,支持git、svn、valut、native、credhub、composite以及本地文件仓库。在配置服务中需要对配置中心的仓库类型进行显示配置,不配置默认使用git仓库。

        (2)、服务端:为配置客户端提供对应的配置信息,配置信息的来源是配置仓库。应用启动时,会从配置仓库拉取配置信息缓存到本地仓库中,对外提供API接口服务。

        (3)、客户端:应用启动时从配置服务端拉取配置信息。 

    2、执行过程

        (1)、环境部署之前,将所需的配置信息推送到配置仓库。

        (2)、启动配置中心服务端,将配置仓库的配置信息拉取到服务端,配置服务端对外提供REST接口。

        (3)、微服务应用(Config Client)启动,根据bootstrap.yml(properties)中配置的应用名(application)、环境名(profile)、分支名(label),向Config Server请求配置信息。

        (4)、Config Server根据自己bootstrap/application.yml(properties)中的Git(或SVN)仓库信息加上客户端传来的配置定位信息去查配置信息的路径。

        (5)、Config Server执行git clone命令,将配置信息下载到本地Git仓库中,将配置信息加载到Spring的ApplicationContext读取内容返回给客户端(微服务应用)。

        (6)、客户端将内容加载到ApplicationContext,配置内容的优先级大于客户端内部的配置内容,进行忽略。

    3、注解

        (1)、@EnableConfigServer

            ①、EnableConfigServer

                Spring Cloud定义的注解,开启应用服务对配置中心的支持。主要是通过引入某种Configuration类来达到装配某些Bean的目的。此注解引入了ConfigServerConfiguration类。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ConfigServerConfiguration.class})
public @interface EnableConfigServer {
}

            ②、ConfigServerConfiguration

                但ConfigServerConfiguration类里面并没有实现太多Bean的装配,这里利用一种折中方式,引入需要的自动配置。Marker唯一被引用的地方在ConfigServerAutoConfiguration类。

@Configuration
public class ConfigServerConfiguration {
    public ConfigServerConfiguration() {
    }
    @Bean
    public ConfigServerConfiguration.Marker enableConfigServerMarker() {
        return new ConfigServerConfiguration.Marker();
    }
    class Marker {
        Marker() {
        }
    }
}

            ③、ConfigServerAutoConfiguration

@Configuration
@ConditionalOnBean({Marker.class})
@EnableConfigurationProperties({ConfigServerProperties.class})
@Import({EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class, ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class})
public class ConfigServerAutoConfiguration {
    public ConfigServerAutoConfiguration() {
    }
}

                a、EnvironmentRepositoryConfiguration:环境变量存储相关的配置类

                b、CompositeConfiguration:组合方式的环境仓库配置类

                c、ResourceRepositoryConfiguration:资源仓库相关的配置类

                d、ConfigServerEncryptionConfiguration:加密断点相关的配置类

                e、ConfigServerMvcConfiguration:对外暴露的MVC端点控制器的配置类           

        (2)、@EnableAutoConfiguration

            Spring Boot定义的注解,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器。  

        (3)、@Configuration      

            Spring定义的注解,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建Bean定义,初始化Spring容器。

            ①、@Configuation等价于<Beans></Beans>

            ②、@Bean等价于<Bean></Bean>

            ③、@ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>

            注:

                @Configuration不可以是final类型;

                @Configuration不可以是匿名类;

                嵌套的configuration必须是静态类。

    4、Sever配置

        (1)、新建一个模块,命名为ConfigServer,再pom.xml引入依赖项。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>

        (2)、添加主类Application,添加@EnableConfigServer注解来开启Spring Config的Server功能。 

        (3)、修改在resources文件夹下的配置文件。

            Spring Cloud Config除了支持username,password认证外,也可以通过公私钥文件进行git认证。

spring:
  application:
    # 应用名称
    name: config-server
  cloud:
    config:
      server:
        # 默认使用GIT库
        git:
          # GIT仓库地址,HTTP方式,多个用逗号“,”分割
          uri: https://github.com/demo/SpringCloudlearn
          # 仓库搜索路径
          search-paths: config_project
          username: user
          password: 12345
        # 如果使用SVN仓库配置
        svn:
          # SVN仓库地址
          uri: http://svn.test.com/svn/project/demo/
          username: svn_user
          password: 12345

# 如果使用Eureka注册需要配置,否则Client直接指定Server地址获取配置即可
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8777/eureka/

server:
  # 访问路径端口号
  port: 8888
  servlet:
    # 访问路径项目名称
    context-path: /configServer

        (4)、在ConfigServer下创建一个普通目录config-project,在目录下添加几个配置文件。

            config-client.yml

            config-client-dev.yml

            config-client-test.yml

            config-client-prod.yml

            ①、命名规则

                /{application}/{profile}[/{label}]

                /{application}-{profile}.yml

                /{application}-{profile}.properties

                /{application}/{application}-{profile}.yml

                /{label}/{application}-{profile}.properties

            ②、注意事项

                a、第一个规则的分支名(label)是可以省略的,默认是master分支。

                b、无论你的配置文件是properties,还是yml,只要应用名+环境名能匹配到这个配置文件,就能取到。

                c、如果是想直接定位到没有写环境名的默认配置,那么就可以使用default去匹配没有环境名的配置文件。

                d、使用第一个规则会匹配到默认配置。

                e、如果直接使用应用名来匹配,会出现404错误,此时可以加上分支名匹配到默认配置文件

                f、如果配置文件的命名由多个-分隔,此时直接使用这个文件名去匹配的话,会出现直接将内容以源配置文件内容直接返回,内容前可能会有默认配置文件的内容。

    5、Client配置

        (1)、新建一个模块,命名为ConfigClient,再pom.xml引入依赖项。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-client</artifactId>
</dependency>

        (2)、添加主类Application。

        (3)、在resources目录下创建bootstrap.yml

            bootstrap.yml的相关配置会先于application.yml,而bootstrap.yml的加载也是先于application.yml。如果需要配置Eureka注册,需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.yml,不然客户端是无法获取配置中心参数的,会启动失败。

spring:
  application:
    # 对应config server所获取的配置文件的{application}
    name: config-client
  cloud:
    config:
      # 获取配置文件应用的环境
      profile: dev
      # 获取配置文件的分支,默认是master。如果是从本地获取的话,则不用配置。
      label: master
      discovery:
        # 表示使用服务发现组件中的Config Server,而不自己指定Config Server的uri,默认false
        enabled: true
        # 指定Config Server在服务发现中的serviceId
        service-id: config-server

# 如果使用Eureka注册需要配置,否则Client直接指定Server地址获取配置即可
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8777/eureka/

server:
  # 访问路径端口号
  port: 9999
  servlet:
    # 访问路径项目名称
    context-path: /configClient

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值