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"}

 

说明熔断机制起作用了。

项目示例地址:https://github.com/liubo-tech/spring-cloud-eureka

posted @   牛初九  阅读(560)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示