gRPC之API详解

本文详细介绍了gRPC客户端的异常重试、对冲策略、重试限流和设置超时的方法。异常重试针对不同情况有不同的处理方式,客户端重试配置能确保透明重试。对冲策略用于幂等操作,防止服务器过载。重试限流通过令牌桶机制控制重试频率。同时,还讲解了如何设置超时以及如何利用反射创建gRPC请求对象。
摘要由CSDN通过智能技术生成

异常重试

  1. 调用失败的情况

    • 第一种:客户端请求异常,此时未达到服务端
    • 第二种:请求达到服务端,但是服务端并未处理此请求
    • 第三种:服务端处理请求,但是处理结果是失败
  2. 对于第一种和第二种gRPC客户端会自动重试,因为服务端并未处理,所以始终可以重试(透明重试transparent retries),第三种需要手动设置重试策略

    //在客户端设置重试策略( 新建重试配置retry.json)
    1. name 指定需要配置异常重试的RPC方法,service是必填项,method是可选项
    2. retryPolicy 指定重试策略
       2.1 maxAttempts 最大重试次数,指定一次RPC 调用中最多的请求次数,包括第一次请求。必须是大于 1 的整数,对于大于5的值会被视为5。
           如果设置了调用的过期时间,那么到了过期时间,无论重试情况都会返回超时错误DeadlineExceeded  
       2.2 retryableStatusCode 重试状态码,当 RPC 调用返回非 OK 响应,会根据 retryableStatusCode 来判断是否进行重试,
           GRPC并没有提供自定义CODE的功能,所以只能用内置的CODE
       2.3 initialBackoff,maxBackoff,backoffMultiplier 指数退避参数,在进行下一次重试请求前,会计算需要等待的时间。
      			必须指定,并且必须具有大于0。第一次重试间隔是random(0, initialBackoff), 
    				第 n 次的重试间隔为random(0, min( initialBackoff*backoffMultiplier**(n-1) , maxBackoff)) 
    
    {
         
      "methodConfig": [
        {
         
          "name": [
            {
         
              "service": "cn.jannal.grpc.facade.dto.HelloService",
              "method": "hello"
            }
          ],
    
          "retryPolicy": {
         
            "maxAttempts": 5, 
            "initialBackoff": "0.5s",
            "maxBackoff": "30s",
            "backoffMultiplier": 2,
            "retryableStatusCodes": [
              "UNAVAILABLE" 
            ]
          }
        }
      ]
    }
    
  3. 客户端重试配置代码

    @Slf4j
    public class GrpcConsumerRetry {
         
        public static final String IP = "127.0.0.1";
        public static final int PORT = 8082;
    
        @Test
        public void testRetry() {
         
            ManagedChannel channel = ManagedChannelBuilder.forAddress(IP, PORT)
                    .defaultServiceConfig(getRetryingServiceConfig())
                    .enableRetry() // 重要,客户端是默认关闭了重试的
                    .usePlaintext()// 启用明文
                    .build();
            // 同步调用
            HelloServiceGrpc.HelloServiceBlockingStub stub
                    = HelloServiceGrpc.newBlockingStub(channel);
    
            HelloResponse helloResponse = stub.hello(HelloRequest.newBuilder()
                    .setFirstName("Jannal")
                    .setLastName("Jan")
                    .build());
            log.info("Response received from server:{}", helloResponse);
            channel.shutdown();
        }
    
        protected static Map<String, ?> getRetryingServic
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值