SpringBoot整合gRPC踩坑回顾

举报
别惹CC. 发表于 2025/05/23 14:03:33 2025/05/23
【摘要】 引子上周完结了自己入职以来的第一个预研任务,关于项目未来会全面拆分,又因为接口之间存在很多调用关系,因此在拆分服务后需要采用RPC调用,因此决定引入gRPC,也就诞生了这篇踩坑回顾文章。 一、SpringBoot3.0暂不支持当时需求提的是项目想升到SpringBoot3.0,因此对于版本这里我就没给予重视,满腔热血地打开Github,搜索了相关starter,然后引入到了项目中,光速仿写...

引子

上周完结了自己入职以来的第一个预研任务,关于项目未来会全面拆分,又因为接口之间存在很多调用关系,因此在拆分服务后需要采用RPC调用,因此决定引入gRPC,也就诞生了这篇踩坑回顾文章。

一、SpringBoot3.0暂不支持

当时需求提的是项目想升到SpringBoot3.0,因此对于版本这里我就没给予重视,满腔热血地打开Github,搜索了相关starter,然后引入到了项目中,光速仿写了个Demo,然后项目启动傻眼了,RPC服务没启动起来,一顿操作猛如虎,最后发现自己预研不够充分,官方文档包含版本对照表,读者可以自行查看。

1

二、对于微服务项目架构理解不清楚

在解决完版本问题后,在编写代码时又闹出了很多乌龙,比如从Controler层开始gRPC服务端与客户端代码,写完才想到作为独立的服务它应当能接收来自外部的HTTP请求;把自己内部的服务也改造成gRPC相关的代码。这里会发生这些事情,我后来反思是我当时对微服务认识还不清晰的缘故,因为自己以前自己做项目也好,实习也好,接触到的都是单体架构的项目,微服务对我来说只是概念,但经过这次实操,也对它有了一个比较清晰的认识,于是自己简单梳理了一下项目以后全面拆分后的架构:

2

三、依赖冲突问题

在定义proto文件时需要定义时间类型TimeStamp,因此需要引入protobuf-java-util依赖,主要作用是proto与json互转,但是在接口层引入的proto相关的依赖会与它发生冲突,但是并不会显示提醒,在debug时执行到相应代码处则会提示类型转换失败,但其实控制台也会报NoSuchMethodException异常,但当时的我却忽视了这个,后来复现时发现了这个问题,于是在这里也记录下解决依赖冲突的小技巧:

通常情况下遇到以下三种异常就该检查依赖冲突了:NoSuchMethodExceptionClassNotFoundExceptionNoClassDefFoundException

先来看看什么是依赖冲突:

3

解决这个的方法通常是从A中排除掉M:

<dependency>
      <groupId>xxxx.xxx</groupId>
      <artifactId>A</artifactId>
      <version>1.0</version>
      <exclusions>
        <exclusion> 
          <groupId>xxxx.xxx</groupId>
          <artifactId>M</artifactId>
        </exclusion>
      </exclusions> 
  </dependency>

但是很多时候很难找到具体发生冲突的依赖,这时候就要推荐一个插件Maven Helper了,安装成功后,打开pom文件下方就多出了一个选项:

4

打开后就可以看到依赖冲突爆红以及具体的哪些依赖引用情况:

5

在需要排除的依赖上exclude就可以了:

6

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。