比 Spring Cloud Zuul 更好用的 API 网关

推荐一个 比 spring cloud 更好用的 API 网关。它是一个低代码 API 网关。

https://github.com/fiber-net-gateway/fiber-net-gateway

特性

同样是使用 java 开发,相比与 SpringCloud Zuul,它有很多 鲜明的特点。

低代码

它实现了一个灵活好用的脚本 解释器(interpreter、vm),通过脚本代替配置文件、并且支持动态更新、对于用户来说更加灵活、更加直观。毕竟API 网关的用户都是程序员,看简单的代码比看一堆复杂的 YAML 配置来得更加直观。

低开销、高性能

脚本解释器是以协程的方式运行的,不占用线程资源。底层也是基于 Netty NIO 开发的,除了 EVENT_LOOP 外无其它业务线程,利用了 NETTY 零拷贝技术,性能非常高,开销很低。

轻依赖

整个项目只依赖 netty 和 jackson 两个第三方库,无其它依赖。核心代码也只有 14000 行,在内部实现了 虚拟机、异步带连接池的 http client ,http server,依赖注入、reactive 异步事件等特性,非常利用阅读和学习。

快速使用

  • 编译
git clone https://github.com/fiber-net-gateway/fiber-net-gateway.git
cd fiber-net-gateway
mvn package -DskipTests
cd fiber-gateway-example/target
  • 创建配置(脚本)文件
mkdir conf
cat > conf/fiber-net.gs << EOF
directive fy from http "https://fanyi.baidu.com";
directive bd from http "https://www.baidu.com";
if(req.getMethod() == "POST") {fy.proxyPass({path: "/v2transapi",query: "from=en&to=zh",method: "POST",headers: {"X-Fiber-Project": null}});
} else {let res = bd.request({path: "/", headers: {"User-Agent": "curl/7.88.1"}});resp.setHeader("Content-Type", "text/html");resp.send(res.status, res.body);
}
EOF
  • 运行
java -jar fiber-gateway-example-1.0-SNAPSHOT.jar conf
  • 测试
# 使用 post 请求,反向代理到百度翻译 (反向代理会透传 downstream 内容)
curl 127.0.0.1:16688 -XPOST
# 使用其它请求,返回百度主页。(请求模式,不会透传 downstream)。
curl 127.0.0.1:16688 -XGET

返回内容: 

$ curl 127.0.0.1:16688 -i
HTTP/1.1 200 OK
Content-Type: text/html
date: Mon, 18 Dec 2023 14:58:40 GMT
server: fiber-net(fn)/1.0-SNAPSHOT/549a404dcaee9bc2
content-length: 2443<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrap id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=
hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value m        m
axlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <di
v id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_tr
map class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www
.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://ww
w.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录/a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <ahref=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

每次请求,fiber-net.gs 都会被执行一次。也可以在 conf 目录下放置其它 .gs 文件 通过 request header "X-Fiber-Project" 执行被执行的文件名。(如 ttt.gs)

### conf/ttt.gs 文件会被执行,不指定则执行 fiber-net.gs 
curl 127.0.0.1:16688 -H'X-Fiber-Project: ttt'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《从晨到夜:在日常繁忙中寻找成长与平衡的艺术》

早上8点11分&#xff0c;我睁开眼睛&#xff0c;开始了新的一天。不到半小时&#xff0c;我匆匆出门&#xff0c;开始了日常的“搬砖”工作。从9点15分到公司&#xff0c;到下午6点15分结束工作&#xff0c;我的一天被紧凑的工作安排填满。我在完成技术任务的同时&#xff0c;也…

Redis系列之事务机制

什么是Redis事务 学习mysql数据库的时候&#xff0c;我们知道了事务的ACID特性&#xff0c;Redis也是支持事务的&#xff0c;不过和数据库的事务又有什么区别&#xff1f;在mysql数据库中&#xff0c;我们使用begin开启事务&#xff0c;提交是commit&#xff0c;回滚是rollbac…

在linux上基于shell自动部署Java项目

一&#xff0c;安装git yum list git 列出git安装包 yum install git 在线安装git 使用 git -varsion 查看是否安装成功 安装成功 二&#xff0c; Git克隆代码 git clone 远程仓库地址 三&#xff0c;创建shell脚本 touch shell.sh shell脚本 #!/bin/sh echo echo 自动…

健康手表数据洞察台

健康手表数据洞察台 1. 背景介绍2. 数据获取与处理3. Django平台搭建4. 数据可视化5. 整体数据分析6. 数据监控与紧急警报7. 用户界面优化8. 创新点结语 1. 背景介绍 在当今健康意识不断提升的社会&#xff0c;人们越来越关注身体健康。本文将介绍如何使用Pandas进行数据分析&…

NTC和温度的关系

