Ricardo的博客

我本逍遥一散人

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

wei xin tu pian 20230409130416 - Docker 部署 kong 并且实现 grpc 兼容

配置 Konga

首先我们需要开放这些端口:13378000

现在,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拆分并且自动生成多个配置:ProtocolHostPortPath,如下图

wei xin tu pian 20230409131720 - Docker 部署 kong 并且实现 grpc 兼容

也可以不配置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

wei xin jie tu 20230409132325 - Docker 部署 kong 并且实现 grpc 兼容

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

wei xin tu pian 20230409140309 - Docker 部署 kong 并且实现 grpc 兼容

注意:若是用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

gin 框架实现 GRPC 的服务端和客户端

上一篇

基于Kratos实现的一个分布式IM(待完善)

下一篇
评论
发表评论 说点什么
还没有评论
175
0