转载

Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)

1.1 Spring Cloud 和 Spring Boot 版本对照表

Boot Version 2.2.x 2.1.x 2.0.x 1.5.x
Release Train Hoxton Greenwich Finchley Edgware/Dalston

1.2 演示环境

系统 开发工具 Spring Boot Spring Cloud
Win10 IDEA 2.2.0 Hoxton RC1

1.3 官方文档 Spring 配置中心文档 SpringCloud Config 中文文档 1.4 源码 github.com/niaonao/spr…

2. SpringCloud Config 配置中心

2.1 配置中心说明

SpringCloud Config 服务器以下简称"配置中心"。

Spring Cloud Config 为分布式系统中的外部配置提供服务器和客户端支持。通过 Config Server (配置中心)可以管理 Config Client (应用程序)的外部属性。应用程序可以通过配置bootstrap.yml,来加载配置中心下指定配置环境的属性。
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)

2.2 配置中心服务端配置

2.2.1 配置文件命名规范

  • {label} 是可选的 git 标签,默认 master;
  • {profile}映射到客户端上的"spring.profiles.active" 或 "spring.cloud.config.profile"; 是可选的环境配置,常见有 local,dev,test,prod;
  • {application} 映射到客户端的"spring.application.name" 或 "spring.cloud.config.name";
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties

2.2.2 配置环境支持

配置中心环境配置支持 git 存储器,并支持 label 来控制环境配置版本;也支持 svn 存储器;同时也支持本地配置,可以不使用远程存储器。

  • git 配置

配置中心 git 存储器; uri 是仓库路径; username/password 账户/密码,此处是 GitHub 账户密码; default-label 是可选的 git 标签,默认 master; search-paths 配置文件所在路径,全路径即: github.com/niaonao/spr…

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/niaonao/spring-cloud
          username: niaonao
          password: niaonao123456
          default-label: master
          search-paths: /doc/config
复制代码
  • svn 配置
spring:
  cloud:
    config:
      server:
        svn:
          uri:
          default-label:
          password:
          username:
          search-paths: 
复制代码
  • native 本地配置

配置中心会读取本地配置文件,配置文件路径 /src/main/resources,如下图在resources 下创建配置文件 /{application}-{profile}.yml

spring:
  profiles:
    active: native
复制代码
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)
2.2.3 更多配置      查看更多配置

2.3 配置中心客户端配置

此处匹配配置中心 config-server 的配置演示。该客户端应用会走 globalConfig-prod.yml 配置环境。

spring:
  cloud:
    config:
      name: globalConfig
      profile: prod
      label: master
      discovery:
        enabled: true
        service-id: config-server
复制代码

3. 配置中心环境搭建

3.1 创建模块注册中心和配置中心

之前有写 基于 Greenwich SR3 版本创建项目 的博客,这里基于 Hoxton RC1 版本重新创建 Eureka 服务注册中心,子模块的创建过程没有变化。

首先创建一个 Maven 父项目 spring-cloud,删去 src 目录。

创建多个子模块 Module。

新建子模块项目 eureka-server,选择引入依赖 Eureka Server。

新建子模块项目 config-server,选择引入依赖 Config Server。

新建子模块项目 config-client,选择引入依赖 Config Client。

另:下面演示过程中会有 eureka-client 子模块,注册中心客户端实例模块,和此处注册中心无关,可以忽略。config-server 和 config-client 在这里也作为服务发现实例注册到注册中心。

Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)

3.2 子模块依赖管理

父项目统一 java.version,spring-cloud.version 版本控制;引入 lombok 依赖。父模块通过 modules 管理子模块,子模块通过 parent 配置父模块。 3.2.1 父项目 spring-cloud 的 pom.xml

<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>pers.niaonao</groupId>
    <artifactId>spring-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 全局版本配置 -->
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RC1</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- 当前依赖需要 IDEA 安装 lombok 插件配合使用 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <modules>
        <module>eureka-client</module>
        <module>eureka-server</module>
        <module>config-server</module>
        <module>config-client</module>
    </modules>
</project>
复制代码

3.2.2 注册中心 eureka-server 的 pom.xml

引入依赖

spring-cloud-starter-netflix-eureka-server
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>pers.niaonao</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>pers.niaonao</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>
复制代码

3.2.3 配置中心 config-server 的 pom.xml

引入以下依赖

spring-cloud-config-server spring-cloud-starter-netflix-eureka-client spring-boot-starter-web
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>pers.niaonao</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>pers.niaonao</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>
复制代码

3.2.4 配置中心客户端实例 config-client 的 pom.xml

引入以下依赖:

spring-cloud-starter-config spring-cloud-starter-netflix-eureka-client spring-boot-starter-web
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>pers.niaonao</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>pers.niaonao</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>
复制代码

3.3 注册中心 eureka-server 实现

3.3.1 EurekaServerApplication.java

