架构师效率快的终极原因:Fizz网关之服务编排

article/2025/10/3 2:27:08

Fizz网关简介

Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

什么是服务编排

服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。

特点: 在线API设计、在线测试、快速开发

##举例说明

订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。

服务编排架构

fizz_aggregate.jpg

服务编排是基于配置文件,每个接口对应一个配置文件,配置信息可通过管理后台的可视化界面来生成。服务编排是一个pipeline的架构,基于配置文件动态生成。一个pipeline由输入,输出和中间的步骤组成。一个pipeline可配置多个步骤(step),一个步骤可配置一个或多个请求(request);步骤是串联执行,每个步骤里的请求是并发执行。

功能介绍

在之前的文章里已经通过一个小例子简单了解过服务编排功能了,下面介绍一下服务编排的主要功能特殊。

  • 接口配置化,动态生成
  • 数据转换和字段映射
  • 支持动态脚本

接口配置化

服务编排是通过配置来定义一个新接口,配置采用json格式编写,以下是前面介绍过的小例子的配置:

{"name": "会员资产信息","debug": false,"type": "REQUEST","method": "GET","path": "/proxy/member-assets/assets/getAssetsInfo","headersDef": {"type": "object","properties": {},"required": []},"paramsDef": {"type": "object","properties": {"memberId": {"type": "integer","title": "会员ID"}},"required": ["memberId"]},"scriptValidate": {},"validateResponse": {"fixedHeaders": {},"headers": {},"fixedBody": {"code": 400},"body": {"msg": "validateMsg"},"script": {}},"stepConfigs": [{"name": "step1","stop": false,"requests": [{"name": "request1","type": "REQUEST","fallback": {},"condition": {},"dataMapping": {"request": {"fixedHeaders": {},"headers": {},"fixedParams": {},"params": {"memberId": "input.request.params.memberId"},"script": {}},"response": {"fixedHeaders": {},"headers": {},"fixedBody": {},"body": {},"script": {}}},"conditionFlag": false,"method": "GET","url": "http://points-service/points/getMebPoints","timeout": "3000"},{"name": "request2","type": "REQUEST","fallback": {},"condition": {},"dataMapping": {"request": {"fixedHeaders": {},"headers": {"memberId": "input.request.params.memberId"},"fixedParams": {},"params": {},"script": {}},"response": {"fixedHeaders": {},"headers": {},"fixedBody": {},"body": {},"script": {}}},"conditionFlag": false,"method": "GET","url": "http://coupon-service/coupon/getCouponCount","timeout": "3000"}],"dataMapping": {}}],"dataMapping": {"response": {"fixedHeaders": {},"headers": {},"fixedBody": {"code": 0,"msg": "ok"},"body": {"data.points": "step1.request1.response.body.data.points","data.coupons": "step1.request2.response.body.data.count"},"script": {}}},"langDef": {"langParam": "","langMapping": {"zh": null,"en": null}}
}

要配置的内容比较多,如果要人手编写编写的话又很容易出错,人手编写的前提还得对配置里每个字段都有一定的了解才可以。为了解决这个问题fizz在管理后台提供了一个可视化界面来生成接口的配置文件,只须按表单提示填写相应内容即可。下面我们来了解一下配置界面和配置的对应关系,但不逐个字段介绍配置信息,因为后续主要是通过界面来维护配置信息。

基础信息

config_basic_info.png

{"name": "会员资产信息","type": "REQUEST","method": "GET","path": "/proxy/member-assets/assets/getAssetsInfo"
}

配置输入

配置输入是用来定义一个接口的请求头,请求体(仅POST请求需要配置)和URL的queryString参数,以及相关的校验规则。定义和校验遵循JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

config_input.png

{"headersDef": {"type": "object","properties": {},"required": []},"paramsDef": {"type": "object","properties": {"memberId": {"type": "integer","title": "会员ID"}},"required": ["memberId"]},"scriptValidate": {},"langDef": {"langParam": "","langMapping": {"zh": null,"en": null}}
}

