头图

在微服务的架构世界中,确保稳定、安全且高效的网络通信至关重要。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 来模拟:

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 端口,返回不同的响应。

curl http://localhost:8081
You are requesting localhost:8081/
curl http://localhost:8082
Hello, there

这里还要提供一个静态文件 index.html,保存到 /tmp 目录中。

cat > /tmp/index.html <<EOF
<!DOCTYPE html>  
<html>  
<body>  
<h1>hello</h1>  
<p>www1</p>  
</body>  
</html>
EOF

控制面

使用 Docker 运行 FGW 控制面:

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

{
  "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。

执行下面的命令,启动数据面并从控制面获取配置。

pipy http://localhost:6060/repo/local/fgw/

启动后通过日志可以看到 Pipy 从控制面同步配置并加载,然后监听 80008080 两个端口,分别是代理端口和静态服务端口。

测试

负载均衡测试

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 信息。

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。可以看到,每次都能获取到同样的结果。

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 页面。复杂的站点可以参考 https://flomesh.io,Flomesh 官网就是通过 Flomesh Gateway 搭建的。

curl http://localhost:8080
<!DOCTYPE html>
<html>
<body>
<h1>hello</h1>
<p>www1</p>
</body>
</html>

健康检查测试

停掉监听在 8082 端口的进程,多次请求都会返回 8081 服务的响应。

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/

同时,在数据面的日志中可以看到健康检查失败的记录。

...
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 端口的进程,再次请求会重新将请求代理到新上线的服务实例。

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


Flomesh
1 声望0 粉丝