Docker 部署 kong 并且实现 grpc 兼容
概念
最近在了解微服务的概念,于是不可避免的要说到API统一网关,在文章开头我先简单介绍一下这两个东西
统一网关API和微服务是现代软件架构中两个重要的概念。它们在构建可扩展、灵活和易于维护的应用程序方面发挥着关键作用。
API统一网关(API Gateway):
API统一网关是一个服务器,充当了微服务架构中的入口点。它负责处理客户端的请求并将其转发到适当的微服务。API统一网关的主要功能包括:
- 请求路由:将客户端请求分发到相应的微服务。
- 身份验证和授权:验证客户端的身份并对其权限进行管理。
- 负载均衡:分发请求负载以确保微服务的性能稳定。
- 请求/响应转换:在客户端和微服务之间转换数据格式。
- 限流和配额:防止微服务因过载而崩溃,实施配额以确保公平使用。
- 日志记录和监控:收集关于请求和响应的日志以进行审计和性能监控。
微服务(Microservices):
微服务是一种软件架构模式,它将一个大型应用程序拆分为多个小型、独立的服务。这些服务通常围绕业务功能来组织,它们独立部署、独立扩展,并通过轻量级协议(如HTTP/REST、gRPC等)进行通信。微服务架构的主要优点包括:
- 可扩展性:可以根据需要独立扩展各个服务,提高整体性能。
- 灵活性:独立部署和升级服务,降低变更风险。
- 易于维护:将复杂应用程序拆分为更易于理解和维护的组件。
- 技术多样性:可以根据需要为每个服务选择合适的技术栈。
- 快速迭代:团队可以快速开发和部署新功能,提高生产力。
总之,API统一网关和微服务共同构成了现代软件开发的基础架构。它们共同支持更高的可扩展性、灵活性和可维护性,从而使企业能够更快地响应市场变化和客户需求。
接下来,本文以kong为例,部署一个API统一网关并且配置http以及grpc服务,实现一个简单的微服务架构
安装kong 以及 konga(kong的可视化界面)
配置docker-compose.yml
在 /opt/program/kong 创建一个 docker-compose.yml
文件,并且包含以下内容
version: "3.8"
services:
kong-database:
image: postgres:12
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
kong-migrations:
image: kong:latest
command: "kong migrations bootstrap"
depends_on:
- kong-database
environment:
KONG_DATABASE: postgres
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong
KONG_PG_DATABASE: kong
KONG_PG_HOST: kong-database
kong:
image: kong:latest
depends_on:
- kong-migrations
environment:
KONG_DATABASE: postgres
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong
KONG_PG_DATABASE: kong
KONG_PG_HOST: kong-database
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
KONG_PLUGINS: bundled,grpc-gateway
ports:
- 8000:8000
- 8443:8443
- 8001:8001
- 8444:8444
konga-database:
image: postgres:12
environment:
POSTGRES_USER: konga
POSTGRES_DB: konga
POSTGRES_PASSWORD: konga
konga:
image: pantsel/konga:latest
environment:
KONGA_CONFIG_DATABASE: postgres
KONGA_CONFIG_PG_USER: konga
KONGA_CONFIG_PG_PASSWORD: konga
KONGA_CONFIG_PG_DATABASE: konga
KONGA_CONFIG_PG_HOST: konga-database
depends_on:
- konga-database
ports:
- 1337:1337
在这个文件中,我们定义了 5 个服务:kong-database、kong-migrations、kong、konga 和 konga-database,并且为kong额外添加了grpc-gateway插件以支持grpc请求。注意,我们使用了 PostgreSQL 作为 Kong 和 Konga 的数据库。
启动docker容器
运行以下命令启动所有容器:
docker-compose up -d
这将启动 Kong 和 Konga,以及它们所依赖的数据库服务。等待一段时间,让容器启动并初始化。你可以通过运行以下命令查看容器的状态:
docker-compose ps
确保所有容器的状态为running
配置 Konga
首先我们需要开放这些端口:1337
、8000
现在,Konga 应该已经在端口 1337 上运行。通过浏览器访问 http://server_ip:1337
,你将看到 Konga 的登录页面。
首次访问时,你需要创建一个管理员账户。输入你的电子邮件地址和密码,然后点击 "Register"。登录后,你需要添加一个新的连接,以便 Konga 能够与 Kong API 网关通信。点击 "Connect to Kong",在 "Create new connection" 表单中输入以下信息:
- Name: 任意名称,如 "Kong"
- Kong Admin URL:
http://kong_server_ip:8001
- Kong API Key: 保持为空(除非你已经为 Kong 管理 API 配置了 API 密钥)
点击 "Create" 以创建连接。
至此kong就搭建完成了,接下来我们创建一个简单的http服务
HTTP服务转发配置
假设我有一个https服务:https://server_url/api/common/age-options
添加新服务
- 点击左侧菜单的 "Services",然后点击 "Add New Service"。
- 输入以下信息:
- Name: 任意名称,例如 "https-service"。
- URL: 输入一个有效的 HTTPS URL,例如 https://server_url/api。
- 点击 "Create" 以创建服务。
直接配置url,kong会将输入的url拆分并且自动生成多个配置:Protocol、Host、Port、Path,如下图
也可以不配置url自定义各项参数
为新服务添加一个路由:
- 在 "https-service" 页面,点击 "Routes" 选项卡,然后点击 "Add New Route"。
- 输入以下信息:
- Name: 任意名称,例如 "https-route"。
- Methods:输入支持的请求方式然后回车,例如GET,注意,这里请求方式必须全部大写
- Paths: 输入一个路径然后回车,例如
/v1/common/age-options
。 - Strip Path:将该选项设置为false
- 点击 "Create" 以创建路由。
注意:"strip_path" 是路由配置的一个选项。当 strip_path 设置为 true
时,Kong 在将请求转发给上游服务之前会删除与路由匹配的路径部分。这对于在请求上游服务时需要修改路径的场景非常有用。
现在,你可以通过 HTTP 访问刚才新添加的服务。使用 curl 或浏览器访问 http://server_ip:8000/v1/common/age-options
GRPC服务配置
在后一篇文章里会介绍如何创建一个简单的grpc服务,这里就不多赘述,直接来配置服务
Gin 实现简单的 GRPC 服务
创建一个新的服务
转到 "Services" 选项卡,点击 "Add New Service"。填写表单,为 gRPC 服务端指定一个名称,例如 "grpc_calculator"。将 "protocol" 设置为 "grpc",并填写 "host" 和 "port"。例如,如果你的 gRPC 服务端运行在本地 50051 端口,那么将 "host" 设置为 "localhost","port" 设置为 "50051"。然后点击 "Create"。
为新服务创建grpc支持插件
为 gRPC 服务添加 grpc-gateway 插件。转到 "Plugins" 选项卡,点击 "Add New Plugin"。在插件列表中选择 "grpc-gateway" 插件。然后配置插件,consumer留空,。将 "proto" 设置为你的 .proto
文件路径。点击 "Create"。
注意:若是用Docker创建的kong,需要把项目目录导入到容器内
配置路由
转到 "Routes" 选项卡,点击 "Add New Route"。为路由指定一个名称,例如 "calculate_route"。将 "paths" 设置为 /calculate
。选择刚刚创建的 "grpc_calculator" 服务,然后点击 "Create"。重复此步骤以添加第二个路由 "compare_route",将 "paths" 设置为 /compare
。
注意:此处需要将 Strip Path
设置为false ,如果 strip_path
设置为 true,Kong 会删除与路由匹配的请求路径部分。这可能导致 gRPC-gateway 插件无法识别目标 gRPC 方法,从而导致请求失败。
现在,Kong 应已成功配置为代理请求到 gRPC 服务端。你可以通过 Kong 的 HTTP 端口(默认为 8000)访问 grpc-gateway,例如:
http://localhost:8000/calculate
http://localhost:8000/compare