Clay 的技术空间

用进废退 | 艺不压身

大纲

Consul 的介绍

Consul 是什么

作为集群系统的灵魂,服务治理框架一直都受架构师的青睐。随着微服务思想的普及,越来越多的服务治理框架如雨后春笋般冒了出来。除了 Eureka,HashiCorp 公司的 Consul 也让诸多架构师青睐有加。Consul 是一个分布式高可用的服务网格(Service Mesh)解决方案,提供包括服务发现、配置和分段功能在内的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。简单来说,Consul 是一个分布式高可用的系统服务发现与配置工具,它跟 Eureka 的核心功能一样,但略有不同:

  • Consul 使用 Go 语言编写,以 HTTP 方式对外提供服务
  • Consul 支持多数据中心,这是它的一大特色
  • Consul 提供了可视化的 Web 界面
  • Consul 的一致性协议是 CP(Raft)
  • Consul 除了服务发现之外,还有一些别的功能,例如配置功能
阅读全文 »

大纲

前言

在传统的 SOA 架构体系中,系统调用层级不多,调用关系也不复杂,一旦出现问题,根据异常信息可以很快定位到问题模块并进行排查。但是在微服务的世界里,实例数目成百上千,实例之间的调用关系几乎是网状结构,靠人力去监控和排查问题已经不太可能。这种情况下,一个完善的调用链路监控框架对于运维和开发来说,都是不可或缺的。

阅读全文 »

大纲

大纲

前言

版本说明

在下面的的教程中,使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,特别声明除外。

Config 高可用

对于线上的生产环境,通常对其都是有很高的要求,其中高可用是不可或缺的一部分,必须要保证服务是可用状态,才能保证系统更好地运行,这是业务稳定的保证。

Config 客户端高可用

对于客户端的高可用,这里的方案主要还是用 File 的形式,本质与 “客户端回退” 的思路大体一致。客户端高可用主要是解决当服务端不可用的情况下,客户端依然可以正常启动。从客户端的角度出发,不是增加配置中心的高可用性,而是降低客户端对配置中心的依赖程度,从而提高整个分布式架构的健壮性。客户端加载配置的高可用流程图如下,点击下载完整的案例代码。

阅读全文 »

大纲

前言

版本说明

在下面的的教程中,使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,特别声明除外。

Config 使用技巧

本地参数覆盖远程参数

在某些时候需要使用当前系统的环境变量或者是应用本身设置的参数而不是使用远程拉取的参数,此时 Config Client 可以使用如下配置:

官方 Bug 解决方案:

1
2
3
4
5
6
spring:
cloud:
config:
overrideNone: true
allowOverride: true
overrideSystemProperties: false
  • overrideNone:当 allowOverride 为 true 时,overrideNone 设置为 true,代表外部配置的优先级更低,而且不能覆盖任何已存在的属性源,默认为 false
  • allowOverride:标识 overrideSystemProperties 属性是否启用,默认为 true,设置为 false 表示禁止用户的个性化设置
  • overrideSystemProperties:用来标识外部配置是否能够覆盖系统属性,默认为 true
阅读全文 »

大纲

配置中心介绍

什么是配置中心

在集中式开发时代,配置文件已经基本足够了,因为那时配置的管理通常不会成为一个很大的问题。但是在互联网时代,应用都是分布式系统,部署在 N 台服务器上,想要去线上一台台地重启机器肯定不靠谱,并且维护成本也很高,所以配置中心应运而生。配置中心被用作集中管理不同环境(Dev、Test、Stage、Prod)和不同集群配置,以及在修改配置后将实时动态推送到应用上进行刷新。配置中心应具备的功能如下:

  • Open API
  • 业务无关性
  • 高可用集群
  • 配置生效监控
  • 配合灰度与更新
  • 一致性 K-V 存储
  • 统一配置实时推送
  • 配置全局恢复、备份与历史
阅读全文 »

大纲

前言

版本说明

在本文中,默认使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,Zuul 版本是 1.x,特别声明除外。

Zuul 多层负载

痛点场景

