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

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

1. 前言

1.1 Spring Cloud 和 Spring Boot 版本对照表

Boot Version2.2.x2.1.x2.0.x1.5.x
Release TrainHoxtonGreenwichFinchleyEdgware/Dalston

1.2 演示环境

系统开发工具Spring BootSpring Cloud
Win10IDEA2.2.0Hoxton 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,来加载配置中心下指定配置环境的属性。

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

在这里插入图片描述
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 在这里也作为服务发现实例注册到注册中心。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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 可以看到已成功注册的实例
在这里插入图片描述
    访问测试接口 http://localhost:8082/config/client/getRepositoryUrl 看到 config-client 已从配置中心成功加载所配环境的外部属性。

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

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

Powered By niaonao

本课程总计13大章节,115课时,是一门全面的SpringCloud微服务体系化课程。课程共包括十三个大章节,涵盖注册中心、网关、熔断、降级、监控、安全、限流等全部体系。包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 等主流技术。 [为什么要学习Spring Cloud微服务] SpringCloud作为主流微服务框架,已成为各互联网公司的首选框架,国内外企业占有率持续攀升,是Java工程师的必备技能。就连大名鼎鼎的阿里巴巴dubbo也正式更名为Spring Cloud Alibaba,成为了Spring Cloud 微服务中的一个子模块。Spring Cloud是企业架构转型、个人能力提升、架构师进阶的不二选择。   【推荐你学习这门课的理由:知识体系完整+丰富学习资料】 1、本课程总计13大章节,115课时,是一门全面的SpringCloud微服务体系化课程。 2、课程0基础入门,逐层递进深入,理论和代码相结合。 3、十三个大章节,涵盖注册中心、网关、熔断、降级、监控、安全、限流等全部体系。 4、包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 主流技术。 5、课程附带230页高清PDF正课件、Hoxton本配套项目源码37个、Edgware本配套项目26个,所有代码均有详细注释。 【主讲讲师】 尹洪亮Kevin: 现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。 10余年软件行业经验,具有数百个线上项目实战经验。 擅长JAVA技术栈、高并发高可用伸缩式微服务架构、DevOps。 主导研发的蜂巢微服务架构已经成功支撑数百个微服务稳定运行 【学完后我将达到什么水平?】 1、 对Spring Cloud的各个组件能够熟练配置、开发、部署。 2、 吊打一切关于Spring Cloud微服务的笔试面试题 3、 能够上手搭建十分完整的微服务分布式系统,涵盖服务注册与发现、负载、网关、配置中心、监控、安全、熔断等。 4、 对整个微服务体系架构有十分清晰准确的掌握。 【面向人群】 1、 不了解微服务是什么,感觉微服务很难、不敢学,网上资料松散,没有好的学习资料 2、 这么多年还一直在写SSH、SSM项目,没有更新过自己的知识体系。 3、 Spring Cloud组件太多,不知道应该重点关注和学习哪些。 4、 不会搭建微服务项目、依赖项目太多、完全搞不清楚。 【课程知识体系图】
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页