Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
翻译如下:
Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。
SpringCloud主要框架:
随着项目的越来越大,我们发现微服务中的配置信息及其繁杂,每一个微服务都有三个配置文件(dev
,test
,pro
),管控起来比较麻烦,分布于各个微服务中,不便维护。SpringCloud
就为此引出了SpringCloud Config
,用来统一管理配置信息。
SpringCloud Config
提供了git
,svn
,本地
等方式。本文就主要git方式的配置
及本地方式的配置
,至于svn
配置方式用的不多,后面再补充。。。
git
: config 默认Git
加载
通过spring.cloud.config.server.git.uri指定配置信息存储的git地址,比如:https://github.com/xxx/config
local
(本地配置
)
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=classpath:/config
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=file:E:\Java\config
svn
spring.cloud.config.server.svn.uri=http://localhost:8080/store/trunk
spring.cloud.config.server.svn.username=xxx
spring.cloud.config.server.svn.password=xxx
spring.profiles.active=subversion #svn
default-label: trunk #默认SVN分支
远程配置文件
:我就放在git中了eureka
:注册中心config-server
:配置中心服务端config-client
:配置中心客户端1.1 在码云
或者github
上创建个Repository
,我就以github
为例了,创建一个config-demo
仓库,创建springcloud-config-dev.yml
配置,配置内容如下:
config: I am a config
2.1 创建eureka
项目,(eureka
的创建就不多讲了,不会的同学翻下第一期)引入一下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2 在启动类上加上注解@EnableEurekaServer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3.1 创建config-server
项目,pom如下:
<?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.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.take</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</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>
注意要有spring-cloud-config-server
的依赖,至于为什么把spring-cloud-starter-netflix-eureka-client
引入,因为后面要搭建config-server集群
,注册到eureka
注册中心上,实现高可用
。否则一旦config-server
这个微服务宕机
了,会影响其它所有的微服务。
3.2 在启动类上添加注解@EnableConfigServer
,用来启用config-server
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3.3 创建bootstrap.yml
,加入以下配置。
server:
port: 8762
spring:
application:
name: config-server #微服务名称
cloud:
config:
server:
git:
uri: https://github.com/ml0206/config-demo.git #git远程仓库的地址
search-paths: config-demo #git远程仓库的名称,扫描该仓库下的文件
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #指定注册中心
3.4 启动eureka
,再启动config-server
,访问:http://localhost:8762/springcloud-config/dev
调用成功,说明config-server
配置成功
当然你也可以直接访问该配置:http://localhost:8762/springcloud-config-dev.yml
仓库中的配置文件会被转换成web
接口,访问可以参照以下的规则:
以springcloud-config-dev.yml
为例,它的application
是springcloud-config
,profile
是dev
,label
是分支
的意思,如果只有一个主分支,可以不写,默认会访问master
分支,client
会根据填写的参数来选择读取对应的配置。
4.1 创建config-client
项目,pom
如下:
<?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.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.take</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<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-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>
注意引入spring-cloud-starter-config
依赖
4.2 启动类不需要修改,创建bootstrap.yml
,加入以下配置,两种配置均可。
4.2.1 uri
指定配置中心地址
server:
port: 8010
spring:
application:
name: config-client
cloud:
config:
uri: http://localhost:8762/ #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
profile: dev #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
name: springcloud-config #远程配置文件的前缀 例如:springcloud-config-dev.yml,前缀就是springcloud-config
fail-fast: true # 快速失败,优先保证config-server服务正常
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
4.2.2 discovery
server:
port: 8010
spring:
application:
name: config-client
cloud:
config:
# uri: http://localhost:8762/ #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
discovery:
enabled: true # 开启服务发现
service-id: config-server #配置中心的微服务名称
profile: dev #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
name: springcloud-config #远程配置文件的前缀 例如:springcloud-config-dev.yml,前缀就是springcloud-config
fail-fast: true # 快速失败,优先保证config-server服务正常
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
如果config-server
服务注册在eureka
中,可以用discovery
方式
4.3 创建controller
包,包下创建configController
package com.take.configclient.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.RestController;
@RestController
public class ConfigController {
@Value("${config}")
private String config;
@RequestMapping("config")
public String config(){
return this.config;
}
}
4.4 启动config-client
,访问:http://localhost:8010/config
5.1 如果这时候把git
上springcloud-config-dev.yml
中的配置I am a config
修改成I am a config 222
,获取的还是I am a config
就不能获取最新配置了,因为config-client
只在启动时获取一次。springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh
。
修改config-client
项目已到达可以refresh
的功能。
5.2 在config-client
中添加新的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加了spring-boot-starter-actuator
包,spring-boot-starter-actuator
是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh
的功能。
5.3 开启更新机制
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;
@RestController
@RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
public class ConfigController {
@Value("${config}")
private String config;
@RequestMapping("config")
public String config(){
return this.config;
}
}
5.4 修改bootstrap.yml,加入以下配置
server:
port: 8010
spring:
application:
name: config-client
cloud:
config:
# uri: http://localhost:8762/ #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
discovery:
enabled: true # 开启服务发现
service-id: config-server #配置中心的微服务名称
fail-fast: true
profile: dev #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
name: springcloud-config #远程配置文件的前缀 例如:springcloud-config-dev.yml,前缀就是springcloud-config
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
management:
security:
enabled: false
endpoints:
web:
exposure:
include: "*"
management.security.enabled
: springboot 1.5.X 以上默认开通了安全认证,所以需要添加这个配置
management.endpoints.web.exposure.include
: springboot 2.x 默认只开启了info、health的访问,*代表开启所有访问
5.5 再次修改springcloud-config-dev.yml为I am a config 333
,通过cmd
命令行执行:curl -X POST http://localhost:8010/actuator/refresh
,可以看到命令行上有显示:["config.client.version","config"]
意味着config
这个配置已经刷新,这时,我们再去刷新一下页面,可以看到,页面上得到的信息已经变为了:I am a config 333
,这时我们refresh
成功。
6.1 本地配置方式
修改config-server
中的bootstrap.yml
server:
port: 8762
spring:
profiles:
active: native #本地配置(默认是git,可以设置:subversion(SVN),native(本地))
application:
name: config-server
cloud:
config:
server:
native:
search-locations: classpath:/share
bootstrap: true
eureka:
client:
service-url:
defaultzone: http://localhost:8761/eureka
profiles.active=native
本地读取配置
search-locations: classpath:/share
扫描share
文件夹,会从这个文件夹中读取配置
6.2 在resources
中创建share
文件夹,并创建config-client-dev.yml
,内容如下:
word: Hello World
6.3 修改config-client
的bootstrap.yml
如下:
server:
port: 8010
spring:
application:
name: config-client
cloud:
config:
# uri: http://localhost:8762/ #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
discovery:
enabled: true # 开启服务发现
service-id: config-server #配置中心的微服务名称
fail-fast: true
profile: dev #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
name: config-client #远程配置文件的前缀 例如:springcloud-config-dev.yml,前缀就是springcloud-config
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
management:
security:
enabled: false
endpoints:
web:
exposure:
include: "*"
只需要修改profile
和name
,此处远程配置文件为config-client-dev.yml
,name
就是confit-client
,profile
就是dev
6.4 分别启动config-server
,config-client
。访问:http://localhost:8010/config
说明config-client
已经获取到config-server
中的config-client-dev.yml
配置信息了
7.1 svn
配置方式,需要在config-server
加入svn
依赖,这种方式用的不多,有兴趣的朋友,可以配置,只需要改config-server
中的yml
配置,配置信息已经在上方列出来了
org.tmatesoft.svnkit
svnkit
配置完成后,基本上没有多大问题了。但是对于大型的微服务项目来说,有几十个甚至几百个微服务,那么每个微服务都会依赖配置中心config-server
,一旦config-server宕机
,将会影响所有的微服务
,甚是可怕。那我们就要搭建配置中心集群、多节点
。搭建起来也比较简单,直接把config-server
项目,复制一份,改个端口
,微服务名称不要改(spring.application.name
)。重新依次启动eureka
,config-server
,config-server(复制版)
,config-client
,当config-server微服务挂掉
,我们还有config-server(复制版)
,从而实现高可用
。
springcloud-config-demo项目地址
参考链接:
https://www.cnblogs.com/zuowj/p/10432445.html#s-1.3
https://www.cnblogs.com/babycomeon/p/11134717.html
https://www.cnblogs.com/babycomeon/p/11135926.html
开心一刻
今天我那个90后的表弟问我:“大哥,我遇到一个很大的难题,你比我年长十几岁,以你过来人的经验帮我解答解答呗。”
我大手一挥:“没问题!”
表弟想了想:“我被我妈逼婚了,可我不想这么早结婚,你是如何做到这么大了还是一个人的呢?”
我呡了一口茶,然后猛地啐他一脸,愤怒地说:“你给我滚!”
如果觉得不错,帮忙点个赞,您的点赞将是我的动力!
上一篇:Zuul网关之ZuulFilter过滤器
下一篇: