天天看點

Feign 與 HystrixFeign 與 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