从零到一:使用 Flomesh Gateway 轻松打造高效、灵活的网络代理

在微服务的架构世界中,确保稳定、安全且高效的网络通信至关重要。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 网关运行,是直接接收客户端网络请求的组件。
  • 后端服务:真正处理请求的组件。

方案

按照文章开头的目标,我们将会实现如下几个功能,通过链接可以查看功能的配置使用方式。

实施

后端服务

这里的后端服务,可以通过 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'))" &

分别监听在 80818082 端口,返回不同的响应。

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 从控制面同步配置并加载,然后监听 80008080 两个端口,分别是代理端口和静态服务端口。

测试

负载均衡测试

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 这类提供静态资源服务的组件。

相关推荐
我是陈泽4 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
肖哥弹架构1 天前
Spring 全家桶使用教程
java·后端·程序员
IT杨秀才4 天前
自己动手写了一个协程池
后端·程序员·go
程序员麻辣烫6 天前
像AI一样思考
程序员
一颗苹果OMG7 天前
关于进游戏公司实习的第一周
前端·程序员
万少8 天前
你会了吗 HarmonyOS Next 项目级别的注释规范
前端·程序员·harmonyos
楽码8 天前
彻底理解时间?在编程中使用原子钟
后端·算法·程序员
江南一点雨9 天前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员
用户86178277365189 天前
ELK 搭建 & 日志集成
java·后端·程序员
河北小田9 天前
局部变量成员变量、引用类型、this、static
java·后端·程序员