Spring Cloud之Feign入门

2024-06-10 02:18
文章标签 java 入门 spring cloud feign

本文主要是介绍Spring Cloud之Feign入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://www.dubby.cn/detail.html?id=9008

Spring Cloud Eureka,Spring Cloud Ribbon,Spring Cloud Hystrix和Spring Cloud Feign都是Spring Cloud对Netflix OSS的封装,为了简便,下文中把Spring Cloud Feign直接称呼为Feign,Hystrix,Ribbon和Eureka也是如此。

为什么需要Feign

服务熔断

之前已经介绍了如何使用Eureka和Ribbon建立骑一个基本的Spring Cloud项目了,那么为什么还需要Feign呢?

如果你对熔断有过了解,那么应该知道Hystrix吧,这是Netflix OSS家族中使用比较广泛的一个组件。目的就是为了容忍系统中可能出现问题的调用,常见的有RPC调用,第三方lib等。在分布式系统下下,服务熔断可以避免错误蔓延,甚至产生雪崩;而且还提供了一定程度的自我恢复的能力。

RPC和熔断的关系

在实践过程中,往往RPC调用的地方就一定要伴随着熔断(甚至降级),因为RPC的不稳定性很高。我们当然也可以单独的进行RPC和熔断降级,不过我们可以选择把他们放到一起来处理,这就是Feign的出现的意义之一。

RESTful调用和RPC

习惯了Dubbo(阿里开源的服务治理框架,而且最近阿里重新开始维护),Pigeon(美团点评的服务治理框架,内部在使用,而且也开源了)的人都会知道RPC的好处,通过框架的简单封装,再由Spring托管一下Bean,代码层面甚至不知道自己调用的是本地的代码,还是远程的服务,这不仅可以提高代码编写效率,还减小了开发的难度。

说实话,Ribbon使用的是RestTemplate,已经比HttpClient好用很多了,但是,还是需要自己拼参数,这和拼SQL是同样让人无法忍受的。所以,Feign的出现,是对Ribbon的更高一层的封装,有人称之为(伪)RPC。

尝试使用Fegin

如果你还没有看过《从最简单的Spring Cloud应用开始》,那么你需要先去看一看,并且在本地运行eureka-server和demo-service,这样接下来的示例你才可以正确运行。

搭建项目

先还是创建一个Spring Boot项目,然后添加需要的依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Brixton.SR5</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在你的启动类上修改注解:

@EnableFeignClients
@SpringCloudApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

注:@SpringCloudApplication等价于:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker

新建DemoService.java

@FeignClient(name = "demo-service")
public interface DemoService {@RequestMapping(value = "hello", method = RequestMethod.GET)String hello();
}

这个interface其实就是Feign实现的伪RPC了,你可以在你需要的地方注入就可以了。

比如,新建HelloController.java

@RestController
public class HelloController {@Autowiredprivate DemoService demoService;@RequestMapping(value = "hello")public String hello() {return demoService.hello();}
}

到现在,我们已经用Feign实现了简单的伪RPC调用了。

参数绑定

上面的例子没有使用参数,但是我们知道Restful请求是可以支持比较负责的参数传递的,那么使用Feign怎么做到这些呢?

@FeignClient(name = "demo-service")
public interface DemoService {@RequestMapping(value = "hello", method = RequestMethod.GET)String hello();@RequestMapping(value = "hello1", method = RequestMethod.GET)String hello1(@HeaderParam("name") String name);@RequestMapping(value = "hello2", method = RequestMethod.GET)String hello2(@RequestParam("name") String name);@RequestMapping(value = "hello3", method = RequestMethod.POST)String hello3(@RequestBody("user") User user);
}

当然,你需要响应的更改demo-service的服务实现。

集成Hystrix

还有,怎么自动集成Hystrix呢,这个也非常简单,需要新建一个DemoServiceFallback.java

@Component
public class DemoServiceFallback implements DemoService {@Overridepublic String hello() {return "fallback";}
}

然后更改一下DemoService.java的注解配置:

@FeignClient(name = "demo-service", fallback = DemoServiceFallback.class)

为了测试,你可以启动两个demo-service,一个正常运行,一个在hello方法里sleep一段时间(模拟服务超时),然后在请求feign-consumer的接口,会有50%的概率走到DemoServiceFallback的逻辑里,这就完成了自动降级。

这篇关于Spring Cloud之Feign入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046957

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析