作者:kirito

Spring Cloud Gateway 是 Spring Cloud 微服务生态下的网关组件,一直以来备受 Java 社区的用户关注,许多企业挑选运用其作为微服务网关或许事务网关。在阿里云上,也不乏有许多网关类型的产品供用户运用,例如 API Gateway 和 MSE Higress,运用 PaaS 化的办法供给网关才能,用户不再需求关注网关的完成,直接取得开箱即用的才能。在早年,用户只能挑选自建 Spring Cloud Gateway,或许购买云产品,而今日介绍的 EDAS 增强 Spring Cloud Gateway 的新姿态,给用户供给了一个新的挑选。

让 Spring Cloud Gateway 出产可用

开源 Spring Cloud Gateway 存在一些让企业级用户担忧的要素,包含内存走漏问题,以及路由规划问题,EDAS 依据云服务总线 CSB 多年沉积下来的 Spring Cloud Gateway 运用经历,对许多现已存在的问题进行了办理,对许多的危险要素也进行了躲避,彻底打消用户运用 Spring Cloud Gateway 技能侧的顾虑。

  • 内存走漏问题,该问题来自于 CSB 的出产实践,Spring Cloud Gateway 底层依赖 netty 进行 IO 通讯,了解 netty 的人应当知道其有一个读写缓冲的规划,假如通讯内容较小,一般会射中 chunked buffer,而通讯内容较大时,例如文件上传,则会触发内存的新分配,而 Spring Cloud Gateway 在对接 netty 时存在逻辑缺点,会导致新分配的池化内存无法彻底收回,导致堆外内存走漏。而且这块堆外内存时 netty 运用 unsafe 自行分配的,经过惯例的 JVM 工具还无法观测,非常荫蔽。

EDAS 主张为 Spring Cloud Gateway 运用增加发动参数 -Dio.netty.allocator.type=unpooled,使得恳求未射中 chunked buffer 时,分配的临时内存不进行池化,躲避内存走漏问题。

-Dio.netty.allocator.type=unpooled 不会导致功用下降,只有大报文才会触发该内存的分配,而网关的最佳实践应该是不答应文件上传这类需求,加上该参数是为了应对非主流场景的一个兜底行为。

  • 开源 Spring Cloud Gateway 并未供给路由装备校验才能,当路由装备犯错时,可能会带来灾难性的结果,例如在装备路由时,误将 POST 写成了 PEST:predicates: Method=PEST,可能会导致网关中所有路由失效,爆破半径极大。

EDAS 主张为 Spring Cloud Gateway 运用装备 spring.cloud.gateway.fail-on-route-definition-error: false ,下降爆破半径。经过 EDAS 创立的路由,将会经过校验,确保路由的格局正确,提早躲避问题。

以上仅仅 EDAS 增强 Spring Cloud Gateway 计划的部分案例,EDAS 围绕功用、安全、稳定性等方面,全面为用户的网关保驾护航,让用户彻底回归到事务本身。

围绕让 Spring Cloud Gateway 出产可用这个根本论题,让用户在云上定心的运用 Spring Cloud Gateway,EDAS 推出了一个新的功用,运用无侵入式的办法增强 Spring Cloud Gateway。

功用介绍

众所周知,在 EDAS 中布置的 Java 运用都会挂载一个 Java Agent,经过 Java Agent 技能,EDAS 供给了丰厚的微服务办理以及可观测性的才能,此次介绍的 Spring Cloud Gateway 增强才能,相同经过该 Java Agent 完成。

EDAS 让 Spring Cloud Gateway 出产可用的二三策

EDAS 增强 Spring Cloud Gateway 带来的最直观的改变就是供给了一个白屏操控台,便运用户进行操作,一起供给了许多的增强才能:

  • 动态装备
  • 自定义插件
  • 路由调试
  • 限流降级
  • 可观测性增强

为了便运用户有一个直观的了解,本文以一个快速入门开端进行介绍。

布置 Spring Cloud Gateway

EDAS 让 Spring Cloud Gateway 出产可用的二三策

用户能够将已有的 Spring Cloud Gateway 打包成 jar 包或许镜像,在 EDAS 中进行布置,或许也能够运用 EDAS 供给 Demo 布置包进行布置。如上图所示,EDAS 新增支撑了 Spring Cloud Gateway 运用的 Demo 布置包,在该布置包中,事先装备好了一个 Nacos 注册中心,会自动连接到当时布置的微服务空间,并未装备任何路由,由于接下来将会进行动态路由装备的演示,所以无需事先在装备文件中装备。整个布置进程和布置一个普通的微服务运用没有任何差异。

创立路由并测验

EDAS 让 Spring Cloud Gateway 出产可用的二三策

EDAS 会识别到 Spring Cloud Gateway 运用的特征,并在菜单栏中动态增加运用网关的菜单。在快速入门中,示例创立了两条路由,分别是 http:// 格局的直接恳求场景和 lb:// 格局的服务发现场景。为便利测验,能够在运用总览中为该网关运用装备一个公网的 SLB,经过 curl 恳求测验:

