一.SpringCloud Config是什么

分布式系统面临的问题 --- 配置问题

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理。

SpringCloud Config是什么

SpringCloud Config可以从github上获取配置服务信息,为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

二.SpringCloud Config的工作原理

SpringCloud Config分为服务端和客户端两部分。

服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。

客户端则是通过指定的配置中心来管理应用资源,以及业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

三.SpringCloud Config能做什么

1.集中管理配置文件

2.不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release

3.运行期间动态调整配置,不再需要每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。

4.当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置

5.将配置信息以REST接口的形式暴露

由于SpringCloud Config默认使用GIT来存储配置文件(也支持SVN和本地文件),但最推荐的还是git,而且使用http/https访问的形式。

四.SpringCloud Config 服务端

1.在github上新建一个仓库microservice-config

2.在本地拉取该项目,使用 git clone git@github.com:SillyBoy007/microservice-config.git

3.在该项目里新建一个application.yml

4.编写yml文件,并保存为UTF-8格式

spring:
profiles:
active:
- dev
--- spring:
profiles: dev #开发环境
application:
name: microservice-config-wang-dev ---
spring:
profiles: test #测试环境
application:
name: microservice-config-wang-test

5.上传yml文件到github

查看github的Code发现上面已经有了该文件。那么我们该如何读取github上的文件配置信息呢?

搭建ConfigServer

创建一个模块microservice-config-3344。

pom文件

<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> <parent>
<groupId>com.wang.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent> <artifactId>microservice-config-3344</artifactId> <dependencies>
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 避免Config的Git插件报错:org/eclipse/jgit/api/TransportConfigCallback -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.10.0.201712302008-r</version>
</dependency>
<!-- 图形化监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 熔断 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 热部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>

yml文件配置

server:
port: 3344 spring:
application:
name: microservice-config
cloud:
config:
server:
git:
uri: git@github.com:SillyBoy007/microservice-config.git #git仓库地址
search-paths: microservice-config-learn #git项目的目录

主启动类注解

@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfig3344 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfig3344.class,args);
}
}

修改系统host文件,增加映射

127.0.0.1 config3344.com

测试通过microservice-config-3344是否可以从github上获取配置内容

启动microservice-config-3344项目,分别访问下列的地址

http://config3344.com:3344/application-dev.yml

http://config3344.com:3344/application-test.yml

http://config3344.com:3344/application-dasdd.yml

配置读取规则

1./{application}-{profile}.yml

http://config3344.com:3344/application-dev.yml

2./{application}/{profile}[/{label}]

http://config3344.com:3344/applicaiton/test/master

3./label/{application}-{profile}.yml

http://config3344.com:3344/master/application-test.yml

五.SpringCloud Config 客户端

1.在microservice-config项目下新建一个microservice-config-client.yml文件(以UTF-8格式保存)。

spring:
profiles:
active:
- dev ---
server:
port: 8201
spring:
profiles: dev
application:
name: microservice-config-client eureka:
client:
service-url:
defaultZone: http://eureka-dev.com:7001/eureka/ ---
server:
port: 8202
spring:
profiles: test
application:
name: microservice-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-test.com:7001/eureka/

2.将上述的文件上传到github上。

3.新建microservice-config-client-3355项目

pom文件:

<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> <parent>
<groupId>com.wang.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent> <artifactId>microservice-config-client-3355</artifactId> <dependencies>
<!-- SpringCloud Config客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>

新建bootstrap.yml

application.yml是用户级的资源配置项

bootstrap.yml是系统级的,优先级更高

SpringCloud会创建一个‘BootStrap Context’,作为Spring应用的Application Context的父上下文。初始化的时候‘BootStrap Context’负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的'Environment'。'BootStrap'属性有高优先级,默认情况下,它们不会被本地配置覆盖。'BootStrap context'和'Application Context'有着不同的约定, 所以新增了一个'bootstrap.yml'文件,保证'BootStrap Context'和'Application Context'配置的分离。

spring:
cloud:
config:
name: microservice-config-client #需要从github上读取的资源名称,没有yml后缀名
profile: dev
label: master
uri: http://config3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloud Config获取GitHub的服务地址

