Clay 的技术空间

用进废退 | 艺不压身

大纲

前言

版本说明

在下面的的教程中,使用的 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

阅读全文 »

大纲

Hystrix 请求缓存

Hystrix 的请求缓存(Request Cache)并不同于传统意义上的缓存。它只在同一个请求上下文中生效:当某个命令(Command)第一次以特定参数执行完成后,其结果会被缓存;在该命令的后续执行中,如果再次调用相同参数的命令(Command),将直接返回缓存的结果。缓存的生命周期仅限于这一次请求上下文中有效。使用 HystrixCommand 有两种方式,第一种是使用继承,第二种是使用注解,请求缓存也同时支持这两种使用方式。具体使用例子如下,点击下载完整的案例代码。

阅读全文 »

大纲

前言

版本说明

在本文中,默认使用的 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 的特性

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

阅读全文 »

大纲

服务雪崩效应

服务雪崩概述

微服务之间进行 RPC 或者 HTTP 调用时,一般都会设置 调用超时失败重试 等机制来确保服务的成功执行,这看上去很美好,但如果不考虑服务的熔断和限流,它就是造成服务雪崩的元凶。假设有两个访问量比较大的服务 A 和 B,这两个服务分别依赖 C 和 D,其中 C 和 D 服务都依赖 E 服务(如下图),这就是所谓的 扇出。A 和 B 不断地调用 C 和 D,处理客户请求和返回需要的数据;当 E 服务不能提供服务的时候,C 和 D 的 超时重试机制 会被执行;由于新的请求不断的产生,会导致 C 和 D 对 E 服务的调用大量的积压,产生大量的调用等待和重试调用,会慢慢耗尽 C 和 D 的系统资源(CPU 或者内存等),然后 C 和 D 服务跟着也挂掉。A 和 B 服务会重复 C 和 D 的遭遇,导致系统资源耗尽,然后服务也挂掉了,最终整个服务都不可访问,造成了服务雪崩。

阅读全文 »

大纲

OpenFeign 介绍

Feign 的概述

在使用 Spring Cloud 开发微服务应用时,各个服务提供者都是以 HTTP 接口的形式对外提供服务,因此在服务消费者调用服务提供者时,底层通过 HTTP Client 的方式访问。此时可以使用 JDK 原生的 URLConnection、Apache 的 HTTP Client、Netty 的异步 HTTP Client 或者 Spring 的 RestTemplate 去实现服务间的调用。但是最方便、最优雅的方式是通过 Feign 进行服务间的调用。Feign 是由 Netflix 开发的一个声明式的 Web 服务客户端,它的出现使开发 Web 服务客户端变得很简单。Feign 同时也是一款声明式、模板化的 HTTP 客户端。更多介绍可参考:Feign 项目

OpenFeign 的概述

Spring Cloud OpenFeign 对 Feign 进行了二次封装,使得在 Spring Cloud 中使用 Feign 的时候,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程访问,更感知不到在访问 HTTP 请求。Spring Cloud OpenFeign 增强了 Feign 的功能,使 Feign 有限支持 Spring MVC 的注解,如 @RequestMapping 等。OpenFeign 的 @FeignClient 注解可以解析 Spring MVC 的 @RequestMapping 注解下的接口,并通过 AOP 中的动态代理来产生实现类,在实现类中做负载均衡并调用其他服务,同时默认集成了 Ribbon 与 Hystrix。OpenFeign 基本上就是当前微服务之间调用的事实标准。更多介绍可参考:Spring Cloud OpenFeign 项目Spring Cloud OpenFeign 官方文档Spring Cloud OpenFeign 官方中文教程

阅读全文 »