启动失败一

springcloud 练手项目_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.

问题简述:

同一接口路径中存在多个方法,路径识别失败,目标值必须为绝对值。

再查看代码:

springcloud 练手项目_springcloud 练手项目_02

可以发现出现2个接口路径相同的方法,甚至方法名都相同,因为Rest是接口提供方,Api作为接收方理应使用同一接口路径和方法名,因此只需要在路径正确的情况下加以修改即可。

修改DataApi:

springcloud 练手项目_spring_03

测试启动:

springcloud 练手项目_springcloud 练手项目_04

启动成功。

 

调用服务出现404

feign.FeignException: status 404 reading StrApi01#returnStr01()

springcloud 练手项目_springcloud 练手项目_05

分析:

在定义服务提供者和消费者时,未区分对@FeignClient注解所修饰的身份,@FeignClient是标注此类为服务的调用方,也就是消费者,在本项目中对应的就是cloud-consumer。

再看看此时项目的结构:

springcloud 练手项目_maven_06

很显然,在搭建架构的时候出现了问题,明明是消费方却提供给服务方接口,所以解决办法就是将2个框框处对换位置。

 

无法调用对应API

问题描述

这是server方暴露的服务:

springcloud 练手项目_springcloud 练手项目_07

这里的return是为了验证是否成功的一个测试语句。

这是consumer方接受服务使用的Api:

springcloud 练手项目_maven_08

这是该Api的Hystrix的实现:

springcloud 练手项目_springcloud 练手项目_09

这里我没做服务器降级的处理,加入了一条return以便后续验证调用是否成功

通过controller调用该Api接口使用server提供的方法:

springcloud 练手项目_spring_10

启动项目,打开postman测试:

springcloud 练手项目_方法名_11

可以发现返回的是DataFallback中的字符串,说明没有调用到服务。

再打开数据库查看:

springcloud 练手项目_spring_12

可以发现确实没有添加成功。

解决

其实这个问题点比较易见,就是consumer中的启动类中没有添加@EnableFeignClients注解来扫描这些Api,现在将其添加:

springcloud 练手项目_方法名_13

再次打开postman测试:

springcloud 练手项目_springcloud 练手项目_14

打开数据库查看:

springcloud 练手项目_spring_15

成功解决。

不过在添加完注解之后,其实并没有一帆风顺,因为添加之后启动就无法成功了,问题及原因见下一条。

 

启动失败二

问题描述

在刚添加@EnableFeignClients之后启动:

springcloud 练手项目_spring_16

问题解释:大概意思就是存在多个@FeignClient修饰的类,他们@FeignClient的value的值都相同,比如,

DataApi中@FeignClient的value的值:

springcloud 练手项目_方法名_17

HelloApi中@FeignClient的value的值:

springcloud 练手项目_方法名_18

由于出现多个相同Bean,所以报错。

但是,一个服务提供肯定不是只提供一个接口的,所以一定会出现这个问题。

解决

具体分析参考:

在配置文件中加入:

springcloud 练手项目_springcloud 练手项目_19

再次启动:

springcloud 练手项目_maven_20

成功

 

项目不默认使用Java8

这本身不是一个大问题,只是出现莫名的爆红很烦,比如:

springcloud 练手项目_spring_21

并且修改的时候,需要改动的地方很多

setting中的Java compiler

springcloud 练手项目_maven_22

需要将圈出来的地方全部改为8

然后是将每个Module的版本改为8

springcloud 练手项目_maven_23

改为如果切换了分支或者重启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就完全解决了。