搭建简单的SpringCloud项目三:问题及解决
GitHub:https://github.com/ownzyuan/test-cloud
前篇:搭建简单的SpringCloud项目一:注册中心和公共层
启动失败一
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consumerController': Unsatisfied dependency expressed through field 'dataApi'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.zy.api.DataApi': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: target values must be absolute.
问题简述:
同一接口路径中存在多个方法,路径识别失败,目标值必须为绝对值。
再查看代码:
可以发现出现2个接口路径相同的方法,甚至方法名都相同,因为Rest是接口提供方,Api作为接收方理应使用同一接口路径和方法名,因此只需要在路径正确的情况下加以修改即可。
修改DataApi:
测试启动:
启动成功。
调用服务出现404
feign.FeignException: status 404 reading StrApi01#returnStr01()
分析:
在定义服务提供者和消费者时,未区分对@FeignClient注解所修饰的身份,@FeignClient是标注此类为服务的调用方,也就是消费者,在本项目中对应的就是cloud-consumer。
再看看此时项目的结构:
很显然,在搭建架构的时候出现了问题,明明是消费方却提供给服务方接口,所以解决办法就是将2个框框处对换位置。
无法调用对应API
问题描述
这是server方暴露的服务:
这里的return是为了验证是否成功的一个测试语句。
这是consumer方接受服务使用的Api:
这是该Api的Hystrix的实现:
这里我没做服务器降级的处理,加入了一条return以便后续验证调用是否成功
通过controller调用该Api接口使用server提供的方法:
启动项目,打开postman测试:
可以发现返回的是DataFallback中的字符串,说明没有调用到服务。
再打开数据库查看:
可以发现确实没有添加成功。
解决
其实这个问题点比较易见,就是consumer中的启动类中没有添加@EnableFeignClients注解来扫描这些Api,现在将其添加:
再次打开postman测试:
打开数据库查看:
成功解决。
不过在添加完注解之后,其实并没有一帆风顺,因为添加之后启动就无法成功了,问题及原因见下一条。
启动失败二
问题描述
在刚添加@EnableFeignClients之后启动:
问题解释:大概意思就是存在多个@FeignClient修饰的类,他们@FeignClient的value的值都相同,比如,
DataApi中@FeignClient的value的值:
HelloApi中@FeignClient的value的值:
由于出现多个相同Bean,所以报错。
但是,一个服务提供肯定不是只提供一个接口的,所以一定会出现这个问题。
解决
具体分析参考:https://blog.csdn.net/u012211603/article/details/84312709
在配置文件中加入:
再次启动:
成功
项目不默认使用Java8
这本身不是一个大问题,只是出现莫名的爆红很烦,比如:
并且修改的时候,需要改动的地方很多
setting中的Java compiler
需要将圈出来的地方全部改为8
然后是将每个Module的版本改为8
改为如果切换了分支或者重启Idea,就又要重来,所以需要个很好的解决办法。
在父工程中的pom中添加
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build>
再刷新一下maven就完全解决了。