java grpc threadlocal使用

1 篇文章 0 订阅

背景:在项目全文环境中获取公共数据 例如 当前用户的id等。

需要再 grpc 拦截器中 获取headers的信息然后设置到上下文对象 Context 中

  • 常量中定义需要公布的秘钥信息:
public class GrpcContextKey {
    public static final Context.Key<SecUser> USER_KEY = Context.key("USER");
}
  • 拦截器中设置绑定需要公布的信息:
  @Override
   public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call,
                                                                 Metadata headers, ServerCallHandler<ReqT, RespT> next) {
        //获取客户端参数
        Metadata.Key<String> userKey= Metadata.Key.of("token", Metadata.ASCII_STRING_MARSHALLER);
        String userId= headers.get(userKey);
        Context ctx = Context.current().withValues(GrpcContextKey.USER_KEY, secUser, GrpcContextKey.TOKEN_KEY, userId);
        return Contexts.interceptCall(ctx, call, headers, next);
    }
  • 使用
GrpcContextKey .USER_KEY .get()

附赠:

  • springboot 整合:

grpc-spring-boot-starter

  • 原理:

gRPC线程模型分析

  • http2 GO AWAY (一段时间后channel状态 idle 问题):

心跳
这个 问题我们是用心跳链接解决的 暂时没有想到别的办法,有解决方案的欢迎及时指正,一定有解决办法的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用gRPC进行简单的使用包括以下几个步骤: 1. 定义.proto文件:首先,你需要定义一个.proto文件,用于描述你的服务和消息格式。这个文件可以使用Protocol Buffers语言编写。例如,你可以定义一个简单的服务和消息格式如下: ```protobuf syntax = "proto3"; package com.example; service GreetingService { rpc SayHello(HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 2. 生成Java代码:一旦你定义了.proto文件,你可以使用gRPC的编译器将其生成为Java代码。你可以使用以下命令生成代码: ```bash protoc --java_out=<output_directory> <proto_file>.proto ``` 这将生成与.proto文件相匹配的Java类。 3. 实现服务逻辑:在服务器端,你需要编写一个类来实现你定义的服务接口。例如,对于上面的例子,你可以编写一个GreetingServiceImpl类来实现GreetingService接口: ```java package com.example; import io.grpc.stub.StreamObserver; public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) { String greeting = "Hello, " + request.getName() + "!"; HelloResponse response = HelloResponse.newBuilder().setMessage(greeting).build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 4. 启动服务器:你需要编写一个服务器类来启动gRPC服务器并注册你的服务实现类。例如: ```java package com.example; import io.grpc.Server; import io.grpc.ServerBuilder; import java.io.IOException; public class ServerMain { public static void main(String[] args) throws IOException, InterruptedException { Server server = ServerBuilder.forPort(50051) .addService(new GreetingServiceImpl()) .build(); server.start(); System.out.println("Server started"); server.awaitTermination(); } } ``` 5. 创建客户端:最后,你可以编写一个客户端类来调用你的服务。例如: ```java package com.example; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; public class ClientMain { public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) .usePlaintext() .build(); GreetingServiceGrpc.GreetingServiceBlockingStub stub = GreetingServiceGrpc.newBlockingStub(channel); HelloRequest request = HelloRequest.newBuilder().setName("Alice").build(); HelloResponse response = stub.sayHello(request); System.out.println(response.getMessage()); channel.shutdown(); } } ``` 这样,你就可以使用gRPC进行简单通信了。在实际使用中,你可能还需要处理错误、流式传输等更复杂的场景。你可以参考gRPC的官方文档和示例来深入了解更多用法和细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值