~ curl 121.xx.xx.xx/httpbin/get
{
  "args": {},
  "headers": {
    "Aaa": "ccc",
    "Accept": "*/*",
    "Content-Length": "0",
    "Eagleeye-Ip": "192.168.2.1",
    "Eagleeye-Pappname": "5ae05114-bc80-4a32-9048-209b3a93d723",
    "Eagleeye-Prpc": "/httpbin/get",
    "Eagleeye-Pspanid": "-7254661991881594415",
    "Eagleeye-Root-App": "5ae05114-bc80-4a32-9048-209b3a93d723",
    "Eagleeye-Rpcid": "0.2.1",
    "Eagleeye-Sampled": "s0",
    "Eagleeye-Spanid": "-1207596966212570593",
    "Eagleeye-Traceid": "eac0a8020116974429411421021d0001",
    "Eagleeye-Userdata": "__microservice_match_result__=[]",
    "Forwarded": "proto=http;host=121.xx.xx.xx;for="140.xx.xx.xx"",
    "Gfs.Scg.Ip": "192.168.2.1",
    "Host": "httpbin.org",
    "Name": "kirito,kirito",
    "User-Agent": "curl/7.64.1",
    "X-Amzn-Trace-Id": "Root=1-652cec7d-50f852f622c546f20f8997fe",
    "X-Forwarded-Host": "121.xx.xx.xx",
    "X-Forwarded-Prefix": "/httpbin"
  },
  "origin": "121.xx.xx.xx, 47.xx.xx.xx",
  "url": "http://121.xx.xx.xx/get"
}

网关成功转发了恳求,至此路由测验完毕。

计划优势

以下情况,均能够考虑运用 EDAS Spring Cloud Gateway 增强计划:

  • 现已在运用 Spring Cloud Gateway
  • 网关存在较强的事务定制需求,例如企业级用户/权限体系对接
  • Java 技能栈主导,希望对网关组件有自主掌控力
  • 网关后端服务运用 Spring Cloud 技能栈

EDAS 供给的 Spring Cloud Gateway 增强计划解耦了网关的事务特点和中间件特点,用户能够专注于在 Spring Cloud Gateway 开源的基础上进行二次开发,注入复杂的事务逻辑,而将网关的功用(动态装备、限流降级等)、安全、功用等中间件特点交给 EDAS。

关于现已在运用 Spring Cloud Gateway 的用户,当 Spring Cloud Gateway 运用被 EDAS 保管后,无需改动任何代码,即能够在保存原本扩展点的一起,取得许多的增强才能。 今后依旧能够在运用基础上继续进行二次开发,使网关运用取得和事务运用相同的开发体会。传统的 PaaS 化网关在自定义扩展的支撑上,一般要求用户去适配网关本身的标准,运用不了解的言语或许插件机制,存在一定的学习成本和危险。

假如用户现在没有网关,考虑新增一个网关,正在进行网关计划的调研,则需求针对本身的事务场景进行充分的考虑。假如契合 Java 技能栈、Spring Cloud 微服务体系等关键词,那么相同能够优先考虑该计划。

比较较阿里云上同类型的 PaaS 网关产品,他们相同有各自的运用场景,例如 API Gateway 能够完成精细化的 API 办理,MSE Higress 能够作为三合一的网关,也能够作为 K8s Ingress 的完成。能够依据本身需求来决定网关计划,EDAS 增强 Spring Cloud Gateway 的计划为用户新添了一个选型。

比较开源 Spring Cloud Gateway,EDAS Agent 增强计划在 100% 兼容开源功用的基础上,进行了以下才能的增强。

才能增强

动态装备才能

EDAS 让 Spring Cloud Gateway 出产可用的二三策

EDAS 为 Spring Cloud Gateway 的路由(Route)和插件(Gateway Filter)供给了动态装备才能,以白屏化的形式呈现,便运用户进行装备。

假如 Spring Cloud Gateway 项目中现已装备了路由,例如装备在 application.yml 中,一起又在 EDAS 操控台中进行了装备,这些路由最终会合并成一份路由集合。需求注意的是 EDAS 操控台中只会展示由 EDAS 发布的路由装备,不会展示 application.yml 中的装备,但实际上这两份路由都会生效。运用该计划时,主张用户经过装备导入&导出的办法将装备迁移至 EDAS 操控台,便利统一办理。

装备导入&导出

EDAS 让 Spring Cloud Gateway 出产可用的二三策

路由和大局插件均支撑经过 Yaml 创立,Yaml 的格局遵从开源 Spring Cloud Gateway 的 schema 标准,以下是两个装备示例:

