simple-starter-grpc
# 简介
提供注解简化使用:Grpc客户端、 Grpc服务端
# 引入依赖
<dependencies>
<dependency>
<groupId>cn.iosd</groupId>
<artifactId>simple-starter-grpc</artifactId>
<version>Version</version>
</dependency>
</dependencies>
1
2
3
4
5
6
7
2
3
4
5
6
7
# 配置项
simple:
## simple-starter-grpc
grpc:
client:
#Grpc客户端 缺省项为false
enabled: true
#设置Grpc调用超时时间 缺省项为5000毫秒
timeout: 5000
channel:
local-grpc-server:
address: '127.0.0.1:12030'
server:
#Grpc服务端 缺省项为false
enabled: true
port: 12030
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 概念图
# 介绍及使用
由helloworld.proto生成以下文件
文件名称 | 介绍 |
---|---|
HelloReply | 包含了 HelloReply 消息的定义,消息包含一个名为 message 的字符串字段。 |
HelloReplyOrBuilder | 用于构建 HelloReply 消息,提供了 message 字段的 getter 和 setter 方法。 |
HelloRequest | 包含了 HelloRequest 消息的定义,消息包含一个名为 name 的字符串字段。 |
HelloRequestOrBuilder | 用于构建 HelloRequest 消息,提供了 name 字段的 getter 和 setter 方法。 |
HelloWorldProto | 包含了 Simple 服务和其中的方法 SayHello 的定义,可以在客户端和服务器端使用。 |
SimpleGrpc | 包含了客户端和服务器端用于实现 Simple 服务的方法,包括 SayHello 方法的实现。通过 gRPC 调用远程服务的接口。 |
# Grpc服务端
# 基础使用
通过继承 SimpleGrpc.SimpleImplBase 类并重写 SayHello 方法来实现服务器端的 Simple 服务。
同时,你需要在当前类上添加 @GrpcService 注解来表明这是一个 gRPC 服务端。客户端可以通过 gRPC 调用 SayHello 方法来与该服务端进行通信。
示例:
@GrpcService
public class GrpcHelloService extends SimpleGrpc.SimpleImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("GrpcHelloService Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 增加请求头获取
实现ServiceCallStartHeaders接口,统一拦截获取请求头并返回校验结果
示例:
@Component
public class GrpcServiceCallStartHeaders implements ServiceCallStartHeaders {
@Override
public Status verifyHeaders(Metadata headers) {
String value = headers.get(Metadata.Key.of("token", Metadata.ASCII_STRING_MARSHALLER));
if (StringUtils.isEmpty(value)) {
return Status.UNAUTHENTICATED.withDescription("请求头参数token值为空");
}
return Status.OK;
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# Grpc客户端
# 基础使用
在你的服务层类中使用 SimpleGrpc.SimpleBlockingStub 类,该类用于调用 gRPC 服务的方法。
同时,你需要在当前类上添加 @GrpcClient(value = "grpc-server-hello") 注解来表明这是一个 gRPC 客户端
value 值为 simple.grpc.client.channel.{value}.address 配置项的名称。
这样,你就可以通过注入的 Stub 对象发起调用并与远程服务通信。
示例:
@Service
public class GrpcDemoClientService {
@GrpcClient(value = "grpc-server-hello")
private SimpleGrpc.SimpleBlockingStub simpleStub;
public String sendHelloMessage(final String name) {
final HelloReply response = this.simpleStub.sayHello(HelloRequest.newBuilder().setName(name).build());
return response.getMessage();
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 增加单独设置调用超时时间
timeout 值为 设置Grpc调用超时时间-单位毫秒,默认5000毫秒 等同于配置文件配置项 simple.grpc.client.timeout 但优先级较高
示例:
@Service
public class GrpcDemoClientService {
@GrpcClient(value = "grpc-server-hello", timeout = 10000)
private SimpleGrpc.SimpleBlockingStub simpleStub;
public String sendHelloMessage(final String name) {
final HelloReply response = this.simpleStub.sayHello(HelloRequest.newBuilder().setName(name).build());
return response.getMessage();
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 增加请求头参数设置
# 只有一个请求头参数设置时
实现ClientCallStartHeaders接口,统一设置请求头参数值,所有请求将都会进入此方法
示例-实现类:
@Component
public class GrpcClientCallStartHeaders implements ClientCallStartHeaders {
@Override
public Map<String, String> headers() {
return Collections.singletonMap("token", "ces1");
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
注解无需指定实现类名称:
@GrpcClient(value = "grpc-server-hello")
private SimpleGrpc.SimpleBlockingStub simpleStub;
1
2
2
# 有多个请求头参数设置时
实现ClientCallStartHeaders接口,设置请求头参数值,注解需指定实现类名称才进入对应方法。
示例-实现类:
@Component
public class GrpcClientCallStartHeaders implements ClientCallStartHeaders {
@Override
public Map<String, String> headers() {
return Collections.singletonMap("token", "ces1");
}
}
@Component
public class GrpcSencondClientCallStartHeaders implements ClientCallStartHeaders {
@Override
public Map<String, String> headers() {
return Collections.singletonMap("token", "ces2");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注解指定实现类名称,注 多个请求头拦截时需要增加注解值 headerBeanName :
@GrpcClient(value = "grpc-server-hello",headerBeanName = "grpcSecondClientCallStartHeaders")
private SimpleGrpc.SimpleBlockingStub simpleStub;
1
2
2
上次更新: 2024/03/25, 02:28:08