gRPC结合nacos学习
1.1 基本概念
1.1.1 gRPC核心设计思路
对于远程调用的的设计思路,一般都是以下四个方面:
- 网络通信:gRPC 自己封装网络通信的部分,并提供多种语言的封装(C、Java[Netty]、GO).
- 协议:gRPC 使用 HTTP2 传输数据(二进制数据内容),支持双工(双向流)连接的多路复用.
- 序列化:基于 Protobuf 的序列化方式,时间效率和空间效率都是 JSON 的 3~5 倍.
- 代理的创建:让调用者像调用本地方法一样,去调用远端的服务方法.
1.1.2 为什么使用gRPC
- 高效:基于 HTTP2 协议,传输二进制数据内容,又基于 Protobuf 实现序列化,高效的进行进程间通信.
- 支持多种语言:原生支持 C、GO、Java 实现。C语言版本上可扩展 C++、C#、NodeJS、Python、Ruby、PHP.
- 跨平台:支持多平台运行 linux、Android、IOS、MacOS、Windows.
1.2 HTTP2.0 协议
- 二进制通信:HTTP2.0 协议是一个二进制协议,效率高于 HTTP1.x,但是可读性较差.
- 实现双工通信:服务器可对客户端进行消息推送.
- 实现了多路复用机制:一个连接可以请求多个数据.
具体的通信过程,首先 HTTP2.0 协议以下三个重要概念:
- 数据流(Stream):客户端和服务器之间传输数据的通道(一个连接中可以有多个数据流).
- 消息(message):一个消息中就包含了多个帧.
- 帧(frame):就是一些具体的请求头,请求体信息.
1.3、Protocol Buffers(Protobuf)
1.3.1、protobuf 定义
protobuf 是一种与编程语言无关,与具体平台无关(任意操作系统)的序列化工具,自定义了中间语言(IDL),使得数据在 client 和 server 中进行 RPC 传输.
api的开发
- .proto文件 书写protobuf的IDL
- [了解]protoc命令 把proto文件中的IDL 转换成编程语言
protoc --java_out=/xxx/xxx /xxx/xxx/xx.proto
syntax = "proto3";
option java_multiple_files = false;
option java_package = "com.grpc.hello";
option java_outer_classname = "HelloProto";
service HelloService {
rpc hello(HelloRequest) returns(HelloResponse) {};
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string result = 1;
}
pom.xml
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.52.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.52.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.52.1</version>
</dependency>
<dependency> <!-- necessary for Java 9+ -->
<groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId>
<version>6.0.53</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.52.1:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
service服务端开发
-
实现业务接口 添加具体的功能
-
创建服务端 (Netty)
/*
1.接受client提交的参数 request.getParameter()
2.业务处理 service——dao 调用对应的业务功能
3.提供返回值
*/
@Override
public void hello(com.grpc.hello.HelloProto.HelloRequest request,
io.grpc.stub