专栏首页JAVA同学会Feign 与 Hystrix

Feign 与 Hystrix

Feign 与 Hystrix 

Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud 整合了Ribbon和Eureka,从而为我们提供了一个负载均衡的Http客户端。

一、Feign的使用

首先我们引入Feign的依赖,由于Feign要通过Eureka去获取服务,所以也要引入Eureka-client:

<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,如下:

@SpringBootApplication
@EnableFeignClients
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

最后编写远程调用接口,调用上一篇中提到的Order服务,如下:

@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去调用远程服务,如下:

@RestController
@RequestMapping("feign")
public class FeignController {
    @Autowired
    private RemoteOrder remoteOrder;

    @RequestMapping("order")
    public Order feignOrder(){
        return remoteOrder.getRemoteOrder();
    }
}

最后,我们修改一下eureka-client-order,启动两个服务,两个服务的订单状态不同,如下:

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,并刷新,显示结果如下:

{"id":123123,"totalPrice":87.98,"orderStatus":"已付款"}

{"id":123123,"totalPrice":87.98,"orderStatus":"未支付"}

说明feign的负载均衡已经启用。

二、Hystrix熔断

首先我们引入Hystrix的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

并启用Feign的Hystrix,

feign:
  hystrix:
    enabled: true

Feign封装了所有方法的熔断方法,Hystrix支持fallback的概念,在FeignClien中指定即可

@FeignClient(value = "SERVICE-ORDER",fallback = OrderHystrix.class)
public interface RemoteOrder {

    @RequestMapping("/order/detail")
    Order getRemoteOrder();
}

指定fallback的类为OrderHystrix,我们新建OrderHystrix类并实现RemoteOrder接口:

@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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Feign 与 Hystrix

    Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud

    小忽悠
  • mysql如何执行关联查询与优化

    在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么my...

    小忽悠
  • Kafka 简介

    在Kafka中,客户端和服务器之间的通信是通过一种简单的,高性能的,语言不可知的TCP协议完成的。

    小忽悠
  • Feign 与 Hystrix

    Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud

    小忽悠
  • 1 SpringBoot 使用sharding jdbc进行分库分表

    分库分表在数据量大的系统中比较常用,解决方案有Cobar,TDDL等,这次主要是拿当当网开源的Sharding-JDBC来做个小例子。 它的github地址...

    天涯泪小武
  • Infor ERP LN中销售订单状态说明

    昨天讲了采购订单的状态涉及到的订单操作程序,今天继续介绍销售订单(行)的状态,通过状态其实就可以了解了销售订单的标准操作程序(流程),详细记得操作程序(流程)将...

    崔文远TroyCui
  • RabbitMQ使用多路由,多队列来破除流控

    流控机制是我们在使用RabbitMQ最头疼的问题,一旦并发激增时,消费者消费队列消息就像滴水一样慢。

    算法之名
  • 程序员过关斩将--论商品促销代码的优雅性

    据我所知,几乎所有的互联网公司都带有和电商有关的项目,而且在大多数公司里面还是举足轻重的重头戏,比如京东,淘宝。既然有电商项目,必然会涉及到商品...

    架构师修行之路
  • 01-GAN公式简明原理之铁甲小宝篇

    声明:以下内容纯为形成笔记过程中,增加趣味性,无他。若有相关利益冲突/侵权,指出删。不当处,亦欢迎指正。

    公众号机器学习与生成对抗网络
  • 使用Guava实现限流器

    在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流通过限制请求的流量以达到保护系统的目的。

    林老师带你学编程

扫码关注云+社区

领取腾讯云代金券