一、简介
1、为什么需要统一配置中心
- 不方便维护(多人修改配置文件,容易出现问题)
- 配置内容安全与权限(隔离配置文件,不对开发公开)
- 更新配置项目需重启(更新配置文件重启项目太麻烦了)
2、统一配置中心总体架构
将配置放在远端git上,这样版本控制起来会比较方便,config-server会从远端的git上把配置拉取下来,然后放在本地的git里(双向流动,假如远端的git访问不了,config-server会从本地的git上把配置拉取下来),微服务product和order集成config-client组件,就能够拿到配置。
二、使用统一配置中心
1、config-server
- 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>
<groupId>com.imooc</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<!-- 引入依赖 -->
<dependencies>
<!-- 引入config-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 引入eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入eureka-server-->
<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>
</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>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
- application.yml
spring:
application:
name: config #配置服务名称
#配置config-server
cloud:
config:
server:
git:
uri: https://gitee.com/Amyzwj/config-repo #地址
username: XXX # 用户名
password: XXX # 密码
#配置文件拉取地址
basedir: /Users/Amy/Documents/ideaproject/config/basedir
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
#配置端扣号
server:
port: 8808
- ConfigApplication
package com.imooc.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableDiscoveryClient //开启发现服务功能
@EnableConfigServer //开启服务端功能
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
-
设置远端git
在码云上注册一个账号:https://gitee.com
新建一个项目
新建几个配置文件
- 测试
用.properties,.json,.yml结尾,就转换成相应格式的配置
http://localhost:8808/order-b.properties
http://localhost:8808/order-b.json
http://localhost:8808/order-b.yml
2、命名规则
- /{name}-{profiles}.yml
- /{label}/{name}-{profiles}.yml
- name 服务名 、 profiles环境(env) 、 label 分支(branch)
http://localhost:8808/test/order-dev.yml
http://localhost:8808/order-dev.yml
3、config-client
- pom.xml
<!-- 引入cloud-config-client 统一配置中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
- bootstrap.yml
spring:
application:
name: order #配置服务名称
cloud:
config:
discovery:
enabled: true
service-id: CONFIG #configServer 服务的名字
profile: test
- controller
package com.imooc.order.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/env")
//@RefreshScope
public class EnvController {
@Value("${env}")
private String env;
@GetMapping("/print")
public String print() {
return env;
}
}
-
测试
http://localhost:8803/env/print
4、统一配置中心高可用
config启动三个实例,端口号分别是8807、8808、8809
重新启动config-client这个项目,config-client会根据负载均衡规则调用config服务获取配置。
5、更换另一个Eureka 实例
之前用的Eureka端口号是8761,现在要把跟换成用端口号为8762的Eureka
- 1.启动端口号为8762的Eureka
- 2.config里配置的Eureka端口号换成8762
spring:
application:
name: config #配置服务名称
#配置config-server
cloud:
config:
server:
git:
uri: https://gitee.com/Amyzwj/config-repo #地址
username: XXX # 用户名
password: XXX # 密码
#配置文件拉取地址
basedir: /Users/Amy/Documents/ideaproject/config/basedir
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/
#配置端扣号
server:
port: 8808
- 3.将远端git里面的配置文件Eureka的配置删除,在config-client项目里面加上Eureka的配置,端口号为8762
spring:
application:
name: order #配置服务名称
cloud:
config:
discovery:
enabled: true
service-id: CONFIG #configServer 服务的名字
profile: dev
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/
- 注意:
order.yml里的配置是公共的配置,如果访问order-dev.yml里面的配置,它会把order.yml和order-dev.yml里的配置综合在一起所以把order-dev.yml里Eureka的配置删除,访问这个配置文件还是有Eureka的配置,那是因为综合了order.yml里面的配置,把order.yml里面的Eureka的配置删除,再访问就没有了。以后公共的配置都可以配置在order.yml这个配置文件里面
- 测试