在 Spring Cloud 微服务架构体系中,所有请求的前门的网关 Zuul 承担着请求转发的主要功能,对后端服务起着举足轻重的作用。当业务体量猛增之后,得益于 Spring Cloud 的横向扩展能力,往往加节点、加机器就可以使得系统支撑性获得大大提升,但是仅仅加服务而不加网关是会有性能瓶颈的,单一 Zuul 节点的处理能力十分有限。因此扩张节点往往是微服务连带 Zuul 一起扩张,一般会部署一个 Zuul 集群来横向扩展微服务应用,然后再在请求上层加一层软负载,通常是使用 Nginx 均分请求到 Zuul 集群(如下图)。此时若其中一台 Zuul 服务挂掉了,由于从 Nginx 到 Zuul 其实是没有什么关联性,如果 Zuul 服务宕掉,Nginx 还是会把请求导向到 Zuul 服务,导致从 Nginx 到这 Zuul 节点的请求会全部失效,在 Nginx 没有采取相关应对措施的情况下,这是十分严重的问题。

zuul-nginx

阅读全文 »

ZooKeeper 的应用场景

命名服务

ZooKeeper 可以用来实现分布式命名服务。命名服务是指通过指定的名字来获取资源或者服务的地址,利用 ZooKeeper 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的节点、提供服务的地址、或者一个远程的对象等等。统一命名服务的命名结构如下图所示:

  • (1)在分布式环境下,经常需要对应用 / 服务进行统一命名,以便于识别不同的服务。
    • 类似于域名与 IP 之间对应关系,IP 不容易记住,而域名容易记住。
    • 通过名称来获取资源服务的地址、服务提供者等信息。
  • (2)按照层次结构组织应用 / 服务的名称。
    • 可将服务名称以及地址信息写到 ZooKeeper 上,客户端通过 ZooKeeper 获取可用服务列表。
阅读全文 »

大纲

前言

版本说明

在本文中,默认使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,Zuul 版本是 1.x,特别声明除外。

Zuul Filter 链

工作原理

Zuul 的核心逻辑是由一系列紧密配合工作的 Filter 来实现的,它们能够在进行 HTTP 请求或者响应的时候执行相关操作。可以说,没有 Filter 责任链,就没有如今的 Zuul,更不可能构成功能丰富的” 网关 “,Zuul Filter 的主要特性有以下几点:

  • Filter 的类型:Filter 的类型决定了此 Filter 在 Filter 链中的执行顺序,可能是路由动作发生前,可能是路由动作发生时,可能是路由动作发生后,也可能是路由过程发生异常时
  • Filter 的执行顺序:同一种类型的 Filter 可以通过 filterOrder() 方法来设定执行顺序,一般会根据业务的执行顺序需求,来设定自定义 Filter 的执行顺序
  • Filter 的执行条件:Filter 运行所需要的标准或条件
  • Filter 的执行效果:符合某个 Filter 执行条件,产生的执行效果
阅读全文 »

大纲

Zuul 介绍

Zuul 是什么

Zuul 是由 Netflix 孵化的一个致力于 “网关” 解决方案的开源组件,在动态路由、监控、弹性、服务治理以及安全方面起着举足轻重的作用。从 2012 年 3 月以来,陆续发布了 Zuul 1.0 与 Zuul 2.0 版本,后经 Pivotal 公司将 Zuul 1.0 整合到 Spring Cloud 的生态系统中,即现在的 Spring Cloud Zuul。在 Netflix 官方的解释中,Zuul 是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外 URL 到服务的映射关系,基于 JVM 的后端路由器。其底层基于 Servlet 实现,本质组件是一系列 Filter 所构成的责任链,并且 Zuul 的逻辑引擎与 Filter 可用其他基于 JVM 的编程语言编写(比如 Groovy)。Zuul 默认集成了 Ribbon、Hystrix,其中 Zuul 2.x 版本改动相较 1.x 比较大,底层使用了 Netty。虽然 Netflix 已经在 2018 年 5 月开源了 Zuul 2.x,但由于 Zuul 2.x 在 Spring Cloud Gateway 孵化之前一直跳票发布,而且 Spring Cloud Gateway 目前已经孵化成功,相较于 Zuul 1.x 在功能以及性能上都有明显的提升。因此在 Spring Boot 2.0 以上版本中,并没有对 Zuul 2.0 以上最新高性能版本进行集成,仍然使用 Zuul 1.x 非 Reactor 模式(基于 Servlet 2.5 阻塞架构)的旧版本。更多介绍可参考:Zuul 项目Zuul 官方英文教程Spring Cloud Zuul 官方中文文档

Zuul 的特性

主要特性包括:认证和鉴权、压力控制、动态路由、负载削减、静态响应处理、主动流量管理、金丝雀测试

阅读全文 »