天天看点

SpringCloud Config分布式配置中心模块

说明

SpringCloud Config是SpringCloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端和客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

目标

使用SpringCloud Config实现分布式分配置中心的注册和如何读取配置中心的数据,更新配置文件也能更新程序读取的信息(本文使用的是码云来做代码托管->https://gitee.com)

快速开始

准备

使用码云新建项目,创建了文件夹的话服务端使用searchPaths定位即可,例如:新建文件夹test,再在test里新建文件spring-config-dev.properties内容如下(中文注意转Unicode编码):

info=Spring-config-dev refresh
version=0.0.2
           
服务端

项目结构图

SpringCloud Config分布式配置中心模块

1 更新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>yunlingfly</groupId>
	<artifactId>springcloud-config</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springcloud-config</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.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>Dalston.SR2</spring-cloud.version>
	</properties>

	<dependencies>
		<!-- 引入客户端 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>

		<!-- 引入Eureka将config-server注册到注册中心 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</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>
</project>
           

2 更新application.yml

spring:
  http:
    encoding:
      charset: UTF-8
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          #uri例如:https://gitee.com/yunlingfly/spring-config
          uri: https://gitee.com/xxxxxx/xxxxxx/
          #设置寻找目录,如果有文件夹的话
          searchPaths: test
          #设置账号和密码(如果是私有项目的话)
          username: xxxxxx
          password: xxxxxx
server:
  port: 8763
eureka:
  client:
#    register-with-eureka: true
#    fetch-registry: true
    serviceUrl:
      defaultZone: http://xxx.xxx.xxx.xxx:8761/eureka/,http://xxx.xxx.xxx.xxx:8762/eureka/
    # 不是本机的话需要配置下面的参数
#  instance:
#    preferIpAddress: true
#    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
#    hostname: ${spring.cloud.client.ipAddress}
#    ipAddress: xxx.xxx.xxx.xxx
info:
  name: config-server服务中心
  version: 0.0.1
           

3 编写启动类(@EnableConfigServer)

package yunlingfly.springcloudconfig;

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;

// Eureka服务提供者
@EnableDiscoveryClient
// config服务中心
@EnableConfigServer
@SpringBootApplication
public class SpringcloudConfigApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudConfigApplication.class, args);
	}
}
           
客户端

首先给出项目结构

SpringCloud Config分布式配置中心模块

1 更新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>yunlingfly</groupId>
	<artifactId>springcloud-config-client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springcloud-config-client</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.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>Dalston.SR2</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<!--<scope>provided</scope>-->
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- Eureka服务发现 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

		<!-- 配置retry和AOP防止因网络波动导致直接不能启动连接config-server -->
		<dependency>
			<groupId>org.springframework.retry</groupId>
			<artifactId>spring-retry</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<!-- 刷新 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</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>
</project>
           

2 更新application.yml

info:
  name: git-config-client,一个服务发现者
  version: 0.0.1
#权限安全
management:
  security:
    enabled: false
           

3 更新bootstrap.yml

server:
  port: 8764
spring:
  application:
    # 这个名字很重要,因为如果配置中心使用通配符的话,可以通过使用这个name来替换{application}
    name: spring-config
  cloud:
    config:
      # 后缀
      profile: dev
      # 标签,默认为master分支
      label: master
      #配置下面的参数可以快速测试config-server,如果失败直接报错,避免前面的其他操作
#      fail-fast: true
#      #当快速失败开启时,使用下面的配置(可选)更新retry的参数
#      retry:
#        #最大retry次数,默认6
#        max-attempts: 3
#        #初始重试间隔时间,默认1000
#        multiplier: 1000
#        #下一个间隔的乘数,如1000ms编程1100ms,默认2000
#        initial-interval: 1100
#        #最大间隔时间,默认2000
#        max-interval: 2000
      #下面的方法是直接通过uri连接服务
#      uri: http://xxx.xxx.xxx.xxx:8763/
      discovery:
        #通过Eureka注册中心查找config服务,访问config-server
        enabled: true
        serviceId: config-server
eureka:
  client:
    serviceUrl:
      defaultZone: http://xxx.xxx.xxx.xxx:8761/eureka/,http://xxx.xxx.xxx.xxx:8762/eureka/
           

4 编写启动类

package yunlingfly.springcloudconfigclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudConfigClientApplication {

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

5 编写Controller层

package yunlingfly.springcloudconfigclient.controller;

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.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

// 动态刷新
@RefreshScope
@RestController
public class HelloController {
    @Value("${info}")
    private String info;    //通过远程配置
    @RequestMapping(value = "/config",method = RequestMethod.GET)
    public String hello(){
        System.out.println(info);
        return "success,info:"+info;
    }
}
           
运行

启动Eureka(沿用之前项目),启动服务端,启动客户端,浏览器访问http://localhost:8764/config/

SpringCloud Config分布式配置中心模块

下一步我们更新配置文件 spring-config-dev.properties

info=Spring-config-dev refresh \u66f4\u65b0\u6d4b\u8bd5
version=0.0.3
           

使用POSTMAN使用POST(注意是POST)方法访问http://localhost:8764/refresh即可刷新配置信息

SpringCloud Config分布式配置中心模块

控制台:

SpringCloud Config分布式配置中心模块

重新访问http://localhost:8764/config/发现输出改变了

SpringCloud Config分布式配置中心模块

注意事项:服务端使用@EnableConfigServer开启注册中心服务,客户端注意security权限安全(可以使用/refresh访问刷新),@Value直接读取信息

http请求地址和资源文件映射如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

继续阅读