一、NTC介绍 NTC&#xff08;nagative temperature coefficient&#xff09;负温度系数的热敏电阻。随着温度的升高&#xff0c;电阻越来越小 二、NTC和温度的关系 生产NTC的厂家会提供一个RT表格&#xff0c;里面记录了温度和电阻的关系&#xff0c;他们的关系是一一对应的…

C# 使用FluentHttpClient请求WebApi

写在前面 FluentHttpClient 是一个REST API 异步调用 HTTP 客户端&#xff0c;调用过程非常便捷&#xff0c;采用流式编程&#xff0c;可以将所有请求所需的参数一次性发送&#xff0c;并直接获取序列化后的结果。 老规矩从NuGet上安装该类库&#xff1a; 这边一定要认准是 P…

React系列:配置@别名路径并配置联想

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

读写分离之同步延迟测试

背景 读写分离是快速提高数据库性能的手段&#xff0c;主库只负责写入&#xff0c;从库负责查询。但在性能得到提升的同时&#xff0c;编程的复杂度就会提升。由其碰到主从同步延迟的情况&#xff0c;在数据写入后&#xff0c;在从库无法读取到最新数据&#xff0c;会对业务逻…

汽车火花塞行业分析:全球市场需求量约为26.3亿个

在汽车日常保养里,更换火花塞算是比较常见的一种,爱车懂车的车主们都非常清楚火花塞对于汽车的重要性,可以说火花塞直接影响到发动机的运作,决定了汽车能否顺利启程。 火花塞(sparkplug)&#xff0c;俗称火咀&#xff0c;它的作用是把高压导线(火嘴线)送来的脉冲高压电放电&…

zkSend — — 在Sui上发红包像发电子邮件一样简单

*12月14日&#xff0c;知名区块链媒体平台The Block发表了这篇关于对Mysten Labs联合创始人Adeniyi Abiodun的采访&#xff0c;文中“我们”指代该媒体&#xff0c;数据均为截止撰写文章时数据&#xff0c;以下是正文。 两年前&#xff0c;当五名前Facebook工程师创立Mysten L…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着&#xff0c;这一段程序或代码在MysQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

【GPU监控】Gpu-dcgm-exporter 监控

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

算法:二叉树最大深度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、递归算法 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 给定一个二叉树&#xff0c;求其最大深度 3…

git运用之.gitignore 配置文件的常用写法及案例

前言 .gitignore 文件用于指定 Git 版本控制系统忽略的文件和文件夹。 常见的 .gitignore 配置文件的写法和案例 忽略特定文件&#xff1a; # 忽略所有 .log 文件 *.log # 忽略名为 .DS_Store 的文件 .DS_Store忽略特定文件夹&#xff1a; # 忽略名为 node_modules 的…

【问题思考总结】I/O总线的数据线和控制线的辨析【2012年 408真题 T21】

个人经过查阅资料发现&#xff0c;王道给的图好像挺有误导性的&#xff0c;比如&#xff0c;I/O总线中的地址总线应该是单向传输的&#xff0c;但是&#xff0c;在他的图例里面是双向的。文章若有错误&#xff0c;恳请指正&#xff0c;感激不尽。 问题 在做2012年408真题的时候…

如何提高股票交易速度?极速交易哪家好?

极速交易模式是一种交易方式&#xff0c;它以最短的时间进行快速交易。这种模式通常用于贵金属、外汇、原油、期权等金融产品的交易。 在极速交易模式中&#xff0c;交易者可以在最短时间内进行买卖操作&#xff0c;从而快速获取利润。这种交易方式通常需要高超的技术和经验&a…

【03】GeoScene创建海图或者电子航道图数据

1 配置Nautical属性 1.1 管理长名称 长名称&#xff08;LNAM&#xff09;是一个必要的对象标识符&#xff0c;是生产机构&#xff08;AGEN&#xff09;、要素识别号码&#xff08;FIDN&#xff09;和要素识别子项&#xff08;FIDS&#xff09;组件的串联。这三个子组件用于数…

【Spring】09 BeanClassLoaderAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一就是 Bean 生命周期中的回调接口。本文将聚焦于其中的一个接口 BeanClassLoaderAware&#xff0c;介…

11889个字带你彻底弄清tcp/ip协议栈

tcpip协议栈 tcpip模型以太网协议ARP地址解析协议TCP协议 tcpip模型 OSI模型linux tcpip模型常用协议网络设备应用层应用层telnet/DHCP/TFTP/FTP/MQTT/NFS/DNS/FTP/SNMP表示层会话层传输层传输层TCP/UDP四层交换机网络层网络层IP/ICMP/IGMP/ARP路由器&#xff0c;三层交换机…

【LeetCode】383. 赎金信(String的遍历)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;383. 赎金信 代码随想录题解地址&#xff1a;代码随想录 题目简介 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返…