Feign 與 Hystrix

Feign 與 Hystrix

Feign是一個(gè)聲明式的web服務(wù)客戶端,它使得web服務(wù)調(diào)用非常的簡(jiǎn)單,當(dāng)我們使用Feign時(shí),Spring Cloud
整合了Ribbon和Eureka,從而為我們提供了一個(gè)負(fù)載均衡的Http客戶端。

一、Feign的使用

首先我們引入Feign的依賴,由于Feign要通過(guò)Eureka去獲取服務(wù),所以也要引入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啟動(dòng)類上打上@EnableFeignClients注解,使得應(yīng)用可以使用FeignClient,如下:

@SpringBootApplication
@EnableFeignClients
public class Application {

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

}

最后編寫遠(yuǎn)程調(diào)用接口,調(diào)用上一篇中提到的Order服務(wù),如下:

@FeignClient(value = "SERVICE-ORDER")
public interface RemoteOrder {

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

其中,@FeignClient指明這個(gè)接口是一個(gè)FeignClient,value值是我們要從eureka注冊(cè)中心獲取的服務(wù),由于eureka-client-order項(xiàng)目中
spring.application.name是SERVICE-ORDER,所以我們這里寫SERVICE-ORDER。

我們?cè)賹憘€(gè)controller使用Feign去調(diào)用遠(yuǎn)程服務(wù),如下:

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

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

最后,我們修改一下eureka-client-order,啟動(dòng)兩個(gè)服務(wù),兩個(gè)服務(wù)的訂單狀態(tài)不同,如下:

spring:
  profiles: node-1
server:
  port: 8100
order:
  status: '已付款'

---
spring:
  profiles: node-2
server:
  port: 8300
order:
  status: '未支付'

大功告成,我們啟動(dòng)4個(gè)服務(wù):eureka注冊(cè)中心,order-node-1,order-node-2,feign。訪問(wèn)我們的controller,并刷新,顯示結(jié)果如下:

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

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

說(shuō)明feign的負(fù)載均衡已經(jīng)啟用。

二、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類并實(shí)現(xiàn)RemoteOrder接口:

@Service
public class OrderHystrix implements RemoteOrder {
    @Override
    public Order getRemoteOrder() {
        Order order = new Order();
        order.setOrderStatus("熔斷order");
        return order;
    }
}

這樣我們?cè)谡{(diào)用遠(yuǎn)程的/order/detail時(shí),如果發(fā)生超時(shí)或者錯(cuò)誤,就會(huì)調(diào)用getRemoteOrder()方法。
我們可以把eureka-client-order的兩個(gè)服務(wù)都停掉,然后進(jìn)行訪問(wèn),結(jié)果如下:

{"id":123123,"totalPrice":87.98,"orderStatus":"熔斷order"}

說(shuō)明熔斷機(jī)制起作用了。

項(xiàng)目示例地址:https://github.com/liubo-tech/spring-cloud-eureka

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容