目錄:html
springcloud費話之Eureka服務訪問(restTemplate)web
springcloud費話之Eureka接口調用(feign)spring
springcloud費話之斷路器(hystrix in feign)後端
使用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.測試
後端並無報錯,前端返回了該熔斷效果