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

Spring Cloud Config 配置中心创建与使用(Hoxton RC1版)

文章目录

      • 1. 前言
      • 2. SpringCloud Config 配置中心
        • 2.1 配置中心说明
        • 2.2 配置中心服务端配置
        • 2.3 配置中心客户端配置
      • 3. 配置中心环境搭建
        • 3.1 创建模块注册中心和配置中心
        • 3.2 子模块依赖管理
        • 3.3 注册中心 eureka-server 实现
        • 3.4 配置中心 config-server 实现
        • 3.5 配置中心客户端实例 config-client 实现
      • 4. 客户端实例配置加载演示
      • 5. 服务发现注解 @EnableDiscoveryClient 和 @EnableEurekaClient 区别

1. 前言

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 源码
https://github.com/niaonao/spring-cloud

2. SpringCloud Config 配置中心

2.1 配置中心说明

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

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 配置文件所在路径,全路径即:https://github.com/niaonao/spring-cloud/doc/config

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.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版)_第3张图片
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)_第4张图片
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)_第5张图片

3.2 子模块依赖管理

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


<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.0modelVersion>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.0.RELEASEversion>
        <relativePath/> 
    parent>
    <groupId>pers.niaonaogroupId>
    <artifactId>spring-cloudartifactId>
    <version>1.0-SNAPSHOTversion>

    
    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>Hoxton.RC1spring-cloud.version>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.16.10version>
            <scope>providedscope>
        dependency>
    dependencies>

    <modules>
        <module>eureka-clientmodule>
        <module>eureka-servermodule>
        <module>config-servermodule>
        <module>config-clientmodule>
    modules>
project>

3.2.2 注册中心 eureka-server 的 pom.xml
    引入依赖

spring-cloud-starter-netflix-eureka-server


<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.0modelVersion>
    <parent>
        <groupId>pers.niaonaogroupId>
        <artifactId>spring-cloudartifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <groupId>pers.niaonaogroupId>
    <artifactId>eureka-serverartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>eureka-servername>
    <description>Demo project for Spring Bootdescription>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

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

    <repositories>
        <repository>
            <id>spring-milestonesid>
            <name>Spring Milestonesname>
            <url>https://repo.spring.io/milestoneurl>
        repository>
    repositories>

project>

3.2.3 配置中心 config-server 的 pom.xml
    引入以下依赖

spring-cloud-config-server
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web


<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.0modelVersion>
    <parent>
        <groupId>pers.niaonaogroupId>
        <artifactId>spring-cloudartifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <groupId>pers.niaonaogroupId>
    <artifactId>config-serverartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>config-servername>
    <description>Demo project for Spring Bootdescription>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-config-serverartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

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

    <repositories>
        <repository>
            <id>spring-milestonesid>
            <name>Spring Milestonesname>
            <url>https://repo.spring.io/milestoneurl>
        repository>
    repositories>

project>

3.2.4 配置中心客户端实例 config-client 的 pom.xml
    引入以下依赖:

spring-cloud-starter-config
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web


<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.0modelVersion>
    <parent>
        <groupId>pers.niaonaogroupId>
        <artifactId>spring-cloudartifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <groupId>pers.niaonaogroupId>
    <artifactId>config-clientartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>config-clientname>
    <description>Demo project for Spring Bootdescription>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-configartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

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

    <repositories>
        <repository>
            <id>spring-milestonesid>
            <name>Spring Milestonesname>
            <url>https://repo.spring.io/milestoneurl>
        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("
"
) .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版)_第6张图片
    访问测试接口 http://localhost:8082/config/client/getRepositoryUrl 看到 config-client 已从配置中心成功加载所配环境的外部属性。
Spring Cloud Config 配置中心环境搭建(Hoxton RC1版)_第7张图片

5. 服务发现注解 @EnableDiscoveryClient 和 @EnableEurekaClient 区别

  • @EnableDiscoveryClient 和 @EnableEurekaClient 两个注解都可用于服务发现。
  • @EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix。
  • 注册中心是 Eureka 就使用 @EnableEurekaClient,其他的注册中心可以使用 @EnableDiscoveryClient。
  • 此处使用 @EnableDiscoveryClient 可能会在服务启动时抛出异常。

The End

你可能感兴趣的:([软件工程],框架)