新建application.yml

spring:
application:
name: microservice-config-client

host域名映射

127.0.0.1 client-config.com

主启动类

package com.wang.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class ConfigClient3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient3355.class,args);
}
}

新建RestController类测试

package com.wang.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ConfigClientRestController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@RequestMapping
public String getConfig(){
return "applicationName:"+applicationName+"\t eurekaServers:"+eurekaServers+"\t port:"+port;
}
}

启动测试:

1.先启动microservice-config-3344项目,再启动microservice-config-client-3355项目。

2.访问http://client-config.com:8201/http://client-config.com:8201/config

3.修改bootstrap.yml,将环境profile切换为test

4.访问http://client-config.com:8202/ , http://client-config.com:8202/config

六.SpringCloud Config 实际应用

修改microservice-config项目

1.新建microservice-config-eureka-client.yml

spring:
profiles:
active:
- dev
---
server:
port: 7001
spring:
profiles: dev
application:
name: microservice-config-eureka-client

eureka:
instance:
hostname: eureka7001.com #eureka实例的主机名
client:
register-with-eureka: false #不把自己注册到eureka上
fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://eureka7001.com:7001/eureka/

---

server:
port: 7001

spring:
profiles: test
application:
name: microservice-config-eureka-client
eureka:
instance:
hostname: eureka7001.com #eureka实例的主机名
client:
register-with-eureka: false #不把自己注册到eureka上
fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://eureka7001.com:7001/eureka/

2.新建microservice-config-dept-client.yml

spring:
profiles:
active:
- dev
---
server:
port: 8001
spring:
profiles: dev
application:
name: microservice-config-dept-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源类型
driver-class-name: org.gjt.mm.mysql.Driver #数据库驱动
url: jdbc:mysql://localhost:3306/cloudDB01 #数据库url
username: root
password: 123456
dbcp2:
min-idle: 5 #数据库连接池的最小维持连接数
initial-size: 5 #初始化连接数
max-total: 5 #最大连接数
max-wait-millis: 200 #等待连接获取的最大超时时间
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径
type-aliases-package: com.wang.springcloud.entities #所有entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
---
server:
port: 8002
spring:
profiles: test
application:
name: microservice-config-dept-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源类型
driver-class-name: org.gjt.mm.mysql.Driver #数据库驱动
url: jdbc:mysql://localhost:3306/cloudDB02 #数据库url
username: root
password: 123456
dbcp2:
min-idle: 5 #数据库连接池的最小维持连接数
initial-size: 5 #初始化连接数
max-total: 5 #最大连接数
max-wait-millis: 200 #等待连接获取的最大超时时间
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径
type-aliases-package: com.wang.springcloud.entities #所有entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka

3.上传上述两个新文件到github

4.新建microservice-config-eureka-server-7001项目

pom文件

<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> <parent>
<groupId>com.wang.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-config-eureka-server-7001</artifactId> <dependencies>
<!-- SpringCloudConfig配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 热部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>

bootstrap.yml

spring:
cloud:
config:
name: microservice-config-eureka-server
profile: dev
label: master
uri: http://config3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloud Config获取GitHub的服务地址

application.yml

spring:
application:
name: microservice-config-eureka-server

主启动类

package com.wang.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication
@EnableEurekaServer
public class ConfigEurekaServer7001 {
public static void main(String[] args) {
SpringApplication.run(ConfigEurekaServer7001.class,args);
}
}

4.新建microservice-config-dept-client-8001项目

pom文件

<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> <parent>
<groupId>com.wang.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent> <artifactId>microservice-config-dept-client-8001</artifactId> <dependencies>
<!-- SpringCloudConfig配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>com.wang.springcloud</groupId>
<artifactId>microservice-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>

bootstrap.yml

spring:
cloud:
config:
name: microservice-config-dept-client #需要从github上读取的资源名称,注意没有yml后缀名
#profile配置是什么就取什么配置dev or test
profile: dev #配置环境
#profile: test
label: master
uri: http://config3344.com:3344 #SpringCloudConfig获取的服务地址

application.yml

spring:
application:
name: microservice-config-dept-client

