惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 码甲哥不卷

GLM模型这么火,咱们用vllm也咧一个呗! - 码甲哥不卷 同样都是九年义务教育,他知道的AI算力科普好像比我多耶 higress 这个中登才是AI时代的心头好 MetalLB才是给Ingress这个老登做负重前行的那个男人 超性感的轻量级openclaw平替,我给nanobot打call 我不允许谁还不清楚function call在AI-Agent领域中打手的地位 还有比ollama更傻瓜式的大模型本地部署方式吗 ? 🔎我不允许谁还分不清这三种watch机制的区别 云原生AI算力平台的架构解读 🚀糟糕,我实现的k8s informer好像是依托答辩 🎉在k8s调度的花园里面挖呀挖 - 码甲哥不卷 🎉卷不过AI算法, AI工程化或许是一个出路 - 码甲哥不卷 我是新来的,我需要知道这些吗?网关上的限流器 新来的外包,在大群分享了它的限流算法的实现 新来的外包,限流算法用的这么6 面试总被追问k8s调度器工作原理, 收藏 == 学废 幂等的双倍快乐,你值得拥有 JWT 这点小秘密,你们肯定知道! Go动态感知资源变更的技术实践,你指定用过!
kong网关反向代理grpc请求
码甲哥不卷 · 2025-10-21 · via 博客园 - 码甲哥不卷

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.

grpcurl -v -d '{"greeting":"kong!"}'
-plaintext localhost:9000 hello.HelloService.SayHello, grpc点对点的结果如下:
image

1.1 grpcurl 工作原理

grpc 是基于http2的高性能rpc框架(protobuffer是打解包协议),框架屏蔽了底层打解包和通信细节, 使调用者像调用本地函数一样远程调用。

grpcurl 将对人类友好的json格式参数转换成pb协议并传输, grpcurl必须了解服务的protobuffer协议(服务的schema)

  • 使用grpc的服务反射协议: 注册了一个服务(列出服务器上注册的grpc服务和方法), 各大语言都提供这一能力
  • protobuffer.proto 源文件
  • protoSets proto文件编译后产生的stub文件

本次grpcbin示例服务已经实现了服务反射协议, 产生的grpc.reflection.v1alpha.ServerReflectiongrpc服务 提供了暴露grpc服务元信息的能力。

listener, err := net.Listen("tcp", *insecureAddr)
		if err != nil {
			log.Fatalf("failted to listen: %v", err)
		}

		// create gRPC server
		s := 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 server
		reflection.Register(s)

		// serve
		log.Printf("listening on %s (insecure gRPC)\n", *insecureAddr)
		if err := s.Serve(listener); err != nil {
			log.Fatalf("failed to serve: %v", err)
		}

我们使用grpcurl -plaintext localhost:9000 list 就能看到 目标服务上注册的所有grpc服务,进一步的使用describe 参数可进一步探究函数和类型信息。

image

实际上, 本次grpcurl在发出实际grpc请求时,会重度使用到grpc服务反射协议, 我们稍后通过kong网关来观测。

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

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

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

image

核心配置由配置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。

  • 建立服务:
    image

  • 建立网关路由
    上面列出的grpc服务方法: hello.HelloService.SayHello, 网关要求Path上以/或者~开头,本次我们先设置成根目录/:抓取所有的grpc请求。

grpc请求走kong网关反向代理的结果:
image

上图清楚的显示: grpcurl发出的grpc请求,会产生3个grpc调用, 前后两次目测是通过反射信息 组包和解包,
核心的hello.HelloService.SayHellogrpc调用, 在网关上被解析成/hello.HelloService/SayHello, 也就是/包名.服务名/接口名。

grpc 使用的http2协议,设置为POST请求方法, grpc具体产生的http协议, 请参考:https://grpc.github.io/grpc/core/md_doc__p_r_o_t_o_c_o_l-_h_t_t_p2.html

基于这个原理,可以在网关代理grpc请求的时候,设置更精细的路由path:
image

[1] grpcurl: https://www.cnblogs.com/binHome/p/13068129.html

[2] grpc over http2: https://grpc.github.io/grpc/core/md_doc__p_r_o_t_o_c_o_l-_h_t_t_p2.html

[3] docker-kong脚手架: https://github.com/Kong/docker-kong

[4] proxy-listen: https://developer.konghq.com/gateway/configuration/#proxy-listen