gRPC返回Status属性为null导致的事故

以下内容摘自雪球,在公司内部的docs上的内容总结,部分隐私信息已经处理改动


https://xueqiu.com/

在使用gRpc的ClientInterceptor进行拦截器实现tracing功能的时候出现了NULL错误,报错信息如下:

gRPC返回Status属性为null导致的事故_第1张图片

对com.google.common.collect这个google工具包有了解的同学应该知道,在ImmutableMap这个工具类下面有一些代码检查,源码如下:

final class SingletonImmutableBiMap extends ImmutableBiMap {
    final transient K singleKey;
    final transient V singleValue;
    transient ImmutableBiMap inverse;

    SingletonImmutableBiMap(K singleKey, V singleValue) {
        CollectPreconditions.checkEntryNotNull(singleKey, singleValue);
        this.singleKey = singleKey;
        this.singleValue = singleValue;
    }

…… ……


// assert检查部分
@GwtCompatible
final class CollectPreconditions {
    CollectPreconditions() {
    }

    static void checkEntryNotNull(Object key, Object value) {
        if (key == null) {
            throw new NullPointerException("null key in entry: null=" + value);
        } else if (value == null) {
            throw new NullPointerException("null value in entry: " + key + "=null");
        }
    }

可以定位到是给赋值了一个空值导致的

那么为什么这个调用中会出现null的问题?

进一步查看源码发现:在grpc的Status源码中,对于Description这个属性是允许为null

gRPC返回Status属性为null导致的事故_第2张图片

至于出现哪些情况会出现NULL,当时网上查询资料没找到详细的全部解释,只找到一个UNKNOWN状态,这个Description这个属性就是个null值

解决:

在使用Status的description字段的时候进行null判断即可

 

吐槽:这个官方源码啥想法,为啥会给返回null的值???????

 

你可能感兴趣的:(grpc,dubbo,thrift)