SpringCloud学习笔记(十三)配置中心——SpringCloudConfig
我们在接着第十二篇之后讲讲配置中心。
配置中心的意义不需要多讲了吧,现在我们讲的是SpringCloud全家桶的配置中心。一般情况不使用,但是不能不会。
首先我们要知道,SpringCloudConfig是使用Git 进行配置文件同步的,所以我们在阿里巴巴提供的免费的gitee上进行演示。并且注意,我们只演示手动刷新,自动刷新是不推荐使用的。
我使用了自己的账号创建了一个项目SpringCloud。然后创建了一个文件夹config。
在config文件夹下,我提交了2个配置文件。一个是开发环境的配置文件app-member-dev.properties 另一个是生产环境的配置文件app-member-prd.yml
这两个文件名很有讲究,前面是要获取这个配置文件的服务的别名(app-member),后面是环境(-dev或-prd)。
然后我们在原来的项目结构下,新建一个config项目
pom.xml如下:(就是多了个SpringCloudConfig的服务端)
<?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.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringCloudConfig 服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- eureka 服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然后配置application.yml: (不能给看的我用*号替换了)
server:
### 端口号
port: 8101
spring:
application:
### 注册中心的服务名,在服务中心集群时要保持一致
name: config-server
cloud:
config:
server:
git:
## git路径
uri: https://gitee.com/******/springcloud.git
## 分支名称
label: master
## 文件夹名称
search-paths:
- config
## git 用户登录账号
username: ******@qq.com
### git 用户密码
password: ******
### eureka 配置
eureka:
client:
service-url:
### 注册中心的地址
defaultZone: http://127.0.0.1:8100/eureka/
然后建应该main类,注意注解要加上 @EnableConfigServer
package com.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
// 表示开启EurekaServer服务,开启注册中心
@EnableEurekaServer
@EnableConfigServer
public class AppConfigServer {
// 主进程
public static void main(String[] args) {
SpringApplication.run(AppConfigServer.class, args);
}
}
然后我们先启动Eureka,再启动Config
如上图,config-server已经注册到eureka里面了。
然后我们在浏览器里操作。直接用config-server来访问那两个配置文件。
可以看到,配置文件的信息被读成yml了。我经过尝试,不论你用properties还是yml,最终都会读成yml,而且你在URL里用.properties还是.yml都可以。
我们在git上修改的话,这个是会实时刷新的,我就不演示了。
接下来,重要的是我们的其他服务需要能读取到config里面的配置文件。
我们在parents的pom.xml加上依赖:(actuator监控中心用来做手动刷新的)
<!-- SpringCloud 配置中心客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- actuator监控中心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在app-member的resources文件夹下新建一个bootstrap.yml
spring.cloud.config.profile 就是指使用哪个环境的配置文件,和前面的文件名那里对应,service-id就是config的服务别名了。
然后这里eureka的信息也要配置一下,因为bootstrap.yml会先于application.yml加载,如果这里你不配eureka的信息,那寻找配置中心时就不知道注册中心在哪里,会启动失败。
下面是application.yml :
spring:
application:
### 注册中心的服务名,在服务中心集群时要保持一致
name: app-member
### springcluoud 默认开启ribbon了
ribbon:
### 响应超时时间
ReadTimeout: 5000
### 连接超时时间
ConnectTimeout: 5000
management:
endpoints:
web:
exposure:
## 开启所有端点
include: "*"
application.yml可以不配置eureka的信息了。增加了,amagement.endpoints.web.exposure.include的配置,意思是哪些需要实时刷新,就配全部就好。
另外要注意spring.application.name 必须和配置文件的前半截一致。
我举个例子member的spring.application.name=projectA , spring.cloud.config.profile=dev时,对应的配置文件名就应该是projectA-dev.yml 或者projectA-dev.properties。
这样配好之后,member就能读取到git上的配置文件的信息了。为了演示效果,我们用controller输出配置文件中的信息。
我们在member的controller(原来的MemberServiceImpl.java)中添加如下方法:
package com.study.api.service.impl;
import com.study.api.entity.User;
import com.study.api.service.MemberService;
import com.study.web.ResultBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Project 项目名:service - member - impl
* @CreateTime 创建时间:2019/11/29 14:26
* @Descrition 说明: 会员服务的实现类
*/
@RestController
@RefreshScope
public class MemberServiceImpl implements MemberService {
@Value("${projectInfo}")
private String projectInfo;
@Override
@RequestMapping("/getConfigTest")
public String getConfigTest() {
return projectInfo;
}
}
并且注意,我在类上面加了@RefreshScope注解,不加这个是不能实时刷新的。
然后启动member。访问这个接口。
我们可以看到,输出的结果和git中app-member-dev.properties的一致。profile改成prd时(重启member)如下
亦和app-member-prd.yml的一致。也就是说读取是成功的。
但是如果修改呢?而且中文时会不会乱码呢。
我们自己在git上修改app-member-dev.properties的内容,在尾处加了中文
然后刷新getConfigTest接口
显然没有更新成功,因为我们是手动刷新的呢,所以需要使用actuator去刷新。
我们打开postman,因为刷新接口必须是post接口,我们在浏览器上难以实现。
用post请求http://{ip}:{端口}/actuator/refresh之后,response那里说明projectInfo刷新了(如果没有任何刷新是返回"[]")。那我们再刷新接口看看
显然是刷新了,但是中文乱码了。这个乱码如何解决呢?
网上有搜搜得出的结果基本是让你重写PropertySourceLoader接口的实现类,我就不多说了。
推荐阅读
-
SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版
-
SpringCloud学习笔记(7):使用Spring Cloud Config配置中心
-
携程 Apollo 配置中心 | 学习笔记(十一)| 如何引入Apollo配置中心改造老Web项目?
-
springCloud学习笔记一 注册中心搭建
-
SpringCloud学习笔记-自动刷新配置-SpringCloud-Bus(消息总线)
-
SpringCloud学习笔记【十三】Spring Cloud Bus消息总线
-
SpringCloud学习笔记(二):建立注册中心,注册微服务
-
携程 Apollo 配置中心 | 学习笔记(九) | 如何从Apollo配置中心获取配置?
-
Spring Cloud 学习系列:(十三)高可用的分布式配置中心——Spring Cloud Config
-
SpringCloud学习系列之四-----配置中心(Config)使用详解