Feign 与 Hystrix
Feign 与 Hystrix
Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud 整合了Ribbon和Eureka,从而为我们提供了一个负载均衡的Http客户端。
一、Feign的使用
首先我们引入Feign的依赖,由于Feign要通过Eureka去获取服务,所以也要引入Eureka-client:
1 2 3 4 5 6 7 8 9 10 | <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> |
然后再Spring Boot启动类上打上@EnableFeignClients
注解,使得应用可以使用FeignClient,如下:
1 2 3 4 5 6 7 8 9 | @SpringBootApplication @EnableFeignClients public class Application { public static void main(String[] args) { SpringApplication.run(Application. class , args); } } |
最后编写远程调用接口,调用上一篇中提到的Order服务,如下:
1 2 3 4 5 6 | @FeignClient (value = "SERVICE-ORDER" ) public interface RemoteOrder { @RequestMapping ( "/order/detail" ) Order getRemoteOrder(); } |
其中,@FeignClient
指明这个接口是一个FeignClient,value值是我们要从eureka注册中心获取的服务,由于eureka-client-order项目中 的spring.application.name
是SERVICE-ORDER,所以我们这里写SERVICE-ORDER。
我们再写个controller使用Feign去调用远程服务,如下:
1 2 3 4 5 6 7 8 9 10 11 | @RestController @RequestMapping ( "feign" ) public class FeignController { @Autowired private RemoteOrder remoteOrder; @RequestMapping ( "order" ) public Order feignOrder(){ return remoteOrder.getRemoteOrder(); } } |
最后,我们修改一下eureka-client-order,启动两个服务,两个服务的订单状态不同,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | spring: profiles: node- 1 server: port: 8100 order: status: '已付款' --- spring: profiles: node- 2 server: port: 8300 order: status: '未支付' |
大功告成,我们启动4个服务:eureka注册中心,order-node-1,order-node-2,feign。访问我们的controller,并刷新,显示结果如下:
1 2 3 | { "id" : 123123 , "totalPrice" : 87.98 , "orderStatus" : "已付款" } { "id" : 123123 , "totalPrice" : 87.98 , "orderStatus" : "未支付" } |
说明feign的负载均衡已经启用。
二、Hystrix熔断
首先我们引入Hystrix的依赖:
1 2 3 4 | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> |
并启用Feign的Hystrix,
1 2 3 | feign: hystrix: enabled: true |
Feign封装了所有方法的熔断方法,Hystrix支持fallback的概念,在FeignClien中指定即可
1 2 3 4 5 6 | @FeignClient (value = "SERVICE-ORDER" ,fallback = OrderHystrix. class ) public interface RemoteOrder { @RequestMapping ( "/order/detail" ) Order getRemoteOrder(); } |
指定fallback的类为OrderHystrix,我们新建OrderHystrix类并实现RemoteOrder接口:
1 2 3 4 5 6 7 8 9 | @Service public class OrderHystrix implements RemoteOrder { @Override public Order getRemoteOrder() { Order order = new Order(); order.setOrderStatus( "熔断order" ); return order; } } |
这样我们在调用远程的/order/detail时,如果发生超时或者错误,就会调用getRemoteOrder()
方法。 我们可以把eureka-client-order的两个服务都停掉,然后进行访问,结果如下:
{"id":123123,"totalPrice":87.98,"orderStatus":"熔断order"}
说明熔断机制起作用了。
*如果您觉得对您有帮助,请关注+推荐
*您的支持就是我继续下去的动力
*承接项目+V:ronaldoliubo
***************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端