1,关于grpc

GRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc,grpc-java,grpc-go. 其中 C 版本支持 C,C++,Node.js,Python,Ruby,Objective-C,PHP 和 C# 支持。
官方网站是:
http://www.grpc.io/
其中java的版本使用netty作为服务器。
关于http2
http2是一个二进制协议。而且是一个长连接。比http1 要快很多。

2,java demo 服务端和客户端

代码已经放到github上面了。就几个文件。这里就不黏贴代码了。
https://github.com/freewebsys/grpc-java-demo
首先要定义一个idl文件,在src/main/proto目录下面。

Syntax = "proto3";
//定义包,类名称
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// 定义一个grpc接口
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求对象,name
message HelloRequest {
  string name = 1;
}

// 返回对象
message HelloReply {
  string message = 1;
}

3,配置pom.xml 文件

定义一个pom的xml文件,点击install 会将proto文件转换成java类。

<extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.2.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

自动进行proto编译,转换成几个java文件。
这个java文件虽然在target下面,但是可以引用到src类里面的。
不用拷贝文件到src里面,可以直接编译通过。

打包:

<!-- 打包成一个jar 文件。-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>io.grpc.examples.helloworld.HelloWorldServer</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

在java中,有插件可以将所有的jarlib包,都打包成一个jar文件。定义main函数。
就可以直接使用了。方便服务部署。 io.grpc.examples.helloworld.HelloWorldServer
直接启动就可以了。

4,启动server

启动server。

public static void main(String[] args) throws IOException,InterruptedException {
    final HelloWorldServer server = new HelloWorldServer();
    server.start();
    server.blockUntilShutdown();
  }

使用client进行测试:

HelloWorldClient client = new HelloWorldClient("localhost",50051);
    try {
      /* Access a service running on the local machine on port 50051 */
      String user = "world";
      if (args.length > 0) {
        user = args[0]; /* Use the arg as the name to greet if provided */
      }
      for (int i = 0; i < 100; i ++) {
        client.greet(user);
      }
    } finally {
      client.shutdown();
    }

5,不能使用Nginx进行grpc代理

虽然Nginx已经支持了http2,但是不能适应Nginx进行负载均衡。
这个地方很奇怪。
proxy_pass 主要是在进行代理的时候,前端是 http2,但是到 upstream 之后就变成了http1.1 这个地方有个强制版本。
proxy_http_version 1.1;
进行http代理的最高版本就是 1.1 不支持http2 的代理。
https://trac.nginx.org/nginx/ticket/923
上面已经说的很清楚了。grpc想使用Nginx做代理。
但是人家不支持,并且也没有计划开发。
【No,there are no plans.】
http://mailman.nginx.org/pipermail/nginx/2015-December/049445.html

直接报错:

WARNING: RPC Failed: Status{code=UNKNowN,description=HTTP status code 0
invalid content-type: null
headers: Metadata(:status=000,server=openresty/1.11.2.2,date=Tue,28 Feb 2017 02:06:26 GMT)
DATA-----------------------------
����HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f68656c6c6f776f726c642e47726565746572,cause=null}
Feb 28,2017 10:06:27 AM io.grpc.internal.ManagedChannelImpl maybeTerminateChannel
INFO: [io.grpc.internal.ManagedChannelImpl-1] Terminated

这个报错一样的。
https://github.com/grpc/grpc-java/issues/2559

6,使用haproxy代理 grpc

首先要下载一个最新的haproxy。
然后配置下:vi /etc/haproxy/haproxy.cfg

global
        maxconn         20000
        log             127.0.0.1 local0

frontend test-proxy
        bind            :5000
        mode           tcp 
        log             global
        option          httplog
        option          dontlognull
        option          nolinger
        maxconn         8000
        timeout client  30s
        default_backend test-proxy-srv


backend test-proxy-srv
        mode           tcp 
        server  app1 127.0.0.1:50051 check
        server  app1 127.0.0.1:50052 check

已经在本机跑了两个java的服务端,一个端口50051,一个50052。

nohup java -jar grpc-java-demo-1.0-50051.jar > nohup-1.log 2>&1 &
nohup java -jar grpc-java-demo-1.0-50052.jar > nohup-2.log 2>&1 &

