业界 作者:SegmentFault 2023-02-24 22:31:27 阅读:765
今天小编为大家带来的是社区作者 江南一点雨 的文章,让我们一起继续 gRPC 系列

public class BookServiceCallListener<R> extends ForwardingServerCallListener<R> {
private final ServerCall.Listener<R> delegate;
public BookServiceCallListener(ServerCall.Listener<R> delegate) {
this.delegate = delegate;
}
@Override
protected ServerCall.Listener<R> delegate() {
return delegate;
}
@Override
public void onMessage(R message) {
System.out.println("这是客户端发来的消息,可以在这里进行预处理:"+message);
super.onMessage(message);
}
}
public class BookServiceCall<ReqT,RespT> extends ForwardingServerCall.SimpleForwardingServerCall<ReqT,RespT> {
protected BookServiceCall(ServerCall<ReqT, RespT> delegate) {
super(delegate);
}
@Override
protected ServerCall<ReqT, RespT> delegate() {
return super.delegate();
}
@Override
public MethodDescriptor<ReqT, RespT> getMethodDescriptor() {
return super.getMethodDescriptor();
}
@Override
public void sendMessage(RespT message) {
System.out.println("这是服务端返回给客户端的消息:"+message);
super.sendMessage(message);
}
}
public void start() throws IOException {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(ServerInterceptors.intercept(new BookServiceImpl(), new ServerInterceptor() {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
String fullMethodName = call.getMethodDescriptor().getFullMethodName();
System.out.println(fullMethodName + ":pre");
Set<String> keys = headers.keys();
for (String key : keys) {
System.out.println(key + ">>>" + headers.get(Metadata.Key.of(key, ASCII_STRING_MARSHALLER)));
}
return new BookServiceCallListener<>(next.startCall(new BookServiceCall(call), headers));
}
}))
.build()
.start();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
BookServiceServer.this.stop();
}));
}
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.intercept(new ClientInterceptor() {
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
System.out.println("!!!!!!!!!!!!!!!!");
callOptions = callOptions.withAuthority("javaboy");
return next.newCall(method,callOptions);
}
})
.build();
BookServiceGrpc.BookServiceStub stub = BookServiceGrpc.newStub(channel);
当我们的请求执行的时候,这个客户端拦截器就会被触发。

