1. 程式人生 > >SpringCloud之斷路器Hystrix

SpringCloud之斷路器Hystrix

斷路器Hystrix簡介

由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這個服務就會出現執行緒阻塞,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應
雪崩應對策略:

  • 流量控制:控制的方式有很多種,類似佇列,令牌,漏桶等等。
  • 閘道器限流: 因為Nginx的高效能, 目前一線網際網路公司大量採用Nginx+Lua的閘道器進行流量控制, 由此而來的OpenResty也越來越熱門. 使用OpenResty,其是由Nginx核心
    加很多第三方模組組成,其最大的亮點是預設集成了Lua開發環境,使得Nginx可以作為一個Web Server使用。 藉助於Nginx事件驅動模型非阻塞IO,可以實現高效能的Web應用程式。
    而且OpenResty提供了大量元件如Mysql、Redis、Memcached等等,使在Nginx上開發Web應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua架構,其他公司如淘寶、去哪兒網等。
  • 使用者互動限流:友好的提示,從源端限制流量流入。

基於Netflix的開源框架 Hystrix實現的 框架目標在於通過控制那些訪問遠端系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、執行緒隔離、請求快取、請求合併以及服務監控等強大功能。

image

斷路器Hystrix實踐

一、在Ribbon中使用Hystrix

①pom檔案新增依賴

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

②啟動類上面,添加註解@EnableHystrix

③RibbonService

package com.yj.hystrix.ribbon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@Service
public class RibbonService {

	@Autowired
	private RestTemplate restTemplate;

	@HystrixCommand(fallbackMethod = "ribbonError")
	public String hiRibbon(String name) {
		return restTemplate.getForObject("http://EUREKA-CLIENT/hiEureka?name=" + name, String.class);
	}

	public String ribbonError(String name) {
		return "sorry " + name;
	}
}

二、在Feign中使用斷路器

①Feign是自帶斷路器的,在D版本的Spring Cloud之後,它沒有預設開啟。需要在application.properties配置檔案中配置開啟:

feign.hystrix.enabled=true

②FeignService

package com.yj.hystrix.feign.service;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "eureka-client",fallback = FeignServiceHiHystric.class)
public interface FeignService {
	@RequestMapping(value = "/hiEureka", method = RequestMethod.GET)
	String hiFeign(@RequestParam(value = "name") String name);
}

③FeignServiceHiHystric

package com.yj.hystrix.feign.service;

import org.springframework.stereotype.Component;

@Component
public class FeignServiceHiHystric implements FeignService {
	@Override
	public String hiFeign(String name) {
		 return "sorry "+name;
	}
}

④HystrixController

package com.yj.hystrix.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.yj.hystrix.feign.service.FeignService;
import com.yj.hystrix.ribbon.service.RibbonService;

@RestController
public class HystrixController {

	@Autowired
	private FeignService feignService;
	
	@Autowired
	private RibbonService ribbonService;

	@GetMapping(value = "/hiHystrixFeign")
	public String hiFeign(@RequestParam String name) {
		return feignService.hiFeign(name);
	}
	
	@GetMapping(value = "/hiHystrixRibbon")
	public String hiRibbon(@RequestParam String name) {
		return ribbonService.hiRibbon(name);
	}
}

⑤部署啟動,將Hystrix專案也註冊到Eureka

當eureka-client專案正常啟動時,訪問 http://192.168.37.141:8007/hiHystrixRibbon?name=yj或者http://192.168.37.141:8007/hiHystrixFeign?name=yj,均顯示正常 hi yj ,i am from port:8004

eureka-client專案關閉後,訪問 http://192.168.37.141:8007/hiHystrixRibbon?name=yj或者http://192.168.37.141:8007/hiHystrixFeign?name=yj,顯示 sorry yj,則可以驗證Hystrix生效了