客户端调用服务修改成端口 5000。即可以调用成功。
在第一次创建 http2链接的时候,会保持一个链接,以后就都是这个服务访问。
除非服务重启,或者客户端新重新连接。

7,总结

本文的原文连接是: http://www.jb51.cc/article/p-edsixtel-bew.html 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

总结下,grpc还是值得学习的。

10.0.2.2 - - [27/Feb/2017:21:06:26 -0500] "POST /helloworld.Greeter/SayHello HTTP/2.0" 009 230 "-" "grpc-java-netty/1.1.2" "-"

grpc访问的日志可以看到服务的url,方法。 在做业务逻辑处理,比较容易接受。搭建服务也非常的快速呢。 继续研究grpc。

grpc1:Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持的更多相关文章

  1. android – Firestore:库中的包引用无效

    解决方法您可以通过在lint.xml文件中设置以下内容来删除此错误:lint.xml应位于应用程序模块的根目录下.将错误降级为警告的优点是,如果您以后碰巧添加了一个真正包含无效包的依赖项,您仍然会收到错误.

  2. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. Vue项目打包并部署nginx服务器的详细步骤

    vue项目开发好之后需要部署到服务器上进行外网访问,下面这篇文章主要给大家介绍了关于Vue项目打包并部署nginx服务器的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

  4. ubuntu中利用nginx部署vue项目的完整步骤

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行,下面这篇文章主要给大家介绍了关于ubuntu中利用nginx部署vue项目的相关资料,需要的朋友可以参考下

  5. centos+php+coreseek+sphinx+mysql之一coreseek安装篇

    这篇文章主要介绍了centos+php+coreseek+sphinx+mysql之一coreseek安装篇的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

  6. Centos7 中 Node.js安装简单方法

    这篇文章主要介绍了Centos7 中 Node.js安装简单方法,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下

  7. 使用Node.js配合Nginx实现高负载网络

    这篇文章主要介绍了使用Node.js配合Nginx实现高负载网络,Node的异步加上Nginx的反向代理在性能上实在是给力!需要的朋友可以参考下

  8. Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    这篇文章主要介绍了Spring Cloud Alibaba:Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问,负载均衡访问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. SpringCloud 客户端Ribbon负载均衡的实现方法

    Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负载均衡工具,且已集成在 Eureka 依赖中,这篇文章主要介绍了SpringCloud 客户端Ribbon负载均衡的实现方法,需要的朋友可以参考下

  10. Ribbon负载均衡算法原理与使用介绍

    在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题

随机推荐

  1. 如何在客户端使用Java读取gRPC中的元数据

    所有我需要阅读第一条有订阅ID的消息,并将相同的订阅ID返回给服务器以便流可以启动我使用相同的原型文件使用相同的Python代码,它通过下面的代码提供与服务器通信仅供参考:从上面的python代码我可以轻松检索元数据对象,不知道如何使用Java检索它?

  2. Windows上的gRPC C.

    我已经尝试了3天,现在找到如何在没有运气的情况下在Windows上安装和使用gRPC.我使用的是VisualStudio2015,Win764位.为了安全起见,我会一步一步地写下我正在做的事情.它可能没有必要,但我是C和VS的初学者,所以我不确定我是否正确地做到了:(按照指南http://www.infopulse.com/blog/grpc-framework-by-google-tutoria

  3. grpc2:Centos 安装 nghttp2 做 grpc 的http2 代理

    1,nghttp2和Nginx名字比较像,但是是一个c的llib库。而haproxy是支持tcp做代理的。2,下载安装官方网站:https://nghttp2.org/https://github.com/nghttp2/nghttp2官方文档是在ubuntu或者debian上面进行安装的。安装依赖库:安装nghttp2服务。3,启动服务网上的文档比较少https://nghttp2.org/documentation/package_README.html配置就直接按照proxy进行配置即可。https

  4. grpc1:Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持

    目前提供C、Java和Go语言版本,分别是:grpc,grpc-java,grpc-go.其中C版本支持C,C++,Node.js,Python,Ruby,Objective-C,PHP和C#支持。自动进行proto编译,转换成几个java文件。4,启动server启动server。使用client进行测试:5,不能使用Nginx进行grpc代理虽然Nginx已经支持了http2,但是不能适应Nginx进行负载均衡。grpc想使用Nginx做代理。https://github.com/grpc/grpc-

返回
顶部