文章目录
- 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 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
SpringCloud Config 服务器以下简称"配置中心"。
Spring Cloud Config 为分布式系统中的外部配置提供服务器和客户端支持。通过 Config Server (配置中心)可以管理 Config Client (应用程序)的外部属性。应用程序可以通过配置 bootstrap.yml,来加载配置中心下指定配置环境的属性。
2.2.1 配置文件命名规范
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
2.2.2 配置环境支持
配置中心环境配置支持 git 存储器,并支持 label 来控制环境配置版本;也支持 svn 存储器;同时也支持本地配置,可以不使用远程存储器。
配置中心 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
spring:
cloud:
config:
server:
svn:
uri:
default-label:
password:
username:
search-paths:
配置中心会读取本地配置文件,配置文件路径 /src/main/resources,如下图在resources 下创建配置文件 /{application}-{profile}.yml
spring:
profiles:
active: native
此处匹配配置中心 config-server 的配置演示。该客户端应用会走 globalConfig-prod.yml 配置环境。
spring:
cloud:
config:
name: globalConfig
profile: prod
label: master
discovery:
enabled: true
service-id: config-server
之前有写基于 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 在这里也作为服务发现实例注册到注册中心。
父项目统一 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.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.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.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/
在 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 可以看到已成功注册的实例
访问测试接口 http://localhost:8082/config/client/getRepositoryUrl 看到 config-client 已从配置中心成功加载所配环境的外部属性。
The End