在微服务的架构世界中,确保稳定、安全且高效的网络通信至关重要。Flomesh Gateway (FGW) 不仅可以作为一款强大的 API 网关,更是一款提供了丰富网络通信功能的工具,能够轻松实现反向代理、负载均衡、会话保持、静态 Web 服务等功能。
本文将探讨如何利用 FGW 快速搭建起这些功能。
FGW 的文档正在不断完善中,如有任何问题,感谢反馈。
背景介绍
Flomesh Gateway(简称 FGW)是一个开源的、基于 Pipy 开发的全功能 API 网关和代理产品,旨在提供在微服务架构和其他网络应用中强大的流量管理功能。与其他知名的网关和代理解决方案(例如 Netflix Zuul、Spring Cloud Gateway、Nginx,以及 Kong)相比,FGW 提供了一系列的基础和高级功能,为现代的网络通信提供了丰富的支持。
FGW 的设计还参考了 Kubernetes Gateway API,这意味着它可以很好地融入到 Kubernetes 生态系统中,并且可以方便地和其他云原生技术集成。
FGW 简要概览
- 开源与社区支持 :从 GitHub仓库 获取源码和社区支持。
- 丰富的功能:从基础的负载均衡、路由到高级的流量镜像、认证授权等。
- 拓展性 :通过插件和 PipyJS 脚本 实现功能的定制和拓展。
- 生态兼容性:参考 Kubernetes Gateway API 设计。
架构
组件
- 控制面 FGW:作为 FGW 存储和下发配置的组件(通过 Pipy Repo 实现),提供了 简单的图形界面 进行开发调试,同时还提供了 REST API 用于与其他系统集成,进行配置的管理。
- 数据面 Pipy:加载配置和接收请求的组件,会持续从控制面同步配置更新,并进行热加载。作为代理/API 网关运行,是直接接收客户端网络请求的组件。
- 后端服务:真正处理请求的组件。
方案
按照文章开头的目标,我们将会实现如下几个功能,通过链接可以查看功能的配置使用方式。
- 静态 web 服务 fgw-docs.flomesh.io/features/st...
- 代理和负载均衡 fgw-docs.flomesh.io/features/ht...
- keepalive: fgw-docs.flomesh.io/features/gl... 中的
SocketTimeout
- 会话保持 fgw-docs.flomesh.io/features/po...
- 健康检查 fgw-docs.flomesh.io/features/po...
实施
后端服务
这里的后端服务,可以通过 Pipy 来模拟:
bash
pipy -e "pipy().listen(8081).serveHTTP(msg => new Message('You are requesting ' + msg.head.headers.host + msg.head.path))" &
pipy -e "pipy().listen(8082).serveHTTP(new Message({status: 200},'Hello, there'))" &
分别监听在 8081
和 8082
端口,返回不同的响应。
bash
curl http://localhost:8081
You are requesting localhost:8081/
curl http://localhost:8082
Hello, there
这里还要提供一个静态文件 index.html
,保存到 /tmp
目录中。
bash
cat > /tmp/index.html <<EOF
<!DOCTYPE html>
<html>
<body>
<h1>hello</h1>
<p>www1</p>
</body>
</html>
EOF
控制面
使用 Docker 运行 FGW 控制面:
bash
docker run --rm -d --name fgw -p 6060:6060 flomesh/fgw:latest
在浏览器中打开 http://localhost:6060
,在右侧的 Codebases 列表中找到 /local/fgw,并点击打开。
然后在左侧的文件列表中,找到 config.json 然后复制下面的内容替换原内容。接着点击顶部工具栏的如下两个按钮,完成保存和发布(详细的使用方式可参考 文档)。
复制浏览器中的地址 http://localhost:6060/repo/local/fgw/
后面会用到。
注意,不要漏掉末尾的 /。
config.json
:
json
{
"Configs": {
"SocketTimeout": 30
},
"Listeners": [
{
"Protocol": "HTTP",
"Port": 8000
},
{
"Protocol": "HTTP",
"Port": 8080
}
],
"RouteRules": {
"8000": {
"*": {
"RouteType": "HTTP",
"Matches": [
{
"Path": {
"Type": "Prefix",
"Path": "/"
},
"BackendService": {
"backendService1": {
"Weight": 100
}
}
}
]
}
},
"8080": {
"*": {
"RouteType": "HTTP",
"Matches": [
{
"ServerRoot": "/tmp",
"Index": [
"index.html",
"index.htm"
]
}
]
}
}
},
"Services": {
"backendService1": {
"Endpoints": {
"127.0.0.1:8081": {
"Weight": 100
},
"127.0.0.1:8082": {
"Weight": 100
}
},
"HealthCheck": {
"Interval": 2,
"MaxFails": 2,
"FailTimeout": 30,
"Uri": "/",
"Matches": [
{
"Type": "status",
"Value": [
200,
201
]
}
]
},
"StickyCookieName": "_srv_id",
"StickyCookieExpires": 3600
}
},
"Chains": {
"HTTPRoute": [
"common/consumer.js",
"http/codec.js",
"http/route.js",
"http/service.js",
"http/forward.js",
"http/default.js"
]
}
}
数据面
参考 文档,下载安装 Pipy。
执行下面的命令,启动数据面并从控制面获取配置。
bash
pipy http://localhost:6060/repo/local/fgw/
启动后通过日志可以看到 Pipy 从控制面同步配置并加载,然后监听 8000
和 8080
两个端口,分别是代理端口和静态服务端口。
测试
负载均衡测试
bash
curl http://localhost:8000/
Hello, there
curl http://localhost:8000/
You are requesting localhost:8000/
curl http://localhost:8000/
Hello, there
curl http://localhost:8000/
You are requesting localhost:8000/
会话保持测试
在请求时添加 -i
选项打印 cookie 信息。
bash
curl -i http://localhost:8000
HTTP/1.1 200 OK
set-cookie: _srv_id=3021372512864600; path=/; expires=Tue, 10 Oct 2023 08:21:43 GMT; max-age=3600
content-length: 34
connection: keep-alive
Hello, there
再次访问,但这次带上前面返回的 cookie。可以看到,每次都能获取到同样的结果。
bash
curl -b "_srv_id=3021372512864600" localhost:8000
Hello, there
curl -b "_srv_id=3021372512864600" localhost:8000
Hello, there
curl -b "_srv_id=3021372512864600" localhost:8000
Hello, there
静态服务测试
静态 Web 服务功能可以直接为客户端提供静态资源,如 HTML、CSS、JavaScript 文件、图像等,而无需转发请求到后端应用服务器。
这里为了保证演示的简单,我们只写入了一个 HTML 页面。复杂的站点可以参考 flomesh.io,Flomesh 官网就是通过 Flomesh Gateway 搭建的。
bash
curl http://localhost:8080
<!DOCTYPE html>
<html>
<body>
<h1>hello</h1>
<p>www1</p>
</body>
</html>
健康检查测试
停掉监听在 8082
端口的进程,多次请求都会返回 8081
服务的响应。
bash
curl http://localhost:8000/
You are requesting localhost:8000/
curl http://localhost:8000/
You are requesting localhost:8000/
curl http://localhost:8000/
You are requesting localhost:8000/
同时,在数据面的日志中可以看到健康检查失败的记录。
ini
...
2023-10-10 15:17:34.053 [ERR] [outbound 0x1130a8410] [0.0.0.0]:0 -> [127.0.0.1]:8082 (127.0.0.1) cannot connect: Connection refused
2023-10-10 15:17:36.054 [ERR] [outbound 0x1130a8410] [0.0.0.0]:0 -> [127.0.0.1]:8082 (127.0.0.1) cannot connect: Connection refused
2023-10-10 15:17:38.055 [ERR] [outbound 0x103ab1610] [0.0.0.0]:0 -> [127.0.0.1]:8082 (127.0.0.1) cannot connect: Connection refused
...
重新启动监听 8082
端口的进程,再次请求会重新将请求代理到新上线的服务实例。
bash
curl http://localhost:8000/
You are requesting localhost:8000/
curl http://localhost:8000/
Hello, there
结论
上面我们通过简单的配置,借助了 Flomesh Gateway 实现了代理常见的几项功能,更多功能可以移步 FGW 文档,后续我们也会有更多的场景分享出来。
Flomesh Gateway 通过内置的大量插件,解决了 Pipy 上手难度高的难题。 通过 Flomesh Gateway 提供的众多开箱即用的功能,可以快速便捷地搭建自己的反向代理、API 网关、微服务网关,甚至是静态站、CDN 这类提供静态资源服务的组件。