zoukankan      html  css  js  c++  java
  • nginx*GRPC

    Nginx 1.13.10新增了对GRPC的原生支持。

    安装Nginx

    Nginx版本要求:1.13.10+
    gRPC必须使用HTTP/2传输数据,支持明文和TLS加密数据,支持流数据的交互。这是为了充分利用 HTTP/2 连接的多路复用和流式特性。所以在安装部署nginx时需要安装http/2。使用源码安装,编译时需要加入http_ssl和http_v2模块:

    ./configure --with-http_ssl_module --with-http_v2_module

    Nginx以不加密方式代理不加密GRPC服务

    示例配置:

    http {
        server {
            listen 80 http2;
            # server_name  localhost;
            # access_log  logs/host.access.log  main;
    
            location / {
                grpc_pass grpc://localhost:8200;
            }
        }
    }
    
    

    指令grpc_pass用来指定代理的gRPC服务器地址,前缀协议有两种: grpc://:与gRPC服务器端交互是以明文的方式
    grpcs://:与gRPC服务器端交互式以TLS加密方式

    Nginx以加密方式代理不加密GRPC服务

    示例:

    http {
        server {
            listen 443 ssl http2;
            # server_name  localhost;
            # access_log  logs/host.access.log  main;
    
            ssl_certificate ssl/server.crt;
            ssl_certificate_key ssl/server.key;
    
            # 另一种证书格式
            # ssl_certificate ssl/server.pem;
            # ssl_certificate_key ssl/server.pem;
    
            location / {
                grpc_pass grpc://localhost:8200;
            }
        }
    }
    
    

    Nginx根据路径代理到不同的GRPC服务

    如果后端有多个gRPC服务端,其中每个服务端都是提供不同的gRPC服务。这种情况可以使用一个nginx接收客户端请求,然后根据不同的路径分发路由到指定的gRPC服务器。示例:

    http {
        server {
            listen 80 http2;
            # server_name  localhost;
            # access_log  logs/host.access.log  main;
    
            location /helloworld.Greeter {
                grpc_pass grpc://192.168.1.11:8200;
            }
    
            location /helloworld.Dispatcher {
                grpc_pass grpc://192.168.1.12:8200;
            }
        }
    }
    
    

    Nginx对GRPC做负载均衡

    在后端有多个gRPC服务器,它们都是同一个gRPC服务,这种情况可以结合nginx的upstream可以对gRPC的请求做负载均衡。示例:

    http {
        upstream grpcservers {
            server 192.168.1.11:8200;
            server 192.168.1.12:8200;
        }
        server {
            listen 80 http2;
            # server_name  localhost;
            # access_log  logs/host.access.log  main;
    
            location /helloworld.Greeter {
                grpc_pass grpc://grpcservers;
            }
        }
    }
    
    

    Go GRPC客户端建立连接

    连接明文服务端

    conn, err := grpc.Dial("127.0.0.1", grpc.WithInsecure())
    if err != nil {
        panic(err)
    }
    helloworld := pb.NewHellowordClient(conn)
    
    

    连接tls单向认证的服务端

    // serverNameOverride 填证书的CN值
    tls, err := credentials.NewClientTLSFromFile("./server.crt", "test.com")
    if err != nil {
        panic(err)
    }
    conn, err := grpc.Dial("127.0.0.1", grpc.WithTransportCredentials(tls))
    if err != nil {
        panic(err)
    }
    helloworld := pb.NewHellowordClient(conn)
    
    

    参考

    https://www.jb51.net/article/137330.htm



    作者:M醉逍遥
    链接:https://www.jianshu.com/p/6c5a870e070d
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    找数字(递归,二分查找)
    P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
    第五讲 二维费用的背包问题(粗糙,勿点)
    VIM基础操作方法汇总
    P2347 砝码称重(动态规划递推,背包,洛谷)
    第三讲 多重背包问题(对背包九讲的学习)
    第二讲 完全背包问题(对背包九讲的学习)
    python 日期、时间、字符串相互转换
    Resource注解无法导入依赖使用javax.annotation的注解类
    Spring的配置文件找不到元素 'beans' 的声明
  • 原文地址:https://www.cnblogs.com/ExMan/p/14777142.html
Copyright © 2011-2022 走看看