feign的基本使用

本文介绍了如何在Spring Cloud中使用Feign进行服务调用。首先,文章强调了Spring Boot和Spring Cloud版本匹配的重要性,指出版本不对应会导致Feign依赖导入失败。接着,详细说明了在启动类中添加注解以启用Feign扫描,以及编写Feign接口的步骤。最后,针对启动报错问题,提示检查SpringCloud版本,并成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、调用方:

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 完全版 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值