精华内容
参与话题
问答
  • 简介在分布式系统中,spring cloud config 提供一个服务端和客户端去提供可扩展的配置服务。我们可用用配置服务中心区集中的管理所有的服务的各种环境配置文件。配置服务中心采用git的方式存储配置文件,因此我们很...

    转载请标明出处:
    https://www.fangzhipeng.com/springcloud/2017/06/06/sc06-config.html
    本文出自方志朋的博客

    个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/06/sc06-config.html

    最新Finchley版本:
    https://www.fangzhipeng.com/springcloud/2018/08/06/sc-f6-config.html
    或者
    http://blog.csdn.net/forezp/article/details/81041028

    在上一篇文章讲述zuul的时候,已经提到过,使用配置服务来保存各个服务的配置文件。它就是Spring Cloud Config。

    一、简介

    在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。

    二、构建Config Server

    创建一个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.forezp</groupId>
    	<artifactId>config-server</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>config-server</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>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-config-server</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-starter-eureka</artifactId>
    		</dependency>
    	</dependencies>
    
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Camden.SR6</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>
    
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    
    
    </project>
    
    
    

    在程序的入口Application类加上@EnableConfigServer注解开启配置服务器的功能,代码如下:

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

    需要在程序的配置文件application.properties文件配置以下:

    spring.application.name=config-server
    server.port=8888
    
    
    spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
    spring.cloud.config.server.git.searchPaths=respo
    spring.cloud.config.label=master
    spring.cloud.config.server.git.username=your username
    spring.cloud.config.server.git.password=your password
    
    
    
    • spring.cloud.config.server.git.uri:配置git仓库地址
    • spring.cloud.config.server.git.searchPaths:配置仓库路径
    • spring.cloud.config.label:配置仓库的分支
    • spring.cloud.config.server.git.username:访问git仓库的用户名
    • spring.cloud.config.server.git.password:访问git仓库的用户密码

    如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写,本例子是公开仓库,放心使用。

    远程仓库https://github.com/forezp/SpringcloudConfig/ 中有个文件config-client-dev.properties文件中有一个属性:

    foo = foo version 3

    启动程序:访问http://localhost:8888/foo/dev

    {"name":"foo","profiles":["dev"],"label":"master",
    "version":"792ffc77c03f4b138d28e89b576900ac5e01a44b","state":null,"propertySources":[]}
    
    

    证明配置服务中心可以从远程程序获取配置信息。

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

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

    三、构建一个config client

    重新创建一个springboot项目,取名为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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    
    	<groupId>com.forezp</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>
    
    	<dependencies>
    		<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>
    
    		<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>Dalston.RC1</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>
    
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    
    
    </project>
    
    
    

    其配置文件bootstrap.properties

    spring.application.name=config-client
    spring.cloud.config.label=master
    spring.cloud.config.profile=dev
    spring.cloud.config.uri= http://localhost:8888/
    server.port=8881
    
    
    • spring.cloud.config.label 指明远程仓库的分支

    • spring.cloud.config.profile

      • dev开发环境配置文件
      • test测试环境
      • pro正式环境
    • spring.cloud.config.uri= http://localhost:8888/ 指明配置服务中心的网址。

    程序的入口类,写一个API接口“/hi”,返回从配置中心读取的foo变量的值,代码如下:

    @SpringBootApplication
    @RestController
    public class ConfigClientApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(ConfigClientApplication.class, args);
    	}
    
    	@Value("${foo}")
    	String foo;
    	@RequestMapping(value = "/hi")
    	public String hi(){
    		return foo;
    	}
    }
    
    
    

    打开网址访问:http://localhost:8881/hi,网页显示:

    foo version 3

    这就说明,config-client从config-server获取了foo的属性,而config-server是从git仓库读取的,如图:

    在这里插入图片描述

    本文源码下载:
    https://github.com/forezp/SpringCloudLearning/tree/master/chapter6

    四、参考资料

    spring_cloud_config

    更多阅读

    史上最简单的 SpringCloud 教程汇总

    SpringBoot教程汇总

    Java面试题系列汇总

    SouthEast
    扫码关注公众号有惊喜

    (转载本站文章请注明作者和出处 方志朋的博客

    展开全文
  • 目录 注:主要只做理论性的总结与分析,相关实战代码会在后面的博客中和github中逐步增加。 一、配置中心的由来及选择 (一)配置中心由来 ...二、Spring Cloud Config概述及基本实现方法介绍 三、Spring Clo...

    目录

    注:主要只做理论性的总结与分析,相关实战代码会在后面的博客中和github中逐步增加。

    一、配置中心的由来及选择

    (一)配置中心由来

    (二)配置中心要求具备的功能

    (三)配置中心基本流转图和支撑体系分析                       ​

    (四)多种配置中心的选择与对比方案

    二、Spring Cloud Config概述及基本实现方法介绍

    三、Spring Cloud Config结合Git实现配置中心方案

    (一)Git版基本工作原理(未加Spring Cloud Bus热刷新)

    (二)Git多种配置信息讲解

    (三)基本的手动刷新和结合Spring Cloud Bus热刷新

    四、Spring Cloud Config结合关系型数据库MYSQL实现配置中心方案

    (一)基本实现原理

    (二)基本要求讲解

    五、Spring Cloud Config结合非关系性数据库MongoDB实现配置中心方案

    (一)基本实现原理

    (二)基本要求讲解

    六、Spring Cloud Config使用技能及功能扩展

    (一)基本实用技能:本地参数覆盖远程参数

    (二)客户端自动刷新实现

    (三)客户端回退功能实现

    (四)客户端安全认证机制JWT实现

    七、Spring Cloud Config实现客户端及服务端高可用方案

    (一)客户端高可用原理及方案

    (二)服务端高可用原理及方案

    八、Spring Cloud Config与Apollo配置使用实现界面化操作

    (一)Apollo基本概述及基本功能介绍

    (二)Apollo总体架构模块分析

    (三)Apollo客户端设计与运行环境介绍

    参考书籍、文献和资料:


    注:主要只做理论性的总结与分析,相关实战代码会在后面的博客中和github中逐步增加。

    一、配置中心的由来及选择

    (一)配置中心由来

    互联网时代下的分布式系统,应用部署在N台服务器上或在云化环境以多实例呈现,如果一个实例一个实例(或一台服务器一台服务器)进行修改配置和重启,一是维护成本极高,二是不现实,配置中心的思想便应运而生。配置中心用作集中管理不同环境和不同集群配置,以及在修改配置后实时动态推送到应用动态更新。

    配置中心管理作为微服务六大实现技术之一,从模型上来分析,包括4大分类、4个核心需求和2个维度分析,在分布式下配置中心在实现上需要满足3大需求:高效获取、实时感知、分布式访问。基本理论在之前博客中已经讲解过,具体见以下博客链接:https://blog.csdn.net/xiaofeng10330111/article/details/85682513

    (二)配置中心要求具备的功能

    配置中心应该剧本具备以下基本功能,具体如图:

    这里只展示了基本的实现功能,从功能特性、技术路线、可用性和易用性方面还有更多的功能要求,具体可以见(四)以及对应的配置中心实现方案对比。

    (三)配置中心基本流转图和支撑体系分析

    具体可如图所示:

            

    (四)多种配置中心的选择与对比方案

    具体对比分类 具体对比项 重要程度 Spring Cloud Config Netflix Archaius Ctrip Apollo DisConf
    功能特性 静态配置管理 基于file 支持 支持
    动态配置管理 支持 支持 支持 支持
    统一管理 无,需要git、数据库等 支持 支持
    多维度管理 无,需要git、数据库等 支持 支持
    变更管理 无,需要git、数据库等
    本地配置缓存 支持 支持
    配置更新策略
    配置锁 支持 不支持 不支持 不支持
    配置校验
    配置生效时间 重启生效,手动刷新 手动刷新生效 实时 实时
    配置更新推送 需要手动触发 需要手动触发 支持 支持
    配置定时拉取 支持 配置更新目前依赖事件驱动,client重启或server推送操作
    用户权限管理 无,需要git、数据库等 支持 支持
    授权、审核、审计 无,需要git、数据库等 界面直接提供发布历史和回滚按钮 操作记录有赖数据库,但无查询接口
    配置版本管理 git 支持 无,需要git、数据库等
    配置合规检测 不支持 不支持 支持(还需完善)  
    实例配置监控 需要结合Spring Admin 不支持 支持 支持,可以查看每个配置在哪台机器上加载
    灰度发布 不支持 不支持 支持 不支持部分更新
    告警通知 不支持 不支持 支持邮件方式告警 支持邮件方式告警
    统计报表 不支持 不支持 不支持 不支持
    依赖关系 不支持 不支持 不支持 不支持
    技术路线 支持Spring Boot 原生支持 支持 与Spring Boot无关
    支持Spring Config 原生支持 支持 与Spring Cloud无关
    客户端支持 java java java、.net java
    业务系统入侵性 入侵性弱 入侵性弱 入侵性弱 入侵性弱,支持注解和xml
    可依赖组件        
    可用性 单点故障(SPOF) 支持HA部署 支持HA部署 支持HA部署 支持HA部署,高可用由ZK提供
    多数据中心部署 支持 支持 支持 支持
    配置获取性能 unkown unkown unkown unkown
    易用性 配置界面 无,需要git、数据库等操作 统一界面 统一界面

    结论:

    • 从整体上来看的话,携程的Apollo性能及各方面相对于其他配置中心而言是最好的,因为其支持pring Boot和Spring Config,所以在微服务架构中建议最好采用Apollo来作为配置中心;
    • Spring Cloud Config相对Apollo性能与支持没有很全面,但是可以采用一定的开源技术及现有技术进行改善加之原生支持pring Boot和Spring Config,在微服务架构中也是强烈建议采用的方案;
    • 其他两种方案在微服务架构中不建议采用,在此不做分析。

    我们主要对Spring Cloud Config进行分析和理解,Apollo做辅助分析,关于Apollo的相关知识有时间在进行学习和分享。

    二、Spring Cloud Config概述及基本实现方法介绍

    Spring Cloud Config是Spring Cloud微服务体系中的配置中心,是一个集中化外部配置的分布式系统,由服务端和客户端组成,其不依赖于注册中心,是一个独立的配置中心,支持多种存储配置信息形式,目前主要有jdbc、value、native、svn、git,其中默认是git。重点讨论功能有如下两个方面:

    • 将程序中配置的各种功能开关、参数配置、服务器地址------>修改后实时生效
    • 灰度发布、分环境、分集群管理配置--------->全面集中化管理

    因为采用native方式必然决定了每次配置完相关文件后一定要重启Spring Cloud Config,所以一般我们不会采用此方案,在实际操作中我们主要的实现方案有以下四种:Spring Cloud Config结合Git实现配置中心方案+Spring Cloud Config结合关系型数据库实现配置中心方案+Spring Cloud Config结合非关系型数据库实现配置中心方案+Spring Cloud Config与Apollo配置结合实现界面化配置中心方案。

    三、Spring Cloud Config结合Git实现配置中心方案

    (一)Git版基本工作原理(未加Spring Cloud Bus热刷新)

    配置客户端启动时会向服务器发起请求,服务端接收到客户端的请求后,根据配置的仓库地址将Git上的文件克隆到本地的一个临时目录中,这个目录是一个Git的本地仓库目录,然后服务端再读取本地文件返回给客户端。这样做的好处是,当Git服务器故障或者网络请求异常时,保证服务端仍然可以正常工作。

    在实际实现上,服务端需要配置好git的uri地址信息以及search-paths信息,并在对应Git中与之相对应,客户端在bootstrap文件中按照其内容和具体文件名进行配置label、uri、name、profile等消息即可,但是在基本实现上如果修改文件后依旧需要重启来解决此问题,所以需要进行手动刷新或结合Spring Cloud Bus进行热刷新。

    (二)Git多种配置信息讲解

    关于Git配置信息而言,其主要有以下几种方式:

    1.本地仓库

    Spring Cloud Config默认使用Git,对Git的配置也最简单,Config Server可用uri、username、password这三个参数就可以读取配置了,通过Git的版本控制可以使Config Server适应特殊的场景。

    测试时我们也可以使用本地仓库的方式,使用file://前缀,那么uri的配置就可以写作

    spring:
      cloud: 
        config: 
          server: 
            git: 
              uri: file://${user.home}/config-repo     #注意:Windows系统需要使用file:///前缀
                                                       #     ${user.home}代表当前用户的家目录

    2.占位符配置URI

    Spring Cloud Config Server支持占位符的使用,支持{application}{profile}{label}这些占位符对Git的uri配置,通过占位符使用应用名称来区分应用对应的仓库然后进行使用。这里需要注意仓库名称和仓库下面的配置文件名称一致才可以,因为配置了spring.cloud.config.name默认占位符匹配的是spring.application.name。

    spring:
      cloud: 
        config: 
          server: 
            git: 
              uri: https://github.com/hellxz/SpringCloudlearn/config-repo/{application}
                   #此时spring.application.name的值会填充到这个uri中,从而达到动态获取不同位置的配置
    

    3.匹配并配置多个仓库

    Spring Cloud Config Server除了使用{应用名}/{环境名}来匹配配置仓库外,还支持通过带有通配符的表达式来匹配。

    当有多个匹配规则的时候,可以用逗号分隔多个{应用名}/{环境名}配置规则。以官方文档例子举例:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/spring-cloud-samples/config-repo   #默认的仓库
              #注意:配置多个仓库时,Config Server 在启动时会直接克隆第一个仓库的配置库,其他配置库只有请求时才会clone到本地
              repos:
                simple: https://github.com/simple/config-repo
                special:
                  pattern: special*/dev*,*special*/dev*
                  uri: https://github.com/special/config-repo
                local:
                  pattern: local*
                  uri: file:/home/configsvc/config-repo
                test: 
                  pattern: 
                    - '*/development'
                    - '*/staging'
                  uri: https://github.com/development/config-repo

    如果{应用名}/{环境名}不能匹配到仓库,那么就在默认的uri下去查找配置文件。

    上边的例子中,

    • simple 仓库自动匹配到 simple/*
    • special 仓库的pattern,第一个是应用名以special开头,环境名以dev开头;第二个是应用名包含special,环境名以dev开头;多个匹配到同一uri的pattern用逗号分割
    • local 仓库的的pattern也会自动补全为local*/*
    • test仓库中的 pattern 是以通配符开始的,需要使用单引号

    4.子目录存储

    通过spring.cloud.config.server.git.searchPaths来定位到Git仓库的子目录中,相当于在uri后加上searchPaths的目录。

    searchPaths参数的配置也支持使用{应用名}、{环境名}、{分支名}占位符,比如spring.cloud.config.server.git.searchPaths={应用名},通过这样的配置,我们能让每一个应用匹配到自己的目录中。如下举例:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/spring-cloud-samples/config-repo
              searchPaths: '{application}'

    5.访问权限

    使用Git仓库的时候,使用HTTP认证需要使用username和password属性来配置账户,具体如下:

    (还可以使用SSH认证,Config Server本地的.ssh文件或使用私钥等进行配置,如:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_git_ssh_configuration_using_properties)

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/spring-cloud-samples/config-repo
              username: trolley
              password: strongpassword

    (三)基本的手动刷新和结合Spring Cloud Bus热刷新

    为了避免重启项目才能获取最新的配置信息,可以进一步优化做到手动刷新和结合Spring Cloud Bus进行热刷新,其基本要求一般不改动服务端相关配置和代码,但是需要各客户端增加断点访问依赖和安全依赖,这样就可以对外通过访问客户端刷新断点uri来进行刷新操作,手动刷新就是直接访问断点的方式,虽然简单,但是如果每次都要手动刷新的话,面对微服务很多的情况下,就会因为操作人员忘记或者遗漏的情况,从而造成服务出错。在生产实践中,我们往往要求结合Spring Cloud Bus进行热刷新。

    结合Spring Cloud Bus进行热刷新的操作如上图所示,用户更新配置信息时,检查到Git Hook变化,触发Hook配置地址的调用,Config Server接收到请求并发布消息,Bus将消息发送到Config Client,当Config Client接收到消息后重新发送请求加载配置消息。

    四、Spring Cloud Config结合关系型数据库MYSQL实现配置中心方案

    (一)基本实现原理

    Spring Cloud Config是一个独立的配置中心,支持多种存储配置信息形式,其中包括jdbc方式,其基本原理图如下: 

    git有它天然的优势,比如多版本管理、分支管理、提交审核策略等等,但是如果相对其中存储的数据做细粒度的权限控制,就力不从心了。我们可以将持久化从git迁移到MySQL上,这样的好处就是,可以针对配置中心,方便开发出一些对外接口,例如一些用户可配置的动态改更新的参数,同时,由于是数据库方式,当让可以自己在此基础上实现视图化和刷新机制,整体上显得更加优雅。

    (二)基本要求讲解

    具体实现上,需要Config Server端增加服务中心jar包、-配置中心jar包、连接msql数据库相关jar包这三个必须的jar包,在配置文件中需要增加对应的服务名称、连接配置信息、mysql 属性配置、指定注册中心地址等,具体我们要分析的是连接配置信息:

    #连接配置信息
     spring:
      application:
       name: config-server-jdbc
      profiles:
       active: jdbc
      cloud:
       config:
        server:
         default-label: dev
         jdbc:
          sql: SELECT akey , avalue FROM config_server where APPLICATION=? and APROFILE=? and LABEL=?

    连接配置信息中:

    • spring.profiles.active=jdbc ,自动实现JdbcEnvironmentRepository。
    • sql语句自定义,否则会默认为“SELECT KEY, VALUE from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?”,具体可以参考 JdbcEnvironmentRepository 实现。非必须,这里由于采用mysql数据源,keyvalue是保留关键词,原生的实现语句会报错,所以需要重写一下这句查询语句(如果存储的表结构设计不同于上面准备的内容,也可以通过这个属性的配置来修改配置的获取逻辑)
    • 数据库建表为config_server,由于key,value和profile是mysql关键字,所以都在最前面加了a。当然表名字段名都可以自定义。
    • {application} 对应客户端的"spring.application.name"属性;
    • {aprofile} 对应客户端的 "spring.profiles.active"属性(逗号分隔的列表); 
    • {label} 对应服务端属性,这个属性能标示一组配置文件的版本.
    • 只要 select出来是两个字段 ,框架会 自动包装到environment的map<key,value> 。

    然后便是启动类等注解配置和数据库相关操作与构建,相关代码具体见后面博客及github。

    注意,JDBC存储的使用思路,具体使用实际上还有很多可以优化的空间,比如:索引的优化、查询语句的优化;如果还需要进一步定制管理,对于表结构的优化也是很有必要的。

    五、Spring Cloud Config结合非关系性数据库MongoDB实现配置中心方案

    (一)基本实现原理

    Spring Cloud Config作为独立的配置中心,支持多种存储配置信息形式,但是没有提供MongoDB的方式,但是目前已经有相关孵化器,其基本原理图如下:

    其基本原理与关系型数据库原理相类似,相关代码具体见后面博客及github。

    (二)基本要求讲解

    具体实现上,需要Config Server端增加服务中心jar包、-配置中心jar包、连接mongo数据库相关jar包这三个必须的jar包,在配置文件中需要增加对应的服务名称、连接配置信息、mongo属性配置、指定注册中心地址等,相关代码具体见后面博客及github。

    六、Spring Cloud Config使用技能及功能扩展

    (一)基本实用技能:本地参数覆盖远程参数

    主要是指使用本地的参数覆盖远程的参数,这在开发的时候经常会用到,主要配合内容如下:

    spring:
      cloud:
        config:
          allowOverride: true
          overrideNone: true
          overrideSystemProperties: false

    这三个属性的意思是:

    • spring.cloud.config.allowOverride:如果想要远程配置优先级高,那么allowOverride设置为false;如果想要本地配置优先级高那么allowOverride设置为true,默认为true;
    • spring.cloud.config.overrideNone:overrideNone为true时本地配置优先级高,包括系统环境变量、本地配置文件等等,默认为false;
    • spring.cloud.config.overrideSystemProperties:只有系统环境变量或者系统属性才能覆盖远程配置文件的配置,本地配置文件中配置优先级低于远程配置,默认为true。

    (二)客户端自动刷新实现

    在一些应用上面,不需要在服务端批量推送的时候,客户端本身需要获取变化参数的情况,这个时候需要使用客户端自动刷新来完成该功能。具体实现上,可以单独在二方包中增加一个用于自动刷新的功能,引入spring-cloud-config-client和spring-cloud-autoconfigure,并且增加自动配置类(增加间隔刷新时间),在该类中主要注入端点类,通过定时任务和刷新时间,进行配置请求刷新,添加配置后,我们将二方包引入到实际的客户端应用中。

    在客户端中需要引入spring-cloud-config-client、spring-boot-starter-security和我们刚刚新做的二方包,并且在对应的配置文件中增加spring.cloud.config.refreshInterval内容,写一个相关的控制器便可以开始测试了,相关代码具体见后面博客及github。

    (三)客户端回退功能实现

    客户端可以匹配回退机制,主要用于以下两种场景,应用回退手段来处理案例:

    • 因为一定原因出现了网络中断的情况;
    • 配置服务因为一定的原因进行维护而关闭。

    当启用回退时,客户端适配器将“缓存”本地文件系统中的计算属性。要启用回退功能,只需要指定存储缓存的位置即可。

    在具体实现上,我们同样需要在二方包增加对应可以实现客户端回退功能的内容,引入spring-cloud-config-client和spring-security-rsa,增加自动配置类(包含回退本地配置文件所在的文件和名称、要回退配置文件的路径、用来创建本地回退文件的方法)和相关配置内容,

    (四)客户端安全认证机制JWT实现

    Spring Cloud Config客户端使用JWT身份验证方法代替标准的基本身份验证,这种方式需要对服务端和客户端都要改造,具体如下:

    • 客户端向服务端授权Rest Controller发送请求并且带上用户名和密码;
    • 服务端返回JET Token;
    • 客户端查询服务端的配置需要在Header中带上token令牌进行认证。

    在具体实现上,需要在二方包中引入jwt相关内容,并将该二方包作为基本包使用,在此二方包中pom中必须需要引入一下这三项内容spring-boot-autoconfigure、spring-boot-autoconfiguration-processor、spring-cloud-starter-config,创建Config配置类(引入标示username和password以及endpoint内容,同时增加初始化init并采用注解@PostConstruct,表明在Servelt构造函数和Init()方法之间执行具体容器加载),并进一步创建实体类LoginRequest(对应请求username和password)和实体类Token(对应生成的token)。

    将此二方包引入到客户端的pom中,同时引入spring-cloud-config-client,并且在对应bootstrap文件中添加用于参与安全认证所需要的username、password、endpoint(是一个http地址,config server的访问授权地址)。增加启动类和控制器进行测试。

    接下来就需要对服务端的代码进行分析和讨论了,首先,需要在pom中引入spring-cloud-config-server、jwt、gson、spring-boot-starter-security,创建JwtAuthenticationRequest类用于传递用户名和密码,创建JwtAuthenticationResponse实体类返回token信息,创建JwtUser用户认证信息实体类,创建JWT的token认证过滤器和JWT工具类(用于生成token和token验证),创建JWT认证端点类(在认证过程中,未能认证通过的直接返回401状态码),接着创建一个认证账号的验证类MemberServiceImpl及将数据封装为json返回客户端的WebAuthenticationDetailsSourceImpl,最后创建Config进行安全和过滤的自动配置类,增加控制器用于测试,相关代码具体见后面博客及github。相关具体类调用时序图如下:

     

    七、Spring Cloud Config实现客户端及服务端高可用方案

    (一)客户端高可用原理及方案

    客户端的高可用方式,从方案角度来看,主要还是用file的形式,和前面客户端的回退方案思路大致一样,客户端高可用主要是解决当服务端不可用的情况下,在客户端仍然可以正常启动。从客户端的角度出发,不是增加配置中心的高可用性,而是降低客户端对配置中心的依赖程度,从而提高整个分布式架构的健壮性。

    具体实现上,仍然需要创建一个二方包,在二方包中引入spring-cloud-config-client,并且配置属性加载类,创建配置类命名为ConfigSupportConfiguration(主要是用于判断远程加载信息是否可用,如果不能用则将读取加载本地配置文件启动),同时在二方包中增加配置文件spring.factories指明org.springframework.cloud.bootstrap.BootstrapConfiguration。

    将该二方包引入对应的客户端的pom中,同时引入spring-cloud-config-client,在bootstrap文件中增加backup开关并指明你备份的本地地址fallbackLocation,增加对应的启动类和控制器用于测试,相关代码具体见后面博客及github。

    (二)服务端高可用原理及方案

    服务端的高可用在生产环境中也一样重要,通过结合Eureka注册中心的方式来搭建Spring Cloud Config Server高可用,通过Ribbon的负载均衡选择一个Config Server进行连接来获取配置信息,具体流程见上图。

    具体实现上,Eureka相关开发与之前是一样的,不用做多余的代码工作;服务端的pom文件中需要引入spring-cloud-config-server和spring-cloud-starter-netflix-eureka-client,其他按照之前的开发即可;客户端的pom文件中需要引入spring-cloud-config-client和spring-cloud-starter-netflix-eureka-client,并且在bootstrap中不在配置spring.cloud.config.uri信息用于指定Server端地址,而是增加了三个新的配置,具体如下:

    • spring.cloud.config.discovery.enabled:开启Config服务发现支持;
    • spring.cloud.config.discovery.serviceId:指定Server端的name,也就是Server端spring.application.name;
    • euraka.client.service-url.defaultZone:只想注册中心的地址。

    接着,按照以往的流程测试高可用就可以了,相关代码具体见后面博客及github。

    八、Spring Cloud Config与Apollo配置使用实现界面化操作

    (一)Apollo基本概述及基本功能介绍

    1.Apollo简介

    Apollo(阿波罗)是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

    Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,可以说Apollo是目前配置中心产品领域Number1的产品,其成熟度和企业级特性要远远强于Spring Cloud体系中的Spring Cloud Config产品。

    Apollo采用分布式微服务架构,它的架构有一点复杂,Apollo的作者宋顺虽然给出了一个架构图,但是如果没有一定的分布式微服务架构基础的话,则普通的开发人员甚至是架构师也很难一下子理解。

    2.Apollo基本功能介绍

    • 统一管理不同环境、不同集群的配置:Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置;同一份代码部署在不同的集群,可以有不同的配置,比如zk的地址等;通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖
    • 配置修改实时生效(热发布): 用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序
    • 版本发布管理: 所有的配置发布都有版本概念,从而可以方便地支持配置的回滚
    • 灰度发布: 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例
    • 权限管理、发布审核、操作审计:应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。 所有的操作都有审计日志,可以方便的追踪问题
    • 客户端配置信息监控: 可以在界面上方便地看到配置在被哪些实例使用
    • 提供Java和.Net原生客户端:提供了Java和.Net的原生客户端,方便应用集成;支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+);同时提供了Http接口,非Java和.Net应用也可以方便的使用
    • 提供开放平台API:Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。对于有些使用方,它们的配置可能会有比较复杂的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制。
    • 部署简单:配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少。目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来。Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

    (二)Apollo总体架构模块分析

    总体架构模块如下图所示:

    其主要包含了四个核心模块和三个辅助模块:

    1.四个核心模块及其主要功能

    • ConfigService:提供配置获取接口、配置推送接口,服务于Apollo客户端;
    • AdminService:提供配置管理接口、配置修改发布接口,服务于管理界面Portal;
    • Client:为应用获取配置,支持实时更新,通过MetaServer获取ConfigService的服务列表,使用客户端软负载SLB方式调用ConfigService
    • Portal:配置管理界面,通过MetaServer获取AdminService的服务列表,使用客户端软负载SLB方式调用AdminService

    (ConfigService和AdminService都是多实例无状态的部署,需要将自身注册到Eureka中并保持心跳)

    2.三个辅助服务发现模块

    • Eureka:用于服务发现和注册,Config/AdminService注册实例并定期报心跳,和ConfigService在一起部署
    • MetaServer:Portal通过域名访问MetaServer获取AdminService的地址列表,Client通过域名访问MetaServer获取ConfigService的地址列表。相当于一个Eureka Proxy,逻辑角色和ConfigService在一起部署
    • NginxLB:和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表;和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表;和域名系统配合,协助用户访问Portal进行配置管理

    Apollo可以和Spring Cloud Config搭建的微服务进行无缝集成。

    3.为什么选择Eureka作为服务注册中心,而不是使用传统的zk、etcd呢?

    有以下几方面的原因:

    • 它提供了完整的Service Registry和Service Discovery实现。首先是提供了完整的实现,并且也经受住了Netflix自己的生产环境考验,相对使用起来会比较省心。
    • 和Spring Cloud无缝集成:项目本身就使用了Spring Cloud和Spring Boot,同时Spring Cloud还有一套非常完善的开源代码来整合Eureka,所以使用起来非常方便。另外,Eureka还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之后,既充当了Eureka的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性。这一点是我们选择Eureka而不是zk、etcd等的主要原因,为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖。
    • Open Source:由于代码是开源的,所以非常便于了解它的实现原理和排查问题。

    (三)Apollo客户端设计与运行环境介绍

    1.Apollo客户端设计

    Apollo客户端的实现原理:

    • 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
    • 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

           这是一个fallback机制,为了防止推送机制失效导致配置不更新

           客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified

           定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。

    • 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
    • 客户端会把从服务端获取到的配置在本地文件系统缓存一份

           在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置

    • 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知

    2.配置更新推送实现

    Apollo客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。长连接实际上我们是通过Http Long Polling实现的,具体而言:

    • 客户端发起一个Http请求到服务端
    • 服务端会保持住这个连接30秒
    • 如果在30秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的namespace信息,客户端会据此拉取对应namespace的最新配置
    • 如果在30秒内没有客户端关心的配置变化,那么会返回Http状态码304给客户端
    • 客户端在服务端请求返回后会自动重连

    考虑到会有数万客户端向服务端发起长连,在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。

    3.环境要求

    • Java1.7+
    • Guava15.0+ : Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0
    • 注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6

    Apllo这部分的内容目前我还没有在实践中应用,所以后续博客和github中可能暂不停工代码分析。

    参考书籍、文献和资料:

    【1】郑天民. 微服务设计原理与架构. 北京:人民邮电出版社,2018.

    【2】徐进,叶志远,钟尊发,蔡波斯等. 重新定义Spring Cloud. 北京:机械工业出版社. 2018.

    【3】https://blog.csdn.net/xiaofeng10330111/article/details/85682513.

    【4】http://blog.sina.com.cn/s/blog_17ea544680102xive.html.

    【5】https://www.cnblogs.com/hellxz/p/9306507.html.

    【6】https://www.jb51.net/article/147212.htm.

    【7】https://blog.csdn.net/hjbbjh0521/article/details/80363947.

    【8】http://blog.didispace.com/spring-cloud-starter-edgware-3-1/.

    【9】https://blog.csdn.net/john1337/article/details/82413837.

    【10】https://blog.csdn.net/zjh_746140129/article/details/86179522.

    【11】https://blog.csdn.net/ningjiebing/article/details/90638974.

     

    展开全文
  • 我两天前玩游戏害怕笔记本中毒所以用了影子系统,后来GG了上网一看都特么是患难的同道,win10用影子基本凉了,我提供点自己解决的经验吧!我是win10。 电脑开启后出现了几个选项 进入高级选项 ...

    我两天前玩游戏害怕笔记本中毒所以用了影子系统,后来GG了上网一看都特么是患难的同道,win10用影子基本凉了,我提供点自己解决的经验吧!我是win10。
    在这里插入图片描述
    电脑开启后出现了几个选项
    在这里插入图片描述
    进入高级选项
    在这里插入图片描述
    启动修复:发现修复不了,无限蓝屏重启,然后我打算进入安全模式看看,高级选项中有个启动设置,在启动设置里面我选择带网络链接的安全模式,然后无用~

    卸载预览更新:我想我是因为安装影子系统造成的,那我把影子软件卸载了不就好了吗?然后尝试了下不让你执行卸载操作,通过黑窗口进入影子软件安装所在目录,删除文件同样不行,因为系统文件已经损坏,再删也没用~

    系统还原:这个有人成功的,但是我失败了因为我之前没有设置还原点(没备份自然不能还原)~

    重置电脑:没办法了我只能重置了,我选择保留文件重置,删除所有文件就太狠了(如果你电脑没啥东西且下面方法你都试过了,我觉得你可以这样操作),毕竟电脑里面很多有用的东西,重置到50%时候失败了,这个时候我想起来无限蓝屏时候有提示一行终止代码:BAD_SYSTEM_CONFIG 意思是坏的系统配置文件,这个时候我知道系统文件损坏造成的,我估计影子系统对我电脑干了啥或者我关机操作不当造成的,当下只有这个原因了,系统这么强大,更加坚定了不重装系统就能恢复的信念(出去怕传染)~

    命令提示符☆:点击命令提示符进入黑窗口操作——找到系统文件所在,因为电脑恢复了所以那个窗口找不回来了,操作是一样的,看操作。

    输入每行命令就点回车,表示执行此命令

    第一步(切换到C盘):输入c:

    打开窗口我们看到的是X:,不碍事,输入就好
    在这里插入图片描述
    第二步(进入系统文件所在目录):输入cd Windows\System32\config
    在这里插入图片描述
    cd是进入目录的指令

    cd … 是返回上一级目录(记住)

    可以查看config文件里面有啥,输入dir

    标了颜色的五个文件是系统相关文件,有人说是绿色的,有人说是黄色的,还有人说是褐色的。。。

    别说话,你暴露了~

    根据单词可以大概知道这些文件是什么相关的
    在这里插入图片描述
    这时候你发现有一个文件夹Regback
    在这里插入图片描述
    根据单词大概知道有还原意思,好进入看看

    输入:cd Regback

    输入:dir
    在这里插入图片描述
    这里有分歧了。。

    是不是有的人RegBack里面包含了上面标了颜色的五个文件,那么恭喜你,你直接将RegBack里面的五个文件把config里面的替换掉即可,具体操作如下(提示是否替换,输入Y即可替换,注意一定要进入RegBack目录):

    因为楼主RegBack里面没有文件,所以系统找不到,你们有的输入Y替换即可。。
    在这里插入图片描述
    替换好了,退出

    有人直接点X退出,能不能逼格高一点。。。

    输入:exit

    回车

    重启电脑

    =============================================

    说说RegBack中没有文件怎么办(我就没有,心塞!)

    针对终止代码为:BAD_SYSTEM_CONFIG的网络上的办法最实用的是通过高级选项中命令指示符操作,在dos黑窗口中通过指令操作将Regback中的五个文件把config中的替换掉(上面操作),如果没有这些文件只能重装系统了,毕竟咱们能看到的高级选项就那几个,玩不出什么花来~

    但是楼主觉得win10系统应该很牛逼,所以打算再试试(出去怕传染)

    现在基本上确定是系统文件损坏,在不重装系统的情况下我只能把文件修复,操作文件先做好备份不要把文件搞没了。。

    第一步:在config目录下创建文件夹

    输入:md ss
    在这里插入图片描述
    将config里面的五个文件复制到ss文件夹中(操作类似上面)

    输入:copy DEFAULT ss


    在这里插入图片描述
    源文件已经备份,随便玩吧!

    大概有两个方法:

    一:我让朋把他的系统文件(win10)发给我,我再通过U盘设备传到电脑上

    问题1:设备连接上电脑后,无法显示,所以无法完成文件替换操作,原因不明

    问题2:朋友因为系统正常使用,文件使用中无法操作,所以需要重启进入高级选项在命令指示符中将系统文件复制到磁盘中再传给我,我怕朋友打我,太麻烦~

    二:只能依赖系统的自动修复了

    但是之前就修复失败,于是我对五个系统文件进行尝试,反正都损坏而且备份了

    我将五个文件进行删除操作,文件出错无法修复,干脆破罐子破摔直接删了,我看系统能不能有点作用~

    在config目录中输入:del 文件名

    五个文件,一个一个试,无效果我再把分到ss文夹下的文件还原到config中即可
    在这里插入图片描述
    从ss中还原文件
    在这里插入图片描述
    我进行不停地删文件即还原操作之后再进行系统修复(总共就五个文件,主要是自动修复和重置电脑费时间),然后我重置电脑(保留文件),成功了,c盘清理掉了,系统还原到初始,其他正常使用!

    总结:RegBack中有文件的基本上恢复没问题,系统还原也可以尝试下,而RegBack中没有文件的比如我,其实操作说的很模糊,虽然成功了,只是瞎尝试的,具体删除那个文件再修复再重启,我不确定,但是我确定的是win10自动修复可能很慢,但是是有作用的。

    走投无路连重置都重置不了的你就一顿操作猛如虎吧,大不了重装系统呗,不想出去装,网上也有教学装系统的。遇到这种状况的可以花点时间自己研究下,总之电脑我自己修了一天,学的东西还挺多的,虽然不精,但是这些知识都是自己的。如果RegBack中无文件不通过重装系统也可以解决的可以留下你的宝贵意见,给大家提示下,少走弯路,心塞~

    展开全文
  • 当服务很多时,都需要同时从配置中心读取文件的时候,这时我们可以考虑将配置中心做成一个微服务,并且将其集群化,从而达到高可用,架构图如下:一、准备工作继续使用上一篇文章的工程,创建一个eureka-server工程...

    转载请标明出处:
    https://www.fangzhipeng.com/springcloud/2017/06/07/sc07-config.html
    本文出自方志朋的博客

    个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/07/sc07-config.html

    最新Finchley版本请访问:
    https://www.fangzhipeng.com/springcloud/2018/08/07/sc-f7-config.html
    或者
    http://blog.csdn.net/forezp/article/details/81041045

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如下:

    在这里插入图片描述

    一、准备工作

    继续使用上一篇文章的工程,创建一个eureka-server工程,用作服务注册中心。

    在其pom.xml文件引入Eureka的起步依赖spring-cloud-starter-eureka-server,代码如下:

    <?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.forezp</groupId>
    	<artifactId>eureka-server</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>eureka-server</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>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-eureka-server</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>
    			<scope>test</scope>
    		</dependency>
    	</dependencies>
    
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Dalston.RC1</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>
    
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    
    
    </project>
    
    

    在配置文件application.yml上,指定服务端口为8889,加上作为服务注册中心的基本配置,代码如下:

    server:
      port: 8889
    
    eureka:
      instance:
        hostname: localhost
      client:
        registerWithEureka: false
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    

    入口类:

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

    二、改造config-server

    在其pom.xml文件加上EurekaClient的起步依赖spring-cloud-starter-eureka,代码如下:

    <dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-config-server</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-starter-eureka</artifactId>
    		</dependency>
    	</dependencies>
    
    

    配置文件application.yml,指定服务注册地址为http://localhost:8889/eureka/,其他配置同上一篇文章,完整的配置如下:

    spring.application.name=config-server
    server.port=8888
    
    spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
    spring.cloud.config.server.git.searchPaths=respo
    spring.cloud.config.label=master
    spring.cloud.config.server.git.username= your username
    spring.cloud.config.server.git.password= your password
    eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/
    

    最后需要在程序的启动类Application加上@EnableEureka的注解。

    三、改造config-client

    将其注册微到服务注册中心,作为Eureka客户端,需要pom文件加上起步依赖spring-cloud-starter-eureka,代码如下:

    <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>
    
    		<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>
    

    配置文件bootstrap.properties,注意是bootstrap。加上服务注册地址为http://localhost:8889/eureka/

    spring.application.name=config-client
    spring.cloud.config.label=master
    spring.cloud.config.profile=dev
    #spring.cloud.config.uri= http://localhost:8888/
    
    eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/
    spring.cloud.config.discovery.enabled=true
    spring.cloud.config.discovery.serviceId=config-server
    server.port=8881
    
    
    
    • spring.cloud.config.discovery.enabled 是从配置中心读取文件。
    • spring.cloud.config.discovery.serviceId 配置中心的servieId,即服务名。

    这时发现,在读取配置文件不再写ip地址,而是服务名,这时如果配置服务部署多份,通过负载均衡,从而高可用。

    依次启动eureka-servr,config-server,config-client
    访问网址:http://localhost:8889/

    在这里插入图片描述

    访问http://localhost:8881/hi,浏览器显示:

    foo version 3

    本文源码下载:
    https://github.com/forezp/SpringCloudLearning/tree/master/chapter7

    四、参考资料

    spring_cloud_config

    更多阅读

    史上最简单的 SpringCloud 教程汇总

    SpringBoot教程汇总

    Java面试题系列汇总

    SouthEast
    扫码关注公众号有惊喜

    (转载本站文章请注明作者和出处 方志朋的博客

    展开全文
  • config/system 下载包

    千次下载 热门讨论 2009-08-05 14:46:03
    恢复由于注册表损坏而无法启动的 Windows XP 系统,该步骤不能保证一定会将系统完全恢复为以前的状态. 注意:请务必将 5 个注册表配置单元全部替换掉。如果您只替换一两个配置...c:\windows\system32\config\default
  • error: Found option without preceding group in config file: D:\Program Files\mysql-5.6.25-winx64\my.ini at line: 1 Fatal error in defaults handling. Program aborted 问题解决方式 1.将mysql.ini文件内容...
  • 转载请标明出处: ... 本文出自方志朋的博客 在上一篇文章讲述zuul的时候,已经...它就是Spring Cloud Config。 一、简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要...
  • 网上先搂一段简介:Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以为所有环境中的应用程序管理其外部属性。它非常适合spring应用,也可以使用在其他语言的应用上。...
  • vue.config.js打包优化(有效)

    万次阅读 2020-06-10 15:45:42
    //百度上的资料五花八门让人眼花缭乱,别急,这时候我替你亲身经历了,有需要的可以参考下,先上效果图,以免你们以为我吹牛逼,嘻嘻 未优化之前的 //感觉太大了 抬它 优化之后的 废话不多说了,上代码是重点 ...
  • springcloud config服务端配置(一)

    万次阅读 2020-02-23 14:02:28
    用自己GitHub账号在GitHub上新建一个microservicecloud-config的新的repository 又上一步我们得到了ssh的git地址 git@github....本地目录新建(F:\JAVA\ideaIU\microservicecloud-config-...
  • springcloud config配置中心概述

    万次阅读 2020-02-23 12:31:58
    Spring Cloud Config简介 Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可实现功能。 ...
  • 转载请标明出处: ... 本文出自方志朋的博客 上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个...
  • clock_lab.config(text = time.localtime(time.time())) myclock = Tk() myclock.title("myclock") myclock.geometry("400x200") clock_lab = Label(myclock,text= time.localtime(time.time())).pack() clock_...
  • 现在微信端打开就报{errmsg:config:ok} debug为true的时候就是{errmsg:config: invalid signature}。真心找不到还有哪里是错误的了,请大神们指点先,或者讨论下吧。谢谢了 真的木有思路了。。。。。憋了两天...
  • springcloud config服务端配置(二)

    万次阅读 2020-02-24 12:42:18
    接着上一篇把把本地仓库yml文件推送到...一,新建一个Module模块microservicecloud-config-3344它即为Cloud配置中心模块 二,pom文件添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xm...
  • from config import config

    千次阅读 2015-07-10 10:57:00
    一般只有在比较就的python代码中才会用到这个config模块,在百度里很难查到这个信息,英文搜索引擎google和bing中能查到。 介绍及下载地址:https://pypi.python.org/pypi/config/0.3.7 转载于:...
  • config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); } public void AddAppSetting(string key, string value) { config.AppSettings.Settings.Add(key, value); config.Save...
  • 我要打开ipv6功能,一般的方法是通过make menuconfig界面打开相应的选项,我只要ipv6功能,所以其他的都去掉了,修改后的.config和原来相比多了以下几项: CONFIG_IPV6=y # #CONFIG_IPV6_PRIVACY is not set # #...
  • 配置中心(Config-Server)

    万次阅读 2019-03-01 16:17:46
    目录 搭建配置中心 引入依赖 创建启动类 添加配置 ...通过Config-Server,你可以在一个地方集中对所有环境中的应用程序的外部化配置进行管理。例如,当一个应用程序从开发环境切换到测试环...
  • nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [config/mybatis-config.xml]; nested exception is org.apache.ibatis.builder....
  • spring.cloud.config.server.git.uri=xxx/test_spring_cloud_config spring.cloud.config.server.git.searchPaths=config spring.cloud.config.server.git.username=xxx spring.cloud.config.server.git.password=...
  • Git config

    万次阅读 2020-02-14 00:45:26
    git config 命名格式及用法
  • angular.config

    千次阅读 2017-10-10 14:56:46
    在angular中什么情况下用config AngularJS模块可以在被加载和执行之前对模块自身进行配置。当你需要在AngularJS模块加载之前进行配置,就要用到config。只有提供者(Provider)和常量(constant)才能注入到...
  • Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.cloud.config.server.git-org.springframework.cloud.config.server.ssh.SshUriProperties': Could ...
  • vue.config.js 不生效 vue.config.js 文件 ![图片说明](https://img-ask.csdn.net/upload/202005/18/1589773253_87964.png) main.js 文件 ![图片说明]...
  • 1.copy running-config startup-config 與 copy startup-config running-config 兩者有什麼不同??? ANS:running-config 是系統目前正在執行的設定檔,而startup-config則是系統載入時會讀取的設定檔。 這樣說明...
  • Git config 使用说明

    万次阅读 2018-02-04 17:30:32
    Git config 使用说明 卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun,即可关注。 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优秀文章,包括个人总结,...
  • Kubernetes的ConfigMap详解

    万次阅读 2018-04-04 15:26:10
    ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。 1.创建ConfigMap 创建ConfigMap的方式有4种: 通过直接在命令行中指定configmap参数创建,即--from-literal 通过指定文件...
  • 运行./build.py时,报错说“对不起,应用程序i386-linux-gnu-python2.7-config意外停止” 所以就build failed,遇见错误的地方如下: # Build NS-3 Entering directory `./ns-3.8' Note: configuring ns-3 ...
  • vue.config.js的配置: ``` devServer: { proxy: { '/api': { target: 'http://sandbox.starpos.com.cn/', changeOrigin: true,//设置是否跨域 ws:true, } } } ``` 这是我的请求: ``` ...

空空如也

1 2 3 4 5 ... 20
收藏数 400,990
精华内容 160,396
关键字:

config