配置中心(Config Service)
新建spring boot项目,命名为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.config</groupId>
<artifactId>config-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.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>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--这是重点-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--配置注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类添加@EnableConfigServer注解。@EnableDiscoveryClient 配置注册中心
然后配置文件
spring.application.name=config-service
server.port=7001
spring.cloud.config.server.git.uri=https://gitee.com/heqiang917/SpringCloud/
spring.cloud.config.server.git.search-paths=/**
spring.cloud.config.server.git.username=heqiang917
spring.cloud.config.server.git.password=********
#配置注册中心
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
eureka.instance.preferIpAddress=true
spring.cloud.config.server.git.uri:是git上的地址,这是存放配置文件的一个项目。
spring.cloud.config.server.git.search-paths:这是配置文件项目的一个搜索范围,你也可以指定一个或者多个文件夹
后面username和password就不多说了,你的git仓库的登录账号和密码。我用的是码云,
在配置这个配置文件前,我们需要在git仓库上新建几个文件,用于测试我们的config-server项目能否从git仓库上获取仓库上的文件和内容。
比如我在码云上新建了一个SpringCloud的项目,然后在里面新建了文件夹,在文件夹里新建了几个文件
文件里内容自己随便写吧,就像我们一般配置文件一样写成key=value形式就行。
然后启动我们的config-server项目,在浏览器上输入http://127.0.0.1:7001/heqiang917/dev/config-lable-test/
如果出现有dev的内容,也有默认的内容,说明是成功的,如果只有默认配置文件内容,到处是说没配置好,我没找打原因,,当我想查看heqiangspace一系列的文件时,怎么弄显示的都是默认的内容,就是说查看dev下的内容但是显示还是heqiangspace.properties的内容,不知道什么原因,有知道的麻烦留言解释下,小弟初学,写下来纯属记笔记,不是教程。
客户端配置映射(config-client)
同样新建项目,名字是config-client,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.client</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>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.2.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>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--失败重试-->
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类添加@EnableDiscoveryClient注册中心的注解
新建一个bootstrap.properties文件
spring.application.name=heqiang917
#spring.cloud.config.profile=dev
#spring.cloud.config.label=config-lable-test
#spring.cloud.config.uri=http://127.0.0.1:7001/
server.port=7002
#配置注册中心
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
eureka.instance.preferIpAddress=true
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-service
spring.cloud.config.profile=dev
#快速失败策略
spring.cloud.config.failFast=true
为什么是bootstrap文件呢,书上说的是大概因为这是因为SpringBoot对配置文件的加载顺序,这是要让server加载到。
然后写一个测试接口吧
package com.client;
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.RestController;
/**
* Created by qhe on 2018/8/2.
*/
@RefreshScope
@RestController
public class TestController {
@Value("${from}")
private String from;
@RequestMapping("/from")
public String from(){
return this.from;
}
}
然后浏览器访问http://127.0.0.1:7002/from,这样就能通过server获取git上的配置文件内容了,
然后问题来了,我这里其实是错的显示。正确的应该返回dev.test,因为我获取的是test分支下的dev环境的配置文件,里面的内容时dev.test,但是我怎么弄都返回不了,返回的都是默认配置文件里的dev。如有人看到求告知原因,万分感谢。
(个人找了下,发现,每次启动ConfigServer都会从Git 上git clone一次配置文件,并后面跟随一个随机码,这是起到缓存作用,以防止git连不上的时候还可以从本地获取,但是这样就可能会因为缓存而无法实时刷新,个人建议每次启动前删除原先的本地配置文件)
有两点注意:1,客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例中,该配置优先级会高于jar包配置内容,所以Jar包中重复的内容不会再被加载
2,Config server巧妙的通过git clone将配置信息存于本地,起到缓存的作用,即便git连不上,也能读取本地的文件内容。