配置步骤

config_step.png

{"stepConfigs": [{"name": "step1","stop": false,"requests": [{"name": "request1","type": "REQUEST","fallback": {},"condition": {},"dataMapping": {"request": {"fixedHeaders": {},"headers": {},"fixedParams": {},"params": {"memberId": "input.request.params.memberId"},"script": {}},"response": {"fixedHeaders": {},"headers": {},"fixedBody": {},"body": {},"script": {}}},"conditionFlag": false,"method": "GET","url": "http://points-service/points/getMebPoints","timeout": "3000"},{"name": "request2","type": "REQUEST","fallback": {},"condition": {},"dataMapping": {"request": {"fixedHeaders": {},"headers": {"memberId": "input.request.params.memberId"},"fixedParams": {},"params": {},"script": {}},"response": {}},"conditionFlag": false,"method": "GET","url": "http://coupon-service/coupon/getCouponCount","timeout": "3000"}],"dataMapping": {}}]
}

配置输出

config_output.png

{"dataMapping": {"response": {"fixedHeaders": {},"headers": {},"fixedBody": {"code": 0,"msg": "ok"},"body": {"data.points": "step1.request1.response.body.data.points","data.coupons": "step1.request2.response.body.data.count"},"script": {}}}
}

校验结果

校验结果的配置主要用于在入参数校验不通过时返回给接口调用方的响应报文或响应头:

  • 校验不通过时,Fizz会把校验失败的原因(如:会员ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 code, msg
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

config_validate_resp.png

{"validateResponse": {"fixedHeaders": {},"headers": {},"fixedBody": {"code": 400},"body": {"msg": "validateMsg"},"script": {}}
}

数据转换和字段映射

支持配置固定值,引用值和脚本这三种类型的数据映射。通过它们可以完成服务编排接口、request接口入参的拼装和返回结果的加工处理等。

固定值

固定值主要用于需要硬编码的场景,如:下游接口的固定入参

aggr_config_step_mapping_1.png

引用值

引用值主要用于在各个步骤间或从输入引用数据,通常一个request的入参都会引用到输入的值或上一步骤(step)的结果。通过一个简单的引用路径就可以取到相应的值,同时可以指定数据类型做强制类型转换。

aggr_config_step_mapping_2.png

脚本

支持给字段配置脚本,字段的返回返回结果作为字段的值

aggr_config_step_mapping_3.png

aggr_config_step_mapping_4.png

星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

aggr_config_step_mapping_5.png

样例:userInfo = {“userName”: “Fizz”, “userID”: 1234}

优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

引用值规范

# 获取入参请求头aaa的值
input.request.headers.aaa# 获取入参请求体bbb字段的值
input.request.body.bbb# 获取入参URL Query参数fff字段的值
input.request.params.fff# 获取步骤1里request1的请求头ccc的值
step1.request1.request.headers.ccc# 获取步骤1里request1的响应体ddd的值
step1.request1.response.body.ddd# 获取步骤1结果里eee的值
step1.result.eee
  • 支持单值引用,如:string,int等
  • 支持对象类型的引用

input: 表示调用方的输入数据,如H5页面提交上来的参数

stepN.requestN: 表示步骤N里调用接口N的相关参数

stepN.result: 表示步骤N的转换结果

##动态脚本

目前支持Javascript和groovy两种脚本语言, 当有复杂的业务逻辑时可通过脚本来处理。

###Javascript

Javascript (推荐) - ECMAScript 5标准

JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明

aggr_config_script_1.png

###Groovy

aggr_config_script_2.png

异常处理

当要在脚本里中止请求时可以通过以下方式来实现

aggr_config_exception.png

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

#结束语

服务编排功能主要是通过配置的方式来取代原来微服务体系里的聚合类接口,减少胶水代码,通常情况下通过简单的数据映射和转换就可以完成一个聚合接口的开发工作。

介绍

作者:日尧
Fizz Gateway开源地址:https://github.com/wehotel/fizz-gateway-community

官方技术交流群

Fizz官方技术交流①群(已满)
Fizz官方技术交流②群(已满)
Fizz官方技术交流③群:512164278


http://chatgpt.dhexx.cn/article/ppCGJceH.shtml

相关文章

RestCloud API服务编排平台,相比ESB产品性能提升数十倍

RestCloud API服务编排平台&#xff0c;更轻量、更高性能的API可视化编排平台&#xff0c;基于微服务架构、快速构建企业服务总线、全面提升敏捷集成能力、每日调度API流程超过100W。 一、真正的高性能服务编排引擎 1、首创基于纯内存的流程调度引擎&#xff0c;是支持高频调度…

docker swarm 集群服务编排部署指南(docker stack)

Docker Swarm 集群管理 概述 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机&#xff0c;使得容器可以组成跨主机的子网网络。Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用…

Biz-SIP中间件实现服务编排的机制

微服务架构的系统中存在着大量的服务编排&#xff0c;常见的有三种模式&#xff1a; Orchestration&#xff08;编制&#xff09;&#xff1a;通过一个可执行的流程来协同内部及外部的服务交互&#xff0c;通过流程来控制总体的目标、涉及的操作、服务调用顺序。这种模式必须有…

超强K8s服务编排指南,快来围观!

前置说明 k8s_host192.168.214.50 #定义k8s_host变量&#xff0c;此ip为k8s管理机 yaml_host192.168.214.100:9999 #相关服务的配置存放机 操作步骤 Step1: 登录100 jenkins 的机器 该机器是有初始化相关脚本的机器&#xff0c;且与k8s机器互相免密访问 Step2: 初始化项…

RestCloud服务编排平台,API可视化编排

RestCloud服务编排平台通过无代码化来统一编排和调度API服务&#xff0c;通过可视化的拖、拉、拽对API进行编排并实现分布式事务控制、故障自动转移、断点续跑等功能可大幅提升API服务的敏捷化交付能力。API将成为企业的数字化资产且API会越来越多&#xff0c;而企业随着前后端…

esb 服务编排_在ESB中进行路由和编排之间的选择

esb 服务编排 介绍 如今,企业服务总线确实是有用的解决方案,它结合了一系列工具,可以解决应用程序和服务集成领域中的实际问题。 但是,它们给工具箱带来了轻微的不便,给工具箱用户带来了不便,后者知道解决问题的方法必须在工具箱中,但出于他的原因,他不知道是哪一种!…

服务编排:conductor学习(一)

一.Conductor介绍 conductor官方文档&#xff1a;https://netflix.github.io/conductor/conductor介绍&#xff1a;主要是帮助我们在Netflix上编制基于微服务的流程。conductor架构&#xff1a; 4.conductor的安装和运行&#xff1a; 从github查看源代码https://github.co…

如何做服务编排/数据聚合?(使用Goku API Gateway实现)

什么是服务编排/数据聚合&#xff1f; 服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务&#xff0c;并对每个服务的返回结果做数据处理&#xff0c;最终整合成一个大的结果返回给前端。 例如一个服务是“查询用户预定的酒店”&#xff0c;前端仅需要传一个订单…

k8s 使用 yaml 进行服务编排

K8s 是一个容器编排引擎&#xff0c;使用 YAML 文件编排要部署应用&#xff0c;因此在学习之前&#xff0c;应该了解 YAML 语法格式&#xff1a; 缩进表示层级关系不支持制表符 “tab” 缩进&#xff0c;使用空格缩进通常开头缩进 2 个空格字符后缩进 1 个空格&#xff0c;如冒…

Netty学习五:Netty框架之服务编排

一、核心编排组件&#xff1a;ChannelPipeLine ChannelPipeLine是Netty的核心编排组件&#xff0c;负责调度各类ChannelHandler&#xff0c;实际的加工处理由ChannelHandler完成。 ChannelPipeLine可以看做是ChannelHandler的容器&#xff0c;包含一组ChannelHandler实例&…

企业级低代码服务编排库 - Commander

写在前面。低代码最近被炒的火热&#xff0c;各种争议不断&#xff0c;我们且不去添油加醋&#xff0c;仔细想来&#xff0c;在一些特定的场景&#xff0c;在整体架构的特定层面&#xff0c;低代码平台确实是可以发挥其长处的&#xff0c;足矣。 一&#xff0e;微服务编排的必…

资源调度和服务编排技术架构

从传统云网融合的角度出发&#xff0c;结合边缘计算、网络云化及智能控制的优势&#xff0c;在算力网络连接下实现更加广泛的算力资源纳管和动态调度。算力网络正是为了提高云、边、端三级计算的协同工作效率而出现的。算力网络资源调度和服务编排整体技术架构如图1所示。 图1 …

如何通过网关做服务编排?

什么是服务编排/数据聚合&#xff1f; 服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务&#xff0c;并对每个服务的返回结果做数据处理&#xff0c;最终整合成一个大的结果返回给前端。 例如一个服务是“查询用户预定的酒店”&#xff0c;前端仅需要传一个订单…

零代码平台中的服务编排思路

先打个广告&#xff0c;我们的第三场零代码实践的直播在本周五&#xff08; 11 月 5 日 &#xff09;晚8点准时开始&#xff0c;扫描下面二维码&#xff0c;直接预约直播&#xff0c;到时间微信会自动提醒。 随着企业数字化转型的进程加快&#xff0c;零代码平台的的应用越来越…

Kstry框架一种服务编排的实现

Kstry是什么&#xff1f; 所见&#xff08; 图示模型 &#xff09;即所得&#xff08; 代码执行 &#xff09;的可视化流程编排框架可轻易将流程从串行升级到并行&#xff0c;支持任务拆分、任务重试、任务降级、子任务遍历、指定超时时间的并发框架共享能力平台侧的微服务业务…

java接口服务编排_GOKU API Gateway CE V3.1.0 发布:新增服务编排、配置版本管理等...

Goku API Gateway (中文名&#xff1a;悟空 API 网关)是一个基于 Golang 开发的微服务网关&#xff0c;能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的&#xff0c;拥有强大的自定义插件系统可以自行扩展&#xff0c;并且提供友好的图形化配置界…

云原生服务编排技术

基于云原生的服务编排技术主要实现融合计算、存储和网络能力开放&#xff0c;通过云原生和云计算统一编排调度平台来实现底层资源的调度及上层服务编排。运用 OpenStack底层基础设施层的资源调度管理能力&#xff0c;对数据中心内的异构计算资源、存储资源和网络资源可以进行有…

Docker Compose 服务编排

微服务架构中一般会有多个微服务&#xff0c;每一个微服务一般都会部署多个实例&#xff0c;如果每一个服务都手动启动&#xff0c;工作量会很大。服务编排就是按照一定的业务规则进行批量管理容器。 docker基础请参考 Docker相关内容整理&#xff08;一&#xff09;_活水774的…

9_服务编排

是什么 微服务架构的应用系统中一般包含若干个微服务&#xff0c;每个微服务一般都会部署多个实例&#xff0c;如果每个微服务都要手动启 动停止&#xff0c;维护的工作量会很大。来看下我们日常工作&#xff1a; 要从Dockerfile build image 或者去 dockerhub 拉取 image要创…

Docker服务编排

概述 服务编排概念 微服务架构的应用系统中一般包含若干个微服务&#xff0c;每个微服务都会部署多个实例&#xff0c;如果每个微服务都要手动启停&#xff0c;维护的工作量会很大。 具体工作大概如下&#xff1a; 从Dockerfile build image或者取dockerhub拉取image。创建多…