新闻资讯

新闻资讯 行业动态

Spring Cloud Config新手教程

编辑:008     时间:2020-02-28

一、背  景

我们知道,一般情况下,一个应用通常经历开发阶段(dev),集成测试阶段(sit),用户验收测试阶段(uat),最后才能安心的上生产(prod),每个阶段由于负责人和软硬件环境的变更,很可能会使用不同的配置参数,最常见的场景就是程序员所使用的数据库密码和QA所使用的以及最后生产环境的密码肯定是要严格控制的,那么衍生出来的需求就是同一份应用在不同的环境下运行需要不同的配置文件。这对于传统的单体应用来说并没有什么困难,但是采用微服务架构的场景下,由于服务的不断拆分,需要管理的配置文件的数量迅速增加,如果团队很时髦,使用了gitflow,那么很可能每一个feature或者hotfix分支都需要一份额外的配置文件,那简直会爆炸。不过莫慌,万能的spring团队给我们准备了神器spring-cloud-config,我们一起来看一下它是怎么解决我们的需求的。

二、使用

要明确的是,spring-cloud-config在宏观上分成三个角色,第一个角色是config-repo,是实际上存放配置文件的地方,第二个是config-server,配置中心的服务端,由它来管理config-repo,并接受每个client获取配置的请求,最后一个自然是config-client,它通常是我们的微服务应用,它会被告知server的位置,并在初始化的过程中向server请求配置文件。如此一来,配置文件可以集中得到管理,便捷且安全;应用在启动的过程中只要通过几个环境变量就可以拿到当前环境下的配置文件,清爽方便。

闲言少叙,我们一步步来搭建这三个模块。首先是config-repo,实际上就是一个文件夹,我们在github上将其初始化好。

接下来是config-server,它是一个spring cloud项目,这里使用maven去构建(推荐尝试gradle,更加简洁清爽),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>io.daocloud</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>config-server</name>
<description>Spring Cloud project</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>

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

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

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Brixton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

作为一个标准的springboot项目,我们只需要在入口处打开@EnableConfigServer即可赋予它config-server身份,可谓开箱即用:

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

public static void main(String[] args) {
    new SpringApplicationBuilder(ConfigServerApplication.class).web(true).run(args);
  }
}

最后是它的配置文件application.properties:

spring.application.name=config-server
server.port=9091
spring.cloud.config.server.git.uri=https://github.com/
spring.cloud.config.server.git.searchPaths=repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
spring.cloud.config.server.bootstrap=true

可以看到我们为其指定了应用名(方便我们以后利用服务治理实现高可用的配置中心集群),监听的端口,config-repo资源的地址和访问该资源的账号和密码等。最后是config-client,我们只需要在一般的业务应用中加入spring-cloud-client 依赖即可赋予它client身份,同样是开箱即用,贴一下我们在一个实际项目中使用的build.gradle:

group 'cloud.config.com'
version '1.0-SNAPSHOT'


buildscript {
ext {
    springBootVersion = '1.5.3.RELEASE'
}
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    classpath "io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE"
     }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: "io.spring.dependency-management"

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencyManagement {
imports {
    mavenBom 'org.springframework.cloud:spring-cloud-config:1.3.1.RELEASE'
}
}

dependencies {
compile "org.flywaydb:flyway-core:4.0.3"
compile "org.springframework.boot:spring-boot-starter-web:1.5.1.RELEASE"
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.5.1.RELEASE'
compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.5'
compile 'org.projectlombok:lombok:1.16.10'
compile group: 'com.google.guava', name: 'guava', version: '19.0'
compile "org.hibernate:hibernate-validator"
compile 'biz.paluch.redis:lettuce:4.3.1.Final'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.springframework.boot:spring-boot-starter-test"
compile group: 'org.json', name: 'json', version: '20160810'
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.8.0'
compile 'org.springframework.cloud:spring-cloud-starter-config'
}

下面划重点,当应用拥有client身份后,它在启动的时候就不再需要依赖application.properties或者application.yml,我们只需要在bootstrap.properties文件中或者命令行以环境变量的形式传入下面三个参数,应用在启动的过程中 就会自动从client-server拿到相应的配置文件,相当方便。

spring.application.name=name
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:9091/  #config-server的位置

具体来说,上面的配置会让该应用向config-server请求名称为nev-name.properties(或nev-name.yml)的配置,这样我们只要简单的变更spring.cloud.config.profile参数就可以达到在不同环境下获取相应配置文件的目的,是不是简单好用?



原文链接:https://mp.weixin.qq.com/s/p_fRaVAfAKPsYe2FtaNbJg

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