栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

io.grpc.netty.shaded.io.grpc.netty.NettyClientStream$Sink.request(I)V,你是不是也被GRPC坑过

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

io.grpc.netty.shaded.io.grpc.netty.NettyClientStream$Sink.request(I)V,你是不是也被GRPC坑过

首先,完整的报错是java.lang.AbstractMethodError: io.grpc.netty.shaded.io.grpc.netty.NettyClientStream$Sink.request(I)V。

这是博主在做一次微服务迁移碰到的问题,原先的配置在Spring Boot下跑是完全正常的,然后把grpc的配置迁移到Spring Cloud下就开始报该错误了。

两个项目对于GRPC唯一不同的地方就是引入的Boot版本不一致,单体引入的是2.2.5.RELEASE,微服务引入的是2.3.5.RELEASE,引入的GRPC版本都是1.32.1。一开始我以为找到问题了,从版本依赖关系进行入手,查阅到grpc-spring-boot-starter(感谢作者大大)有这方面的介绍,

具体链接如下:https://github.com/yidongnan/grpc-spring-boot-starter/blob/master/docs/en/versions.md,提升了grpc的版本到1.32.1以上,然后还是一直报错,这就让我很苦恼了。

没办法,操作下Rollback,还是仔细debug看下到底是哪块代码出错了,最后发现的问题是Sink接口中的request方法竟然没有被实现而导致的报错,如下图所示:

 

这完全不该啊,我在Spring Boot版本那边引入的也是相同的grpc版本啊,于是切回到boot版本找到AbstractClientStream中内部类Sink中的request方法是否有被实现。然而惊呆了我,如下图,你是不是也很吃惊,压根就没有这个request方法啊。

 

如果仔细看的话,我们会发现一个问题,卧槽,同样的AbstractClientStream类怎么在不同的包下面,而且我在Cloud版本那边压根没用引过1.30.2的包啊,心里顿时一万只羊驼在奔跑。于是自然而然的就会想到,是引入的core包不对,于是在Cloud版本再引入

        
            io.grpc
            grpc-core
            1.32.1
        

再使用Maven Helper插件(强烈推荐,开发必备)发现在grpc-netty-shaded包中存在core的冲突,于是修改如下:

        
            io.grpc
            grpc-netty-shaded
            ${grpc.version}
            
                
                    grpc-core
                    io.grpc
                
            
        

后面又一次debug发现还是报错,有了前面的坑,后面就有经验了,这次的错是grpc-api版本不对,于是又是一顿操作。最后修改的配置如下:

        
        
            io.grpc
            grpc-netty-shaded
            ${grpc.version}
            
                
                    grpc-core
                    io.grpc
                
            
        
        
            io.grpc
            grpc-protobuf
            ${grpc.version}
            
                
                    grpc-api
                    io.grpc
                
            
        
        
            io.grpc
            grpc-stub
            ${grpc.version}
            
                
                    grpc-api
                    io.grpc
                
            
        
        
            io.grpc
            grpc-core
            ${grpc.version}
            
                
                    grpc-api
                    io.grpc
                
            
        
        
            io.grpc
            grpc-api
            ${grpc.version}
        
         
            org.apache.tomcat
            annotations-api
            ${tomcat.annotations-api.version}
            provided
        

这个坑有点深,一层套一层啊。

最后总结一下这次采坑,可能是GRPC在版本升级过程中没有指定grpc-core和grpc-api的版本,于是在Spring Boot的不同版本下,GRPC会默认使用grpc-core和grpc-api的版本为1.30.2。当然直接把引入的grpc依赖全部改成1.30.2或许也行,这个我就不去测试了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906089.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号