启动类添加注解 @EnableEurekaServer 声明为服务注册中心

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/** EnableEurekaServer 声明为尤里卡服务器(注册中心) */
@SpringBootApplication
@EnableEurekaServer
@Slf4j
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
        log.info("[注册中心]:服务端启动!");
    }

}
复制代码

3.3.2 application.yml

eureka.client.serviceUrl.defaultZone 是一个默认的注册中心地址。

fetch-registry 检索服务选项,当设置为True(默认值)时,会进行服务检索,注册中心不负责检索服务。

register-with-eureka 服务注册中心也会将自己作为客户端来尝试注册自己,为true(默认)时自动生效

eureka.server.renewalPercentThreshold,定义了renews 和renews threshold的比值,默认值为0.85;服务检测到比值低于该比值会进入自我保护状态。

server:
  port: 8761
eureka:
  instance:
    hostname: 192.168.15.1
  server:
    renewalPercentThreshold: 0.45
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
复制代码

3.4 配置中心 config-server 实现

3.4.1 ConfigServerApplication.java

启动类添加注解声明为配置中心,尤里卡注册服务客户端。

@EnableEurekaClient @EnableConfigServer
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @description: EnableConfigServer 声明为配置服务器(配置中心)
 *  支持:
 *      支持用于外部配置的基于资源的 HTTP API
 *      支持对称/非对称加密和解密的属性值
 *      支持注解 @EnableConfigServer 使用在 SpringBoot 应用程序
 *  功能:
 *      server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用-
 * @author: niaonao
 */
@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
@Slf4j
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
        log.info("[配置中心]:服务端启动!");
    }

}
复制代码

3.4.2 application.yml

将配置中心注册到尤里卡服务注册中心。配置 git 存储器,指定配置环境所在路径。

server:
  port: 8888
spring:
  application:
    name: config-server
  config:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/niaonao/spring-cloud
          username: niaonao
          password: niaonao123456
          default-label: master
          search-paths: /doc/config
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.15.1:8761/eureka/
复制代码

3.4.3 native 本地配置

如果走本地配置,可以参考下;

resources 下创建配置文件globalConfig-{profile}.yml。

server:
  port: 8888
spring:
  application:
    name: config-server
  profiles:
    active: native
  config:
    name: config-server
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.15.1:8761/eureka/
复制代码

globalConfig-prod.yml

account: niaonao
repositoryUrl: https://github.com/niaonao/prod
复制代码

3.5 配置中心客户端实例 config-client 实现

3.5.1 ConfigClientApplication.java

引入注解 EnableEurekaClient 支持注册中心服务发现。

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/** 配置中心客户端应用程序 */
@EnableEurekaClient
@SpringBootApplication
@Slf4j
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
        log.info("[配置中心]:客户端启动!");
    }

}
复制代码

3.5.2 application.yml

server:
  port: 8082
spring:
  application:
    name: config-client
复制代码

3.5.3 bootstrap.yml

配置客户端启动时,它将通过配置服务器(通过引导配置属性spring.cloud.config.uri)绑定,并使用远程属性源初始化 Spring Environment。需要使用配置中心的客户端应用程序需要 bootstrap.yml 配置。bootstrap.yml 会在 application.yml 之前被加载。

通过配置 spring.cloud.config.discovery.enabled=true 来使用 EnableEurekaClient 找到 id 为 config-server 的配置中心;也可以直接配置 spring.cloud.config.uri=http://192.168.15.1:8888 来配置注册中心地址。

使用 eureka.client.serviceUrl.defaultZone 来配置注册中心服务器地址。

spring:
  cloud:
    config:
      name: globalConfig
      profile: prod
      label: master
      discovery:
        enabled: true
        service-id: config-server
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.15.1:8761/eureka/
复制代码

4. 客户端实例配置加载演示

在 config-client 新建 web controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
/**
 * @className: ConfigClientController
 * @description: 应用程序控制层
 * @author: niaonao
 **/
@RestController
@RequestMapping(value = "/config/client")
public class ConfigClientController {
    /** 外部属性 account */
    @Value("${account}")
    private String account;
    /** 外部属性 repositoryUrl*/
    @Value("${repositoryUrl}")
    private String repositoryUrl;

    @GetMapping("/getRepositoryUrl")
    public String getRepositoryUrl() {
        StringBuilder resultUrl = new StringBuilder("Account:");
        resultUrl.append(account)
                .append("<br/>")
                .append("repositoryUrl:")
                .append(repositoryUrl);
        return resultUrl.toString();
    }
}
复制代码

启动注册中心 eureka-server

启动配置中心 config-server

启动客户端应用 config-client

访问 http://192.168.15.1:8761/ 或 http://localhost:8761 可以看到已成功注册的实例

Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)
访问测试接口 http://localhost:8082/config/client/getRepositoryUrl

看到 config-client 已从配置中心成功加载所配环境的外部属性。

Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)
原文  https://juejin.im/post/5dc9273bf265da4d577724aa
正文到此结束
Loading...