grpc(1):Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持

释放双眼,带上耳机,听听看~!

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目录下面。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1syntax = "proto3";
2//定义包,类名称
3option java_multiple_files = true;
4option java_package = "io.grpc.examples.helloworld";
5option java_outer_classname = "HelloWorldProto";
6option objc_class_prefix = "HLW";
7
8package helloworld;
9
10// 定义一个grpc接口
11service Greeter {
12  // Sends a greeting
13  rpc SayHello (HelloRequest) returns (HelloReply) {}
14}
15
16// 请求对象,name
17message HelloRequest {
18  string name = 1;
19}
20
21// 返回对象
22message HelloReply {
23  string message = 1;
24}
25

3,配置pom.xml 文件


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1<extensions>
2            <extension>
3                <groupId>kr.motd.maven</groupId>
4                <artifactId>os-maven-plugin</artifactId>
5                <version>1.4.1.Final</version>
6            </extension>
7        </extensions>
8        <plugins>
9            <plugin>
10                <groupId>org.xolstice.maven.plugins</groupId>
11                <artifactId>protobuf-maven-plugin</artifactId>
12                <version>0.5.0</version>
13                <configuration>
14                    <protocArtifact>com.google.protobuf:protoc:3.2.0:exe:${os.detected.classifier}</protocArtifact>
15                    <pluginId>grpc-java</pluginId>
16                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
17                </configuration>
18                <executions>
19                    <execution>
20                        <goals>
21                            <goal>compile</goal>
22                            <goal>compile-custom</goal>
23                        </goals>
24                    </execution>
25                </executions>
26            </plugin>
27

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

打包:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1<!-- 打包成一个jar 文件。-->
2            <plugin>
3                <groupId>org.apache.maven.plugins</groupId>
4                <artifactId>maven-assembly-plugin</artifactId>
5                <version>2.5.5</version>
6                <configuration>
7                    <archive>
8                        <manifest>
9                            <mainClass>io.grpc.examples.helloworld.HelloWorldServer</mainClass>
10                        </manifest>
11                    </archive>
12                    <descriptorRefs>
13                        <descriptorRef>jar-with-dependencies</descriptorRef>
14                    </descriptorRefs>
15                </configuration>
16                <executions>
17                    <execution>
18                        <id>make-assembly</id>
19                        <phase>package</phase>
20                        <goals>
21                            <goal>single</goal>
22                        </goals>
23                    </execution>
24                </executions>
25            </plugin>
26

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

4,启动server


启动server。


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

使用client进行测试:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
1HelloWorldClient client = new HelloWorldClient("localhost", 50051);
2    try {
3      /* Access a service running on the local machine on port 50051 */
4      String user = "world";
5      if (args.length > 0) {
6        user = args[0]; /* Use the arg as the name to greet if provided */
7      }
8      for (int i = 0; i < 100; i ++) {
9        client.greet(user);
10      }
11    } finally {
12      client.shutdown();
13    }
14

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

直接报错:


1
2
3
4
5
6
1WARNING: RPC failed: Status{code=UNKNOWN, description=HTTP status code 0
2invalid content-type: null
3headers: Metadata(:status=000,server=openresty/1.11.2.2,date=Tue, 28 Feb 2017 02:06:26 GMT)
4DATA-----------------------------
5
6

给TA打赏
共{{data.count}}人
人已打赏
安全经验

Google Adsense(Google网站联盟)广告申请指南

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索