Spring Cloud 快速入门系列之 Config–配置中心

这节我们来学习一下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

到这里,一个本地配置中心就配置完成了,动手试一下。