SpringCloud-微服务配置统一管理SpringCloud Config(七)

前言:对于应用,配制文件通常是放在项目中管理的,它可能有spring、mybatis、log等等各种各样的配置文件和属性文件,另外你还可能有开发环境、测试环境、生产环境等,这样的话就得一式三份,若是传统应用还好说,如果是微服务呢,这样不光配置文件有可能冗余而且量大,繁重复杂,不好维护,这样的话就需要一个配置文件的统一管理了。

一、SpringCloud Config简介

  SpringCloud Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括ConfigServer和ConfigClient两部分。

  Server:

  • 实例一般多于两个,以实现HA;
  • 配置以文件形式存储,快速支持目前以SpringBoot的开发方式的配置文件;
  • 支持GIt,码云,SVN,本地文件等多种形式;
  • 支持属性加密;

  Client:即各自的微服务应用;

  使用SpringCloud BUS配置和借助Git仓库的WebHooks自动刷新;

二、SpringCloud Config基本使用

创建服务端:

  1、前面简单介绍了一下Config,那么首先要做的准备是先到Git仓库或者码云中创建一个项目并新建一些配置文件 spring-cloud-repo

  2、创建Maven工程 config-server,添加依赖:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-server</artifactId>
    </dependency>

   3、创建启动类,并加上开启Config服务端注解@EnableConfigServer:

@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {

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

}

  4、添加application属性文件:

server.port=9000
spring.application.name=config-server-9000
spring.cloud.config.server.git.uri=https://gitee.com/lfalex/spring-cloud-repo

  5、启动项目,简单测试,访问:localhost:9000/application/dev,localhost:9000/application-dev.properties:

    访问规则:

      /{appication}/{profile}/[{label}]

      /{application}-{profile}.yml

      /{application}-{profile}.properties

      /{label}/{application}-{profile}.properties

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

    它们都可以映射到对应的配置文件{application}-{profile}.properties,其中{label}为具体的分支,默认为master;

创建客户端(一般为具体的微服务):

  1、创建Maven项目 config-client,添加依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 实现Config的客户端配置 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <!-- 实现通过端点refresh手动刷新 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

  2、创建一般启动类即可,无需添加注解,创建Controller,为测试做准备:

    @Value("${version}")
    private String version;

    @RequestMapping("/getVersion")
    public String getVersion() {
        return this.version;
    }

   3、为了更明显的测试Config是否生效,在application配置文件中添加:

server.port=9001

  4、添加bootstrap.properties配置文件,bootstrap.properties为默认文件名,在springcloud中配置文件有个优先级的概念,当本地application.properties文件和bootstrap.properties文件中配置了同样的属性不同的值,由于bootstrap的优先级高,则在bootstrap中的属性不会被application中的覆盖,反而会覆盖掉application中的配置:

#对应着config server所获取配置文件的{application}和URL
spring.application.name=application
spring.cloud.config.uri=http://localhost:9000/
#对应着文件后面的后缀{profile}
spring.cloud.config.profile=dev
#分支
spring.cloud.config.label=master

  5、先启动服务器,再启动客户端,观察端口和页面,由于前面在application中添加了端口为9001,而远程仓库的配置文件中也添加了端口9999:

 这样就实现了基本的远程配置仓库了,但是一旦有文件更改还得重新启动项目,这样就很有问题了,所以需要刷新,使用/refresh端点刷新:

  1、在application或远程文件中添加:

#由于要使用actuator,所以必须要将安全权限关闭
management.security.enabled=false

  2、在controller上添加注解@RefreshScope注解:

@RestController
@RefreshScope       //非重启项目手动刷新配置注解
public class ConfigController {
      。。。。      
}

  3、启动测试,打开,修改version=dev-3.0.0为version=dev-4.0.0,并发送刷新请求http://localhost:9999/refresh,刷新测试页面查看:

三、SpringCloud Bus自动刷新配置

  前面的基于端点刷新,只针对一个服务,若为多个微服务,这样就很繁琐,所以需要一个可以集体刷新或指定刷新的组件=》SpringCloud Bus;

  1、使用SpringCloud Bus需要使用RabbitMQ,未安装的请安装,基于之前的端点刷新的项目,添加依赖:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

  2、在bootstrap中增加RabbitMQ的配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

  3、启动 config-bus-client测试,打开,修改version=dev-3.0.0为version=dev-4.0.0,并发送刷新请求http://localhost:9999/bus/refresh,刷新测试页面查看:

  还可以通过Git或者码云的WebHooks来发送修改刷新配置请求:

参考书籍:《SpringCloud与Docker微服务架构实战》周力著

代码示例:https://gitee.com/lfalex/springcloud-exampleconfig-serverconfig-clientconfig-bus-client

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何使用mosh替换ssh

毫无疑问,SSH是远程服务器管理最实用的方法。然而,它的主导地位并不意味着它在某些情况下没有缺点。如果您曾在移动设备上使用过SSH,那么,你应该知道SSH的一些...

934
来自专栏Spring相关

Springboot之Actuator的使用解析

Actuator是spring boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看、相关功能统计等。

913
来自专栏lgp20151222

Feign使用Hystrix无效原因及解决方法

首先,使用spring-cloud搭建微服务的过程大部分是根据网上的教程来的,由于网上教程的时间较早,而spring-cloud更新迭代较快,会造成依赖上的一些...

952
来自专栏沈唁志

Swoole入门教程:CentOS7中安装PHP7安装Swoole扩展详细步骤

使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务

863
来自专栏哎_小羊

记录Gerrit2.8.4环境迁移、安装、配置以及问题解决

前段时间,由于公司内部调整,需要将原gerrit系统中部分业务拆分迁移到新gerrit系统中,这里我就将整个环境迁移、环境搭建、环境配置、版本选择等做一下记录,...

3209
来自专栏云计算教程系列

如何在Ubuntu 16.04中为Apache创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

840
来自专栏技术专栏

SpringBoot Docker 部署

昨天尝试了下SpringBoot 的Docker部署,虽然踩了很多坑,但是总算是弄出来了,下面整理一下思路,方便以后使用。 这里部署的难点,主要是我的Spri...

1522
来自专栏古时的风筝

Maven 私服的简单使用

当我们再 pom 文件中依赖了某个包后,如果在没有做特殊配置(也就是使用 maven 的默认配置)的情况下,Maven 会首先到本地仓库去搜索,如果本地仓库没有...

480
来自专栏陈本布衣

布衣之路(二):虚拟机的文件共享和网络模式

除夕之夜,当别的大神都在和家人一起辞旧岁,迎新年的时候,博主这样的小喽啰不敢懈怠,想着一年之计,当早做谋划,趁着别人嗨的时间,笔耕不辍的写篇日志,以此颇觉有意...

2677
来自专栏建站达人秀

如何快速搭建 hexo 博客

本文将简介如何自己的服务器、腾讯云COS及Github Page上部署hexo博客。

2233

扫码关注云+社区