SpringCloud 進階之Hystrix(斷路器)


1. Hystrix 斷路器

  • Hystrix是一個用於處理分布式系統的延遲和容錯的開源庫,在分布式系統里,許多依賴不可避免的會調用失敗,
    比如超時,異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分
    布式系統的彈性;
  • "斷路器"本身是一種開關裝置,當某個服務單元發生故障之后,通過斷路器的故障監控(類似熔斷保險絲),向調用方
    返回一個符合預期的,可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就
    保證了服務調用方的線程不會被長時間,不必要地占用,從而避免了故障在分布式系統中的蔓延,乃至雪崩。

1.1 服務熔斷

  • 熔斷機制是應對雪崩效應的一種微服務鏈路保護機制;
  • 當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回"錯誤"
    的響應信息;當檢測到該節點微服務調用正常后恢復調用鏈路;

新建microservicecloud-provider-dept-hystrix-8001

// 參考 microservicecloud-provider-dept-8001

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


// application.yml
eureka:
  client: # 客戶端注冊進eureka服務列表內
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
  instance:
    instance-id: microservicecloud-dept8001-hystrix # 自定義hystrix相關的服務名稱信息
    prefer-ip-address: true  # 訪問路徑可以顯示IP地址


// 修改DeptController
@RestController
public class DeptController {

	@Autowired
	private DeptService deptService;

	@Autowired
	private DiscoveryClient client;

	@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    // 一旦調用服務方法失敗並拋出錯誤信息后,會自動調用@HystrixCommand標注好的fallbackMethod調用類中的指定方法
    @HystrixCommand(fallbackMethod="processHystrix_Get")  
	public Dept get(@PathVariable("id") Long id) {
        Dept dept = this.deptService.get(id);
		if(null == dept) {
			throw new RuntimeException("該ID:"+id+"沒有對應的信息");
		}
		return dept;
	}

    public Dept processHystrix_Get(@PathVariable("id") Long id) {
		return new Dept().setDeptno(id).setDname("該ID:"+id+"沒有對應的信息,null -- @HystrixCommand")
				.setDb_source("no this database in MySQL");
	}
}


// 修改主啟動類DeptProvider8001_Hystrix_App並添加新注解@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient	// 本服務啟動后,自動注冊進eureka服務中
@EnableDiscoveryClient // 服務發現
@EnableCircuitBreaker // 對Hystrix熔斷機制的支持
public class DeptProvider8001_Hystrix_App {

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

// 測試訪問:
// http://localhost:8082/consumer/dept/get/112

1.2 服務降級

  • 服務降級:整體資源快不夠了,忍痛將某些服務先關掉,待渡過難關,再開啟回來;
  • 服務降級處理是在客戶端實現完成的,與服務端沒有關系;
  • 當某個服務熔斷之后,服務器將不再被調用,此時客戶端可以自己准備一個本地的fallback回調,返回一個缺省值;
// 修改microservicecloud-api工程
// 根據已有的DeptClientService接口,新建一個實現了FallbackFactory接口的類DeptClientServiceFallbackFactory
@Component  // 不要忘記添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {

	@Override
	public DeptClientService create(Throwable arg0) {

		return new DeptClientService() {

			@Override
			public Dept get(long id) {
				return new Dept().setDeptno(id).setDname("該ID:"+id+"沒有對應的信息,Consumer客戶端提供的降級信息,此刻服務Provider已經關閉")
						.setDb_source("no this database in MySQL");
			}

			@Override
			public List<Dept> list() {

				return null;
			}

			@Override
			public boolean add(Dept dept) {

				return false;
			}
		};
	}
}

// 修改microservicecloud-api工程, DeptClientService接口
// 在注解@FeignClient中添加 fallbackFactory 屬性值
@FeignClient(value="MICROSERVICECLOUD-DEPT",
			fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

	@RequestMapping(value="/dept/get/{id}", method= RequestMethod.GET)
	public Dept get(@PathVariable("id") long id);

	@RequestMapping(value="/dept/list", method= RequestMethod.GET)
	public List<Dept> list();

	@RequestMapping(value="/dept/add", method= RequestMethod.POST)
	public boolean add(Dept dept);
}

// mvn clean
// mvn install


// 修改microservicecloud-consumer-dept-feign 工程
// application.yml
feign:
  hystrix:
    enabled: true

// 測試訪問:
// http://localhost:8082/consumer/dept/get/1
// 然后手動關閉工程:microservicecloud-provider-dept-8001

1.3 服務監控(hystrixDashboard)

新建工程microservicecloud-consumer-hystrix-dashboard

// pom.xml
<!-- hystrix和hystrix-dashboard 相關 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>


// application.yml
server:
  port: 9001


// 主啟動類:
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App {

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


// 所有Provider微服務提供類(8001/8002/8003)都需要提供監控依賴配置
// (8001/8002/8003)pom.xml
<!-- actuator 監控信息完善 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


// 啟動相關工程
// microservicecloud-consumer-hystrix-dashboard   // 訪問: http://localhost:9001/hystrix
// 3個Eureka集群
// microservicecloud-provider-dept-hystrix-8001
    // 訪問: http://localhost:8001/dept/get/1
    // 訪問: http://localhost:8001/hystrix.stream

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM