| kong网关转发http服务,各大博主都已经聊包浆了。kong网关核心的控制面实体:kong网关原生支持代理gRPC请求,本文通过一个示例来记录通过kong网关管理gRPC服务,并且使用grpcbin和grpcurl哼哈二将来模拟和验证grpc服务能力。
 
 
 我们首先忽略网关,搭建一个grpc点对点服务调用。
 service : 上游服务的抽象
route  : 客户端请求被分流的规则
upstream (+ target): 支持负载均衡、健康检查
consumer: 用于标识使用API服务的外部客户端, 一般需要结合plugins来识别
 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:
 安装grpcurl,访问grpc服务:复制代码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 -v -d '{"greeting": "Kong!"}' \  -plaintext localhost:9000 hello.HelloService.SayHello      或grpcurl -v -d '{"greeting": "Kong!"}' \      -insecure localhost:9001 hello.HelloService.SayHello
参数解释如下:grpc点对点的结果如下:
 
 plaintext: Use plain-text HTTP/2 when connecting to server (no TLS)
insecure:        Skip server certificate and domain verification. (NOT SECURE!) Notvalid with -plaintext option.
 
 
 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反向代理,以上可换成网关服务地址。
 2. kong gateway脚手架代理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)                }
 grpc是基于http2的高性能rpc框架,本次须确保存在http2代理侦听器。
 kong github给出的docker-kong脚手架开放了8000-8002端口的服务, 但是无http2侦听器。
 
 核心配置由配置proxy-listen或者变量变量KONG_PROXY_LISTEN决定。
 
 http2: 允许客户端打开与Kong网关的HTTP2连接。本次修改成: ${KONG_PROXY_LISTEN:-0.0.0.0:8000 http2,0.0.0.0:8443 ssl http2}ssl: 要求通过该地址/端口进行的所有连接都必须启用TLS。
 
 本例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 结果与点对点一致。
 
 [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
 
 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
 |