社区精选|聊一聊 gRPC 中的拦截器
今天小编为大家带来的是社区作者 江南一点雨 的文章,让我们一起继续 gRPC 系列
一个简单的案例入门 gRPC https://mp.weixin.qq.com/s/OyfU0tLm4f9t3nZxce-Ksw 聊一聊 gRPC 的四种通信模式 https://mp.weixin.qq.com/s/c-_D2RpLksIlYJDfaWOSkA 
服务端拦截器 客户端拦截器 
1. 服务端拦截器

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();
}));
}
第一个参数 call 是消费传入的 RPC 消息的一个回调。 第二个参数 headers 则是请求的消息头,如果我们通过 JWT 进行请求校验,那么就从这个 headers 中提取出请求的 JWT 令牌然后进行校验。 第三个参数 next 就类似于我们在 Java 过滤器 filter 中的 filterChain 一样,让这个请求继续向下走。 
2. 客户端拦截器
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);
当我们的请求执行的时候,这个客户端拦截器就会被触发。 
3. 小结


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
                        关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
                        四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
                        让资讯触达的更精准有趣:https://www.0xu.cn/
                    
            关注网络尖刀微信公众号随时掌握互联网精彩
- 你的耳机在被偷听?多款音频设备曝出漏洞:索尼、Bose等
 - Google 憋了大招发布新模型 Gemini,【视频】里最强的的确强。虽然只过了1年,但这个世界真的变了
 - 零跑的“里程焦虑”:造血困难,该靠谁救命?
 - Magic Leap 2正式发布:3299美元起,9月底出货
 - 飞盘“祛魅”
 - 北京最新疫情2022年7月9日
 - “清洁网络”计划引发行业焦虑:PON产业链面临分裂风险
 - 扫地机器人好用吗?教你如何正确选购不走弯路
 - 【大公司创新情报】保利协鑫获隆基、中环390亿硅料巨单
 - realme真我V15发布:还原“锦鲤色” 性能体验全面升级
 - 华为西南地区首家旗舰店在成都开业;京东收购美家买菜;淘宝特价版上线老年人 “省心版”|Do早报
 - 通信业的九大定律,最后一个扎心了
 
            赞助链接
        
    


                            微信扫码关注公众号