Eclipse(STS) 初次搭建Spring Cloud項目之斷路器Hystrix(五)

  1. 在微服務架構中,根據業務來拆分紅一個個的服務,在SpringCloud中用RestTemplate+Ribbon和Feign來實現互相調用。爲了保證其高可用,單個服務一般會集羣部署。
  2. 因爲網絡緣由或者自身的緣由,服務並不能保證100%可用,若是單個服務出現問題,調用這個服務就會出現線程阻塞,此時如有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,致使服務癱瘓。
  3. 服務與服務之間的依賴性,故障會傳播,會對整個微服務系統形成災難性的嚴重後果,這就是服務故障的「雪崩」效應。
  4. 爲了解決這個問題,業界提出了斷路器模型。

1、什麼是斷路器

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls。 -------來自官網java

當底層服務出現故障時會致使連鎖故障。當對特定的服務的調用的不可用達到一個閥值(Hystric 是5秒20次) 斷路器將會被打開。斷路打開後,可用避免連鎖故障,fallback方法能夠直接返回一個固定值。

2、這裏咱們直接說Feign集成Hystrix

Feign自己就集成了Hystrix,只是默認爲關閉狀態,咱們須要在配置文件中將其打開

feign:
  hystrix:
    enabled: true
複製代碼

下面咱們來看看代碼如何寫,其實很簡單,使用上一篇文章中的cloud-demo-feign項目,application.yml內容以下:

server:
 port: 8811 # 你的端口
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
      defaultZone: http://admin:admin@server1:8761/eureka/,http://admin:admin@server2:8762/eureka/
feign:
  hystrix:
    enabled: true
service-eureka-client:
  ribbon:
     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#com.netflix.loadbalancer.RandomRule #配置規則 隨機
#com.netflix.loadbalancer.RoundRobinRule #配置規則 輪詢
#com.netflix.loadbalancer.RetryRule #配置規則 重試
#com.netflix.loadbalancer.WeightedResponseTimeRule #配置規則 響應時間權重
#com.netflix.loadbalancer.BestAvailableRule #配置規則 最空閒鏈接策略
複製代碼

項目結構以下:

新建feign斷路器接口SchedualClientNameWithFallbackFactory和斷路器的實現類HystrixClientFallbackFactory

package com.hewl.hystrix;

import com.hewl.feign.SchedualCilentName;

public interface SchedualClientNameWithFallbackFactory extends SchedualCilentName {

}

複製代碼
package com.hewl.hystrix;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.hewl.feign.SchedualCilentName;

import feign.hystrix.FallbackFactory;

@Component
public class HystrixClientFallbackFactory implements FallbackFactory<SchedualCilentName> {
	private static final Logger log = LoggerFactory.getLogger(HystrixClientFallbackFactory.class);

	@Override
	public SchedualCilentName create(Throwable cause) {
		// TODO Auto-generated method stub
		return new SchedualClientNameWithFallbackFactory() {
			
			@Override
			public String testFromClientOne(String name) {
				log.error("fallback ,the result is : " + cause);
				// TODO Auto-generated method stub
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("ID", -1L);
				map.put("NAME","");
				return map.toString();
			}
		};
	}

}

複製代碼

SchedualCilentName類作以下修改,feignclient註解添加fallbackfactory鍵值對

package com.hewl.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.hewl.hystrix.HystrixClientFallbackFactory;

@FeignClient(value="service-eureka-client",fallbackFactory = HystrixClientFallbackFactory.class)
public interface SchedualCilentName {
	
	@GetMapping(value = "/test")
	public String testFromClientOne(@RequestParam("name") String name);

}
複製代碼

下面啓動項目測試

  1. 啓動eureka-server服務
  2. 啓動eureka-client服務
  3. 啓動feign服務

訪問http://localhost:8811/test

熔斷成功!!!
相關文章
相關標籤/搜索