一、调用方:
1、导入依赖
可能会出现的坎坷:
(1)feign依赖导入失败
可能的原因:spring cloud 与 spring boot 的版本是有对应关系的,如果 两者不对应,就会导入失败,报红。
具体对应关系查询请移步:
https://www.jianshu.com/p/a452c45c8937
比如我的spring boot用得是2.0.3 主版本号.子版本号.修正版本号
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
那我的spring cloud就得用Finchley.SR4 主版本号.子版本号.修正版本号.软件版本阶段
<properties>
<spring-cloud.version>Finchley.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、启动类 新增@EnableFeignClients
注解,开启 Feign 扫描支持,如:
package cn.xxx.sppointsproxyservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class SpPointsProxyServiceApplication {
public static void main(String[] args) {
//解决es netty冲突问题
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(SpPointsProxyServiceApplication.class, args);
}
}
3、Feign 接口编写,接口 新增@FeignClient
注解。如:
package cn.xxx.sppointsproxyservice.feign;
import cn.xxx.sppointsproxyservice.config.FeignConfig;
import cn.xxx.sppointsproxyservice.hystrix.UserServiceHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = "OP-ACCOUNT-SERVICE", configuration = FeignConfig.class, fallback = UserServiceHystrix.class)
public interface UserFeign {
@RequestMapping(value = "/login/{partnerCode}/{stbId}/{mac}/", method = RequestMethod.GET)
String userLogin(@PathVariable("partnerCode") @RequestHeader("partnerCode") String partnerCode,
@PathVariable("stbId") String stbId,
@PathVariable("mac") String mac);
}
@FeignClient
中的name
需与被调用方的spring.application.name
保持一致,忽略大小写。
二、测试:
启动报错:
2021-08-18 16:29:30.068 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [cn.gitv.sppointsproxyservice.SpPointsProxyServiceApplication]; nested exception is java.lang.IllegalArgumentException: Could not find class [org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition]
2021-08-18 16:29:30.084 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [cn.gitv.sppointsproxyservice.SpPointsProxyServiceApplication]; nested exception is java.lang.IllegalArgumentException: Could not find class [org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition]
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:648)
at org.springframework.context.annotation.ConfigurationClassParser.lambda$processDeferredImportSelectors$2(ConfigurationClassParser.java:567)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:563)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:316)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
at cn.gitv.sppointsproxyservice.SpPointsProxyServiceApplication.main(SpPointsProxyServiceApplication.java:20)
Caused by: java.lang.IllegalArgumentException: Could not find class [org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:313)
at org.springframework.context.annotation.ConditionEvaluator.getCondition(ConditionEvaluator.java:124)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:96)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:221)
at org.springframework.context.annotation.ConfigurationClassParser.processMemberClasses(ConfigurationClassParser.java:362)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:265)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:638)
... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:274)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:310)
... 24 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:51616', transport: 'socket'
Process finished with exit code 1
摘出关键信息:
Could not find class [org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition]
ClassNotFoundException: OnNoRibbonDefaultCondition
pom.xml中SpringCloud版本不对,换成上面所说的正确的版本后,再次测试:
大功告成!
附:SpringCloud 版本号说明:
第一代:Angle,
第二代:Brixton;
第三代:Camden,
第四代:Dalston;
第五代:Edgware,
第六代:Finchley;
第七代:GreenWich,
第八代:Hoxton;
snapshot 快照
alpha 内测
beta 公测
release 稳定版本
GA 最稳定版本
Final 正式版
Pro(professional) 专业版
Plus 加强版
Retail 零售版
DEMO 演示版
Build 内部标号
Delux 豪华版 (deluxe:豪华的,华丽的)
Corporation或Enterpraise 企业版
M1(Milestone) 里程碑
RC(Release Candidate)几乎就不会加入新的功能了,而主要着重于除错
SR(Service Release)修正版 (对于release版本的问题进行修复)
Trial 试用版
Shareware 共享版
Full 完全版