4.拷贝microservice-provider-dept-8001项目的mybatis资源文件以及mapper、service业务代码

5.启动测试

先启动microservice-config-3344,然后启动microservice-config-eureka-client,最后启动microservice-config-dept-client-8001,访问http://localhost:7001/,可以看到8001服务已经注册到eureka中了,访问http://localhost:8001/dept/get/1 , 然后切换test环境,访问http://localhost:8002/dept/get/1,可以看到数据的来源也切换了。

SpringCloud与微服务Ⅹ --- SpringCloud Config分布式配置中心的更多相关文章

  1. SpringCloud学习笔记《---06 Config 分布式配置中心---》基础篇

  2. java框架之SpringCloud(7)-Config分布式配置中心

    前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...

  3. SpringCloud学习笔记(九):SpringCloud Config 分布式配置中心

    概述 分布式系统面临的-配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...

  4. SpringCloud Alibaba实战(10:分布式配置中心)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在我们前面介绍Nacos的时候,说到,Nacos除了可以作为注册中心,还可以作为配置 ...

  5. SpringCloud与微服务Ⅲ --- SpringCloud入门概述

    一. 什么是SpringCloud SpringCloud基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetF ...

  6. SpringCloud第六步:搭建分布式配置中心

    什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud con ...

  7. Spring Cloud Config 分布式配置中心【Finchley 版】

    一. 介绍 1,为什么需要配置中心? 当服务部署的越来越多,规模越来越大,对应的机器数量也越来越庞大,靠人工来管理和维护服务的配置信息,变得困难,容易出错. 因此,需要一个能够动态注册和获取服务信息的 ...

  8. SrpingCloud 之SrpingCloud config分布式配置中心

    Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...

  9. SrpingCloud 之SrpingCloud config分布式配置中心实时刷新

    默认情况下是不能及时获取变更的配置文件信息 Spring Cloud分布式配置中心可以采用手动或者自动刷新 1.手动需要人工调用接口   监控中心 2.消息总线实时通知  springbus 动态刷新 ...

随机推荐

  1. Appium中使用相对路径定位元素Xpath

    1.若页面该元素没有ID 2.找出该元素父类,并拷贝出父类的class(类名)和ID 3.点击搜索图标,进行查找 selector内容://android.widget.LinearLayout[@r ...

  2. mac如何查看已连接wifi的密码

    可以通道mac自带的“钥匙串访问”功能查看.选择需要查询的wifi名称,右击选择“将密码拷贝到剪贴板”,输入管理员密码后,密码就拷贝好了. 找个地方粘贴即可看到密码

  3. $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法

    Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...

  4. Linux系统下 docker安装命令

    centos sudo: 使用 root 权限登录 Centos.确保 yum 包更新到最新.yum update 卸载旧版本(如果安装过旧版本的话)yum remove docker docker- ...

  5. 1047 编程团体赛 (20 分)C语言

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  6. linux的指令与文件的搜寻

    1.指令路径搜索which 用法:which [-a] command 选项或参数:-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称  2.文件搜索 (1)wher ...

  7. python专题我对json的日常操作

    一前言 本篇文章将会阐述对json的日常操作,如何读取json文件,将json文件转为字典:如何将字典转为json,将字典写入文件等: 二 josn数据格式简要说明 json对于初学者可以理解是一种数 ...

  8. java架构之路(多线程)JMM和volatile关键字(二)

    貌似两个多月没写博客,不知道年前这段时间都去忙了什么. 好久以前写过一次和volatile相关的博客,感觉没写的那么深入吧,这次我们继续说我们的volatile关键字. 复习: 先来简单的复习一遍以前 ...

  9. Spring--2.Spring之IOC--IOC容器的23个实验(1)

     实验1.IOC容器创建对象,并为属性赋值 Hello World:(通过各种方式给容器中注册对象(注册会员)) 以前是自己new对象,现在所有对象交给容器创建:给容器中注册组件 以后框架编写流程: ...

  10. vue学习--组件之间的传值方式

    1.概述 vue由多个组件构成页面,在不同的组件中有不同的联系,组件之间的传值是十分有必要的 2.父子组件之间传值 --props和$emit 父传子:通过props 方法:子组件:props:['m ...