springcloud費話之斷路器(hystrix in feign)

目錄:html

springcloud費話之Eureka基礎前端

springcloud費話之Eureka集羣java

springcloud費話之Eureka服務訪問(restTemplate)web

springcloud費話之Eureka接口調用(feign)spring

springcloud費話之斷路器(hystrix in feign)後端

springcloud費話之配置中心基礎(SVN)服務器

springcloud費話之配置中心客戶端(SVN)app

 

使用eureka服務發現實現服務器之間的http訪問(feign)並添加斷路器hystrix負載均衡

 

斷路器,是springcloud中的一種熔斷機制的實現方式post

熔斷機制,是達到了某個異常之後,後續判斷不進行,直接否認的一種方式,相似於&&或者||的熔斷的感受

由於服務器之間的調用,判斷錯誤鏈,以及出現問題之後的回調,時間可能會很長,若是不盡快阻止,

極可能致使不少請求都等待幾十秒的超時而形成服務器阻塞,進而形成服務器崩潰

所以熔斷機制十分重要

在springcloud的熔斷機制,叫作Spring Cloud Circuit Breaker

具體使用的是hystrix斷路器

具體使用方式和流程以下

 

1.依賴

 

在springcloud官方網站中找到斷路器()的依賴,以下圖,並導入pom

 

2.在啓動類添加註解

 

在啓動類添加註解@EnableHystrix,添加後代碼以下:

package com.lyh.lyh_eureka_server;

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrix public class EurekaClientRun { public static void main(String[] args) { SpringApplication.run(EurekaClientRun.class, args); } }

 

3.在請求方法上添加熔斷註解,並指定熔斷的方法,具體代碼以下:

 

熔斷註解@HystrixCommand(fallbackMethod = "errorBreak"),其中的fallbackMethod爲要調用的熔斷的方法

package com.lyh.lyh_eureka_server.controller;

import java.net.URI; import java.net.URISyntaxException; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import com.lyh.lyh_eureka_server.Interface.FeignService; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.ribbon.proxy.annotation.Hystrix; @RestController @EnableEurekaClient public class TestController { @Autowired private EurekaClient eurekaClient; @Resource private FeignService feignService; @RequestMapping("/getServerInfo") public Object getServerInfo() { // 經過eurekaClient訪問服務器獲取某個命名的集羣。 // getNextServerFromEureka的第一個參數是服務器名稱,可重複 // 由於得到的是下一個,因此是負載均衡的 InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false); System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort()); return nextServerFromEureka; } // 觸發的接口 @RequestMapping("/getInfoFromClient") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfoFromClient() throws URISyntaxException { InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false); System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort()); RestTemplate restTemplate = new RestTemplate(); String u = "http://" + nextServerFromEureka.getIPAddr() + ":" + nextServerFromEureka.getPort() + "/getInfo"; URI uri = new URI(u); String obj = restTemplate.getForObject(uri, String.class); System.out.println(obj.toString()); return obj; } // 接口訪問的服務 添加熔斷方法errorBreak @RequestMapping("/getInfo") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfo() { return "I am info from client 9020"; } // 觸發的接口 by feign 添加熔斷方法errorBreak @RequestMapping("/getInfoFromClientByFeign") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfoFromClientByFeign() throws Exception { // 測試熔斷效果 // System.out.println(1/0); String obj = feignService.getInfo(); System.out.println(obj.toString()); return obj; } //hystrix熔斷調用的方法 public String errorBreak() { return "this is error break by hystrix"; } }

 

4.測試

 

後端並無報錯,前端返回了該熔斷效果

相關文章
相關標籤/搜索