spring:
  cloud:
    gateway:
      routes:
      # 1. 运用域名进行路由匹配,且后端是固定 HTTP URL 的场景
      - id: r-demo
        predicates:
        # 只有域名为 demo.com 的恳求才会匹配上该路由
        - Host=demo.com
        filters:
        # 该插件在转发恳求时,在恳求头中增加 Header 键值
        - AddRequestHeader=a,b
        # uri 里填写后端 HTTP URL
        uri: http://demo.com
        # order 代表路由的优先级,值越小,优先级越高
        order: 1000
      # 2. 运用途径前缀进行路由匹配,且后端是微服务的场景
      - id: r-demo-2
        predicates:
        # 恳求途径以 /demo-2 最初,才会匹配上该路由
        - Path=/demo-2/**
        filters:
        # 该插件确保恳求在转发至后端服务时,会移除掉 /demo-2 的前缀
        - StripPrefix=1
        # 后端为微服务时,uri应该以 lb:// 最初,并填写服务名
        uri: lb://service-provider
        # 能够为路由增加元数据,以在插件中运用
        metadata:
          ccc: ddd
          eee: 10
        order: 1000

路由 r-demo 是一个经过域名进行路由的装备示例,后端服务对应到了一个直接恳求的地址,路由 r-demo-2 是一个经过途径前缀匹配路由的装备示例,装备了 StripPrefix 插件,使得在转发到后端时移除用于匹配的前缀,后端服务则是以 lb 最初,标明是服务发现发现场景。

一起也支撑批量检查路由的 Yaml 定义:

EDAS 让 Spring Cloud Gateway 出产可用的二三策

Yaml 创立和检查的规划,是为了尽可能地对齐到开源 Spring Cloud Gateway 的标准,假如用户是 Spring Cloud Gateway 开源的资深用户,这会保存用户原有的运用体会。

一起,借助于该功用,能够完成多套网关的装备同步,例如一批路由在测验环境验证完毕,需求迁移至出产网关,只需求将测验环境的路由选中导出,再导入至出产网关即可。

也能够借助于该功用,将用户本地装备文件中的路由导入至 EDAS,彻底由 EDAS 办理,EDAS 供给的动态装备才能运用起来会愈加便利。

插件交互

Spring Cloud Gateway 供给了非常丰厚的插件(GatewayFilter)机制,答应装备在路由和大局等级,EDAS 在此基础上提升了插件的易用性。

EDAS 让 Spring Cloud Gateway 出产可用的二三策

Spring Cloud Gateway 原生的插件装备选用的是精简装备的办法,关于一些不太常用的插件,很难直观地去判别怎么增加参数,在 EDAS 中则没有这样的烦恼,EDAS 会将插件的解释、参数是否必填、参数含义、参数个数进行拆解,防止误用。

插件参阅:

EDAS 让 Spring Cloud Gateway 出产可用的二三策

需求注意的一点是,这些插件是答应重复增加的,但部分插件只主张装备一次,例如 StripPrefix、SetPath 等等,否则会呈现未知的表现。

快速测验

EDAS 让 Spring Cloud Gateway 出产可用的二三策

针关于 Spring Cloud Gateway 运用,EDAS 会列举出操控台中的路由途径,供用户进行路由测验,借助于快速测验的才能,能够在路由装备完毕后快速进行验证,从而判别装备是否正确。

可观测

开源 Spring Cloud Gateway 并未装备网关应有的 accessLog,EDAS 补齐了这部分必备才能,任何经过网关的恳求,都会打印在 /home/admin/.opt/ArmsAgent/logs/scg-access.log 途径下,用户能够在运用详情的日志中心中进行检查:

EDAS 让 Spring Cloud Gateway 出产可用的二三策

用户能够挑选将这份数据收集至 SLS 或许自定义的日志中心,用作监控。

access.log日志格局阐明:

编号 阐明 字段名 内容示例
1 日志记录时刻 dateTime 2023-06-19 16:06:53 966
2 恳求 trace id traceId 0ab32f9f15293956139457176d485a
3 客户端IP clientIp 127.0.0.1
4 恳求办法 method GET
5 恳求途径 path /httpbin/get
6 恳求数据巨细 requestSize 122
7 恳求开端时刻 startTime 1667381534546
8 匹配上的路由ID routeId sc-A
路由对应的URI routeUri httpbin.org:80、lb://sc-A
9 后端调用开端时刻 backendStartTime 1667381534546
10 后端恳求办法 backendMethod GET
11 后端恳求URL backendUrl httpbin.org/get
13 后端恳求体巨细 backendRequestSize 122
14 后端呼应码 backendStatusCode 200
15 后端呼应体巨细 backendResponseSize 433
16 后端调用完毕时刻 backendEndTIme 1667381534560
17 后端调用耗时 backendRt 14
18 恳求呼应码 statusCode 200
19 恳求呼应体巨细 responseSize 433
20 调用是否成功 status SUCCESS/FAILURE
21 错误信息 errorMsg 成功时:-失败时打印具体信息,例如:Service Unavailable
22 恳求完毕时刻 endTime 1667381534565
23 恳求总耗时 rt 19

后续规划

EDAS 增强 Spring Cloud Gateway 计划在后续还会供给更多的才能,丰厚网关生态,现在规划中的才能包含:

  • 丰厚插件生态,新增鉴权、限流降级、跨域插件
  • 跨微服务空间访问微服务
  • 支撑 Metrics 指标,供给网关资源监控和事务监控
  • 单机 QOS 排查才能

欢迎用户运用反应,与咱们进行沟通,钉钉沟通群:23197114。

如需体会,可参阅用户文档:help.aliyun.com/zh/edas/use…