当前位置: 首页 > news >正文

grpc 哼哈二将,你值得拥有

kong网关转发http服务,各大博主都已经聊包浆了。
kong网关原生支持代理gRPC请求,本文通过一个示例来记录通过kong网关管理gRPC服务,并且使用grpcbin和grpcurl哼哈二将来模拟和验证grpc服务能力。

kong网关核心的控制面实体:

  • service : 上游服务的抽象
  • route : 客户端请求被分流的规则
  • upstream (+ target): 支持负载均衡、健康检查
  • consumer: 用于标识使用API服务的外部客户端, 一般需要结合plugins来识别

我们首先忽略网关,搭建一个grpc点对点服务调用。

1. grpc点对点

grpc 是基于http2的高性能rpc框架,根据http2是否启用TLS演化出grpc和grpcs

docker run -it -d --rm -p 9000:9000 -p 9001:9001 moul/grpcbin
启动了grpc服务,占用端口9000和9001:

2025/10/21 06:21:09 listening on :9000 (insecure gRPC)
2025/10/21 06:21:09 listening on :9001 (secure gRPC + secure HTTP/2)

安装grpcurl,访问grpc服务:

grpcurl -v -d '{"greeting": "Kong!"}' \-plaintext localhost:9000 hello.HelloService.SayHello    或grpcurl -v -d '{"greeting": "Kong!"}' \-insecure localhost:9001 hello.HelloService.SayHello

参数解释如下:

  • plaintext: Use plain-text HTTP/2 when connecting to server (no TLS)
  • insecure: Skip server certificate and domain verification. (NOT SECURE!) Not
    valid with -plaintext option.

grpc点对点的结果如下:

1.1 grpc over http2

客户端创建grpc通道,内部会创建到服务器的HTTP/2连接,通道创建完后,就可以重用连接来发送多个到服务端的远程调用(多路复用),这些远程调用会映射为HTTP/2中的流, 远程调用中的消息以HTTP/2帧的形式进行发送,帧可能会携带一条gRPC 长度前缀的消息,也可能在 gRPC消息非常大的情况下,一条消息跨多帧。

简单的grpc一元调用形成的HTTP2帧序列:

1.2 gRPC 服务反射协议

你还可以使用

  • grpcurl -plaintext localhost:9000 list 查看所有grpc服务
  • grpcurl -plaintext localhost:9000 describe hello.HelloService.SayHello 查看某一个grpc服务接口
  • grpcurl -plaintext localhost:9000 describe .hello.HelloRequest 查看类型信息

这依托于gRPC服务反射协议:注册了一个服务(列出服务器上注册的grpc服务和方法)。btw既然网关做grpc反向代理,以上可换成网关服务地址。

listener, err := net.Listen("tcp", *insecureAddr)if err != nil {log.Fatalf("failted to listen: %v", err)}// create gRPC servers := grpc.NewServer()grpcbinpb.RegisterGRPCBinServer(s, &grpcbinhandler.Handler{})hellopb.RegisterHelloServiceServer(s, &hellohandler.Handler{})addsvcpb.RegisterAddServer(s, &addsvchandler.Handler{})abepb.RegisterABitOfEverythingServiceServer(s, abehandler.NewHandler())// register reflection service on gRPC serverreflection.Register(s)// servelog.Printf("listening on %s (insecure gRPC)\n", *insecureAddr)if err := s.Serve(listener); err != nil {log.Fatalf("failed to serve: %v", err)}

2. kong gateway脚手架代理grpc请求

grpc是基于http2的高性能rpc框架,本次须确保存在http2代理侦听器

kong github给出的docker-kong脚手架开放了8000-8002端口的服务, 但是无http2侦听器。

核心配置由配置proxy-listen或者变量变量KONG_PROXY_LISTEN决定。

http2: 允许客户端打开与Kong网关的HTTP2连接。
ssl: 要求通过该地址/端口进行的所有连接都必须启用TLS。

本次修改成: ${KONG_PROXY_LISTEN:-0.0.0.0:8000 http2,0.0.0.0:8443 ssl http2}

本例kong作为grpc代理服务器,可通过kong-manager或者admin-api建立grpc service 和grpc route。

需要注意:

本例的grpc服务是宿主机上9000端口的服务,本次网关容器内不可使用localhost表征宿主机,mac容器内宿主机标识是host.docker.internal

最后grpc走kong网关的验证脚本:

grpcurl -v -d '{"greeting": "Kong!"}'
-H 'kong-debug: 1' -plaintext
localhost:8000 hello.HelloService.SayHello 结果与点对点一致。

http://www.hskmm.com/?act=detail&tid=36153

相关文章:

  • 解释这些 Solidity 智能合约的核心概念
  • C++编程练习
  • 数据结构练习
  • newDay14
  • L07_在RuoYI项目中添加自己的接口并实现CRUD功能(轻松+AI版)
  • 10
  • 大二to大三暑假大三上前半学期总结
  • 2025.10.18 刷题
  • 低代码如何推动企业敏捷创新与业务赋能
  • hevc解码器下载
  • 低代码如何成为企业数字化转型的加速器
  • 10.18测试
  • 删除链表的倒数第N个结点-leetcode
  • NOI 八
  • Day1标签的关系与vs的注释
  • 软件工程学习日志2025.10.21
  • [PaperReading] DeepSeek-OCR: Contexts Optical Compression
  • Win10安装WindowsCamera相机
  • 简易的本地部署OI-Wiki方法 for CCSP
  • Say 题选记 (10.19 - 10.25)
  • 宝塔面板
  • React Native 启动流程 (Android版)
  • 以TrustedInstaller/System用户运行软件
  • 10月21号
  • 机器学习基础 -- 线性回归模型
  • 泰勒展开
  • MySQL 创建和授权用户
  • 因果机器学习算法新进展解析
  • 软件工程作业三
  • CF2127 Atto Round 1 (Codeforces Round 1041, Div. 1 + Div. 2) 游记(VP)