Nginx 代理gRPC—為 Skywalking 提供負載均衡


Apache Skywalking 是一款優秀的分布式鏈路追蹤系統以及 APM 系統,但在社區的實現中,並沒有着重考慮客戶端負載的問題。因為社區已經有很多對 gRPC 的代理的成熟方案(Skywalking 中 Agent 探針與后端主要通過 gRPC 方式通信)。

因此,如果是虛機或者一般容器(非Kubernetes平台)部署的時候,為了實現 Skywalking OAP 負載均衡,需要自己做一層反向代理。在網上查閱資料之后,發現 Nginx 已經支持 gRPC 代理。在 2018年3月17日,NGINIX官方宣布在nginx 1.13.10中將會支持gRPC,這一宣告表示了NGINX已完成對gRPC的原生支持。眾所周知,gRPC 已經是新一代微服務的事實標准 RPC 框架。對於實現來說,可以用服務框架等手段來做到負載均衡,但業界其實還沒有非常成熟的針對 gRPC 的反向代理軟件。 NGINIX 作為老牌負載均衡軟件對 gRPC 進行了支持,之前已經可以代理 gRPC 的 TCP 連接,新版本之后,還可以終止、檢查和跟蹤 gRPC 的方法調用:

  • 發布 gRPC 服務,然后使用 NGINX 應用 HTTP/2 TLS 加密、速率限制、基於 IP 的訪問控制列表和日志記錄;
  • 通過單個端點發布多個 gRPC 服務,使用 NGINX 檢查並跟蹤每個內部服務的調用;
  • 使用 Round Robin, Least Connections 或其他方法在集群分配調用,對 gRPC 服務集群進行負載均衡;

使用NGINX代理gRPC 服務

在客戶端和服務器應用程序之間插入 NGINX,為服務器應用程序提供了一個穩定可靠的網關。

使用Docker容器搭建NGINX Server

使用 Nginx 官方提供的docker image搭建server:

$ docker pull nginx:1.13.10
1.13.10: Pulling from library/nginx
2a72cbf407d6: Pull complete
fefa2faca81f: Pull complete
080aeede8114: Pull complete
Digest: sha256:c4ee0ecb376636258447e1d8effb56c09c75fe7acf756bf7c13efadf38aa0aca
Status: Downloaded newer image for nginx:1.13.10

Nginx gRPC配置

Nginx 使用 HTTP 服務器監聽 gRPC 流量,並使用 grpc_pass 指令代理流量。 為 Nginx 創建以下代理配置,在端口 80 上偵聽未加密的 gRPC 流量並將請求轉發到端口`31320`上的服務器:

grpc_proxy.conf文件:

upstream grpcservers {
    server 10.15.160.1:31320; # Skywalking OAP 后端 11800 地址
}

server {
    listen 80 http2;
 
    location / {
        grpc_pass grpc://grpcservers;
        error_page 502 = /error502grpc;
    }
 
    location = /error502grpc {
        internal;
        default_type application/grpc;
        add_header grpc-status 14;
        add_header grpc-message "unavailable";
        return 204;
    }
}

啟動 Nginx 容器

docker run --name mynginx4grpc -p 80:80 -v tmp4myworkspace:/etc/nginx/conf.d:ro -d nginx:1.17

其中,上述 Nginx 配置文件位於 tmp4myworkspace 目錄下。

參考

Module ngx_http_grpc_module​nginx.orgService Mesh利器:NGINX+gRPC​osswangxining.github.io


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM