这节我们来学习一下spring cloud的配置中心。
很多课程都会把config server放到靠后的位置来讲,这里之所以放在Eureka之后,是以为一般创建一个微服务项目,配置中心一般是在Eureka之后创建的,我们遵循实际开发中的顺序来讲解。
配置中心的作用
spring cloud 的配置中心,作用就是在微服务框架下实现统一配置管理。为各个服务提供配置信息,具备统一管理、分环境区分不同配置、实时刷新配置和配套安全机制。
因为网上大多数教程都是基于git来实现的配置中心demo,我们这里基于本地配置来实现一个。所谓本地配置也就是讲配置信息,都配置到配置中心中,而git模式,则是讲配置放在git上,由配置中心读取git中的配置。
实操O(∩_∩)O
1、我们新建一个maven项目,名叫config,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">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config</artifactId>
<groupId>com.itzhimei</groupId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</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-client</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>
主要的依赖是这两个:
<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>
2、还是要配置bootstrap.yml文件
1)配置bootstrap.yml如下:
spring:
profiles:
active: dev,native
application:
name: config
eureka:
instance:
prefer-ip-address: true #注册时使用ip地址
server:
port: 2222
2)配置bootstrap-dev.yml
spring:
application:
name: config
profiles:
active: native
cloud:
config:
server:
native:
search-locations: classpath:/servicea/
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
instance:
prefer-ip-address: true #注册时使用ip地址
本地配置中心的重点有两个:
第一个:
spring:
application:
name: config
profiles:
active: native //这里写native就是表示使用配置中心本地配置
第二个:
cloud:
config:
server:
native:
search-locations: classpath:/servicea/ //这里表示配置中心的配置在本地哪个位置
search-locations: classpath:/servicea/ 这里表示配置中心的配置在本地哪个位置,classpath指的是resource资源文件夹下,搜索servicea目录
3、启动类
package com.itzhimei.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
@EnableConfigServer
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigApplication.class);
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
LOGGER.info("配置中心启动完成...");
}
}
重点是:@EnableConfigServer注解,表示讲当前服务声明为一个配置中心。
到这里,一个配置中心服务,已经配置完成了,可以启动注册中心了,我们看到Eureka中已经有了config的注册信息
测试效果
有了注册中心,当然要有取配置的服务,首先在配置中心servicea文件夹添加一个service-a.yml配置文件,添加配置:
user:
name: 张三
age: 20
注意servicea文件夹下的yml配置文件名,要保持和对应服务的serviceId一致,否则服务无法从配置中心获取到配置信息。比如我这里的service-a的服务Id就是service-a,那么我新建的yml文件就是service-a.yml。
在servicea服务中添加一个方法新的测试方法
package com.itzhimei.servicea.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Value("${user.name}")
String name;
@Value("${user.age}")
int age;
@GetMapping(value = "/getInfo")
public String getInfo(){
return "名字是:"+name+",年龄是:"+age;
}
@GetMapping(value = "/getName")
public String getName(){
return "名字是:张三";
}
}
最后一步,要让servicea知道配置中心的存在,修改servicea的bootstrap.yml,修改后的内容:
spring:
application:
name: service-a
profiles:
active: dev
cloud:
config:
discovery:
enabled: true
serviceId: config
# profile: dev
label: servicea
server:
port: 1110
eureka:
instance:
prefer-ip-address: true #注册时使用ip地址
相比上一节,这里的配置增加了:
cloud:
config:
discovery:
enabled: true
serviceId: config
# profile: dev
label: servicea
这几行就是能让servicea知道配置中心,并设置如何从配置中心获取配置,label: servicea就是指定从配置中心哪个目录读取当前项目的配置
启动servicea,访问/getInfo方法 http://192.168.0.106:1110/getInfo
输出结果:名字是:张三,年龄是:20
到这里,一个本地配置中心就配置完成了,动手试一下。