grpc(1):Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持
2023-09-11 14:21:06 时间
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 要快很多。
代码已经放到github上面了。就几个文件。这里就不黏贴代码了。
https://github.com/freewebsys/grpc-java-demo
首先要定义一个idl文件,在src/main/proto目录下面。
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; }
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里面,可以直接编译通过。
打包:
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
直接启动就可以了。
public static void main(String[] args) throws IOException, InterruptedException { final HelloWorldServer server = new HelloWorldServer(); server.start(); server.blockUntilShutdown(); }
使用client进行测试:
/* 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(); }
这个地方很奇怪。
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-----------------------------
前端可以了解一下:nginx负载均衡 直接封面图可以发现:最左侧的便是客户机,中间的就是负载均衡的机器,最右侧的便是通过负载后真正访问的服务器,我这里只画了两台服务器,实际情况根据需求可能还会不断增加。
相关文章
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- 解决IDEA Java Web项目没问题,但部署时出错的问题
- Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
- 【JAVA】Eclipse中开启java和xml智能提示功能(图文,已解决!)
- 【转】Java并发编程:同步容器
- Java Date Time 教程-java.sql.Date
- Deci and Centi Seconds parsing in java
- Centos 7.x安装openjdk 11及JAVA 11的特性
- JAVA础--利用java反射机制绕过编译时的类型检查和访问控制检查
- JAVA单元测试框架-6-Enable priority
- 收到6家大厂offer,我把问烂了的《Java八股文》打造成3个PDF。共1700页!!
- Java - CentOS下JDK的安装教程(及JAVA_HOME配置、以jdk1.8为例)
- 【Java】java基本知识
- 第60节:Java中的JavaScript技术
- 第七节:详细讲解Java中的日期,java.util.date
- 【运维】Centos 7 一键 搭建 Java开发者环境
- CentOS 安装Java
- Centos java 安装
- docker 部署java web应用_使用Docker部署JavaWeb项目
- Java学习-050-AES256 之 java.security.InvalidKeyException: Illegal key size or default parameters 解决方法
- java中有界队列的饱和策略(reject policy)
- java.util.Date转换到java.sql.date用于数据更新
- java学习路线-Java技术人员之路从0基础到高级
- Java中finally关键字的使用
- CentOS 安装 Memcache 服务器. java 做客户端.
- Linux(Centos)之安装tomcat并且部署Java Web项目
- Linux(Centos)之安装Java JDK及注意事项
- 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码
- 整合SSM时报错:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;
- final 在 java 中有什么作用?面试篇(第四天)