Spring-cloud 入坑系列之 cloud-config

本贴最后更新于 2130 天前,其中的信息可能已经天翻地覆

入门介绍:
作为 Spring-cloud 全家桶下的配置中心,cloud-config 的出现实现了配置文件与项目的解耦;也可以避免环境配置的泄露,一定程度上减轻了运维工作人员的工作量。说到配置中心,最近公司在使用携程开源的 apollo 分布式配置中心,提供了各版本环境配置的可视化管理工具。相信这种独立的配置管理会是以后 Web 开发中的一大趋势。下面介绍一下 Spring-cloud 中的 Spring-cloud-config 组件:
首先来个入门案例,创建一个基本的 Spring-boot 项目,并引入 Spring-cloud-config 依赖:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

第二步则是在启动类上添加配置注解 @EnableConfigServer,接下来就是配置中心的相关配置;在 application.YAM 的配置如下:

Spring: application: name: config-server cloud: config: server: Git: uri: Git@github.com:xxxx/Spring-cloud-config-demo.Git # ignore-local-SSH-settings: true # private-key: | # -----BEGIN RSA PRIVATE KEY----- # -----END RSA PRIVATE KEY----- # hostKeyAlgorithm: SSH-rsa # host-key: # strict-host-key-checking: false # force-pull: true # search-paths: config-test # username: # password: server: port: 7001

上面标红的配置使用的是 SSH 协议的仓库地址,当然你也可以使用 http 协议地址;使用 http 协议的话可以配置 username 和 password 进行认证;而 SSH 地址则需要配置公钥认证,上图配置中,我只配置了一个 Git 仓库地址,并没有配置公钥,是因为程序会默认使用当前系统用户下的.SSH/的配置,这也为你省去了配置的烦恼。当然你可以改变相应的配置来配合你自身的 Git 仓库。比如我的配置:

Host &quot;xx.xx.xx.xx&quot; Port 3001 User &quot;Git&quot; identityfile C:\Users\Win10.SSH\id_rsa
因为我的 Git 仓库是搭建在自己云服务器上的 Git 服务端,而 SSH 端口默认是 22,这会导致一定的网络攻击,所以我把服务器的 SSH 协议的端口改了,因此你本机的配置也需要相应的改变,不然是无法进行 SSH 通信的。 现在说一说如果不使用本机默认的配置,该怎么配置。首先第一步需要把 ignore-local-SSH-settings: true 放开,该配置的启用忽略了本机默认的配置;同时还必须要配置 private-key,不然系统无法认证;private-key 也就是你本机的秘钥,这里需要注意的是 private-key 必须要安照指定的格式,即:| privatekey,前面的“|”不能忽略,private-key 全部拷过来就行。还有一个配置选项是 strict-host-key-checking,该配置是用来检测你本机.SSH/known_hosts 中是否有该仓库主机的记录;如果你没有连接过,请设置为 false。说一下我遇到的问题吧,因为我的 Git 服务是安装在阿里云服务器上;有几次被别人攻击了添加了对外攻击脚本,因此将 SSH 端口修改了其他端口。那么 Git 客户端也需要修改连接的端口,Spring-cloud-config 中的 Git 配置是无法指定端口的;因此只能在 Git 配置 config 文件中指定端口,如上图的 Port:3001。不使用本地配置是无法修改端口的,所以只能使用本地配置。还有一点,阿里云服务器的 SSH 的公钥配置和 Git 服务器的公钥配置不一定是同一个;因此你需要连接 Git 的话你只需要添加公钥到 Git 安装路径下的配置文件即可。以上就是搭建的过程,另外最好禁止 Git 用户使用客户端登录服务器,具体的做法是:
vim /etc/passwd #git:x:1000:1000::/home/git:/bin/bash //原来配置 git:x:1000:1000::/home/git:/usr/local/git/bin/git-shell //后面的路径为git的git-shell路径

这样就可以禁止 Git 用户使用 SSH 登录服务器,当然你还可以结合其他 Git 权限管理的其他工具管理相应的权限。

2.动态刷新:可以将新的配置动态加载到内存中,省去了重启应用的时间
具体实现,首先引入依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

actuator 模块提供了项目状态监测的功能,其次需要暴露动态更新的接口,在配置中

management.endpoints.web.exposure.include=* //全部开放 management.endpoints.web.exposure.include=refresh,env //开放部分接口

现在发送一个 POST 请求/refresh 至配置客户端便可更新配置
3.通过消息总线 +Rabbitmq 提供配置动态更新
加入依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</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-bus-amqp</artifactId> </dependency>

Rabbitmq 配置:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
management.endpoints.web.exposure.include=* //全部开放
management.endpoints.web.exposure.include=refresh,env //开放部分接口

其思想就是利用 Git 的 hook 钩子功能,在 Git 有提交的修改后会触发项目提供的 refresh 接口,rabbitmq 便会收到发送更新配置的通知到其他的配置客户端,便可同步动态更新配置,下面需要配置一下 GitHub 的 webhook 回调接口 ![Image.png](https://b3logfile.com/file/2019/09/Image-795c6299.png) 需要注意的是,GitHub 默认会在请求中加上相关提交的载荷: ![Image1.png](https://b3logfile.com/file/2019/09/Image1-d37520a4.png) 如果你没有配置消息转化器去处理,便会如下的错:

{"timestamp":"2019-07-17T03:22:36.859+0000","status":400,"error":"Bad Request","message":"JSON parse error: Cannot deserialize instance of java.lang.String out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.String out of START_ARRAY token\n at [Source: (PushbackInputStream); line: 1, column: 304] (through reference chain: java.util.LinkedHashMap["commits"])","path":"/actuator/bus-refresh"}

因此需要处理相应的头部,代码如下:

@WebFilter(filterName = "bodyFilter", urlPatterns = "/*")
@Order(1)
public class RequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
String url = new String(httpServletRequest.getRequestURI());
//只过滤/actuator/bus-refresh 请求
if (!url.endsWith("/bus-refresh")) {
chain.doFilter(servletRequest, response);
return;
}

//使用HttpServletRequest包装原始请求达到修改post请求中body内容的目的 CustometRequestWrapper requestWrapper = new CustometRequestWrapper(httpServletRequest); chain.doFilter(requestWrapper, response); } @Override public void destroy() { } }
上面是一个过滤器

public class CustometRequestWrapper extends HttpServletRequestWrapper {
public CustometRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
byte[] bytes = new byte[0];
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return byteArrayInputStream.read() == -1 ? true:false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {}

@Override public int read() throws IOException { return byteArrayInputStream.read(); } }; }

}

上面是一个消息处理器 另外需要在启动类加上@ServletComponentScan 注解就行
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 2 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26317 引用 • 109409 回帖 • 1 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 368 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 824 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 739 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 2 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 84 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 2 关注
  • OpenCV
    15 引用 • 36 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 143 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 168 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 自由行
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 2 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 2 关注