抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

概述

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在 Spring Cloud 中,有分布式配置中心组件 Spring Cloud Config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程 Git 仓库中。在 Spring Cloud Config 组件中,分两个角色,一是 Config Server,二是 Config Client。

以下以网关为例,开始演示Config Server和Config Client的配置。

Config Server

创建工程

pom依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xzt</groupId>
<artifactId>cloud-config-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-config-service</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>

<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-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>

</project>

启动类

通过 @EnableConfigServer 注解,开启配置服务器功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.xzt.config;

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;

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class CloudConfigServiceApplication {

public static void main(String[] args) {
SpringApplication.run(CloudConfigServiceApplication.class, args);
}

}

application.yml

这里使用git仓库的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spring:
application:
name: cloud-config-service
cloud:
config:
label: master
server:
git:
uri: https://github.com/intxzt/spring-cloud-netflix-config.git
search-paths: repo
username:
password:
# 本地
# profiles:
# active: native #Comma-separated list of active profiles. Can be overridden by a command line switch.
# cloud:
# config:
# server:
# native:
# search-locations: classpath:/config

server:
port: 8888

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

相关配置说明,如下:

  • spring.cloud.config.label:配置仓库的分支
  • spring.cloud.config.server.git.uri:配置 Git 仓库地址(GitHub、GitLab、码云 …)
  • spring.cloud.config.server.git.search-paths:配置仓库路径(存放配置文件的目录)
  • spring.cloud.config.server.git.username:访问 Git 仓库的账号
  • spring.cloud.config.server.git.password:访问 Git 仓库的密码

测试

浏览器访问http://localhost:8888/admin-config/dev/master显示如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "admin-config",
"profiles": [
"dev"
],
"label": "master",
"version": "96c75fddffe2f06cbd478ce73bb089e33690b630",
"state": null,
"propertySources": [
{
"name": "https://github.com/intxzt/spring-cloud-netflix-config.git/repo/admin-config-dev.yml",
"source": {
"spring.application.name": "cloud-admin-service",
"server.port": 8762
}
}
]
}

Config Client

增加pom依赖

1
2
3
4
 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

删除application.yml 新增bootatrap.yml

为了使用Config Server中配置启动网关,需要使用加载顺序更加靠前的bootatrap.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
cloud:
config:
discovery:
enabled: true #Flag to indicate that config server discovery is enabled (config server URL will be looked up via discovery).
service-id: cloud-config-service
name: zuul-config
label: master
profile: dev

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

相关配置说明,如下:

  • spring.cloud.config.discovery.enable:指示已启用配置服务器发现的标志(将通过发现查找配置服务器URL)

  • spring.cloud.config.discovery.service-id:eureka中配置中心的id

  • spring.cloud.config.uri:配置服务中心的网址

  • spring.cloud.config.name:配置文件名称的前缀

  • spring.cloud.config.label:配置仓库的分支

  • spring.cloud.config.profile:配置文件的环境标识

  • dev:表示开发环境

    • test:表示测试环境
    • prod:表示生产环境

注意事项:

  • 配置服务器的默认端口为 8888,如果修改了默认端口,则客户端项目就不能在 application.ymlapplication.properties 中配置 spring.cloud.config.uri,必须在 bootstrap.yml 或是 bootstrap.properties 中配置,原因是 bootstrap 开头的配置文件会被优先加载和配置,切记。

  • 这里使用eureka服务发现配置中心。所以并未指定url。

  • 如果Config Server是本地模式,可不用指定label,规则如下:

    对于zuul-config-dev.yml,需要配置spring.cloud.config.name=zuul-configspring.cloud.config.profile=dev

git仓库

zuul-config-dev.yml

1
2
3
4
5
6
7
8
9
10
11
12
spring:
application:
name: spring-cloud-zuul

server:
port: 8769

zuul:
routes:
api-1:
path: /admin/**
serviceId: cloud-admin-service

测试

依次启动注册中心、配置中心、和网关,访问http://localhost:8769/admin/hi?message=HelloRibbon,出现以下内容

1
{"message":"无法连接,请检查您的网络","status":200}

评论