feign-core 与spring-boot 整合
1. 介绍
本文主要是介绍feign-core 与spring-boot 整合后的基本使用,及分析是如何整合的;feign-core原理解析可以参见上一篇:feign-core-基本使用;
2. 使用案例
2.1 注册中心
本文采用eurake , 源码中有相应的服务,直接运行main方法即可;
2.2 接口提供
本文以单独的jar项目提供,方便服务消费方使用;参见源码
接口如下:
/** * 吃饭 */ @FeignClient(name = "yiyi-feign-provider", path = "/eat") public interface EatService { /** * 吃 */ @GetMapping("/apple") String eatApple(); /** * 吃???? */ @GetMapping("/orange") String eatOrange(@RequestParam("who") String who); } 复制代码
2.3 服务提供方
提供一个HTTP服务即可,可以直接使用本文的spring-boot 项目,参见github-源码
2.4 服务消费方
消费方是本文重点,重点介绍下:
pom配置
引入接口、eureka客户端、feign-core
<dependency> <groupId>com.husky</groupId> <artifactId>yiyi-feign-intf</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- =========================== spring-boot start =========================== --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- =========================== spring-boot end =========================== --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>${spring-cloud-version}</version> </dependency> 复制代码
属性配置
app.id=yiyi-feign-consumer spring.application.name=yiyi-feign-consumer logging.level.org.apache.http=trace server.port=18084 spring.main.allow-bean-definition-overriding=true ribbon.eureka.enabled=true eureka.client.service-url.defaultZone=http://yiyi.cn:8761/eureka/ 复制代码
启动类配置
@EnableDiscoveryClient @EnableFeignClients(basePackages = {"com.husky.intf"}) @SpringBootApplication public class HuskyFeignConsumerApplication { public static void main(String[] args) { SpringApplication.run(HuskyFeignConsumerApplication.class, args); } } 复制代码
Controller调用
@RestController @RequestMapping("/eat") public class EatController { @Autowired private EatService eatService; /** * 吃 */ @GetMapping("/apple") public String eatApple() { return "provider: " + eatService.eatApple(); } @GetMapping("/orange") public String eatOrange(String who) { return eatService.eatOrange(who); } } 复制代码
2.5 启动
依次启动 注册中心、服务提供方、服务消费方;
postman访问: localhost:18084/eat/apple
返回结果:provider: 我吃了 苹果 on 18081
3. 整合原理
注: 如果你对feign-core原理不太了解,建议先看一下上篇文章:feign-core-基本使用,本文侧重feign-core 是如何与spring-boot 进行整合的,feign-core原理会一笔带过;
3.1 feign-core 原理回顾
代理对象的生成流程如下:
3.2 预想一下
在了解原理前,先思考????以下几个问题?
1)我们要神马?
要一个接口的代理对象
2)spring-boot 整合框架大多都如何起作用呢?
一般都是在启动类上加 @EnableXxx 注解
3.3 庖丁解牛
根据3.2 的预想,我们以启动类上的 @EnableFeignClient 注解为切入口,分析 代理类的加载逻辑;
如下图所示:我们的分析流程如下:
注: 到最后一步:registerFeignClients() ,我们得到可以生成接口代理对象的 FactoryBean ;
那么啥时候生成代理对象呢?
自然是@Autowired 赋值的时候
@Autowired
private EatService eatService;
至此代理类就可以提供服务了
作者:小雨淅淅淅
链接:https://juejin.cn/post/7042217571986178078