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

推荐订阅源

博客园_首页
I
InfoQ
The Register - Security
The Register - Security
L
LangChain Blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
S
Schneier on Security
博客园 - 【当耐特】
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
雷峰网
雷峰网
N
Netflix TechBlog - Medium
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - 聂微东
PCI Perspectives
PCI Perspectives
Last Week in AI
Last Week in AI
A
Arctic Wolf
宝玉的分享
宝玉的分享
T
The Blog of Author Tim Ferriss
S
Secure Thoughts
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
SecWiki News
SecWiki News
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AI
AI
Engineering at Meta
Engineering at Meta

博客园 - 码甲哥不卷

WorkBuddy已经成国民应用了,我们day0支持了腾讯混元3大模型 1分钟买不了吃亏系列: nginx动态域名解析 3min手搓一个帮助文档,很合理吧! 哈哈哈哈哈打不过我吧,没有办法我(vllm)就是这么强大! 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