在学习了微服务的基本概念和操作了一次JDK8、SpringBoot 2.3.9-RELEASE搭建微服务的过程后,笔者开始尝试将之前使用SpringBoot 3.3.13写的一个小项目拆分成多个微服务,版本不同导致踩了一些坑,这里分享一下踩过的坑以及解决方案。
项目信息
| 依赖/软件 | 版本 |
|---|---|
| JDK | 21 |
| SpringBoot | 3.3.13 |
| MyBatis | 3.0.4 |
| MyBatisPlus | 3.5.7 |
| SpringCloud | 2023.0.3 |
| SpringCloudAlibaba | 2023.0.3.3 |
| OpenFeign | 4.1.3 |
| SpringCloudGateway | 4.1.5 |
| Nacos | 2.4.2 |
| MySQL | 8.0.40 |
踩坑一:依赖版本管理
给项目搭建微服务的时候依旧采用为使用JDK8的项目的相关依赖,导致启动服务时报错;后面才发觉不同的SpringBoot版本需要使用相应的依赖版本,于是查询Nacos官网的版本发布说明,获得如下信息:
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version | Nacos Version |
|---|---|---|---|
| 2023.0.1.0* | 2023.0.1 | 3.2.4 | 2.3.2 |
| 2023.0.0.0-RC1 | 3.3.13 | 3.2.0 | 2.3.0 |
结合mvnrepository上找到的Spring Cloud Alibaba Dependencies的所有2023.x版本:
最终确定了各个依赖的版本;不过启动后还是出现了报错,在报错信息中注意到:
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
查阅资料得知高版本SpringCloud将负载均衡依赖单独抽了出来,需要额外引入;引入spring-cloud-starter-loadbalancer后成功运行。
踩坑二:Feign不使用HttpClient
按照配置JDK8那个项目的做法,笔者尝试引入feign-httpclient依赖并修改application.yml,发现配置项不一样,并且在FeignClientFactoryBean类的断点调试显示的client.delegate仍然是Feign默认的而非HttpClient:
查阅资料后得知Spring Cloud OpenFeign从4开始不再支持Feign Apache HttpClient 4,需要换用5;引入 feign-hc5并配置application.yml后,成功使HttpClient生效:
spring:
cloud:
openfeign:
httpclient: #feign client使用 Apache HttpClient5
hc5:
enabled: true
踩坑三:网关配置
在成功启动所有微服务和网关后,Nacos控制台也能正常显示服务列表,但是访问后端微服务却显示503服务未找到:
发现在网关的application.yml中将各路由的uri配置为负载均衡的地址(lb://{项目名}),并且网关项目没有引入spring-cloud-starter-loadbalancer;和其他微服务模块不同,这里没有spring-cloud-starter-loadbalancer也没有在启动时直接报错,只在尝试访问后端时出现;引入负载均衡依赖后,问题解决。
结语
以上便是笔者搭建使用SpringBoot 3.3.13的微服务所遇到的一些问题,希望能对各位读者有所帮助。