Khởi động mùa xuân - Hystrix
Hystrix là một thư viện từ Netflix. Hystrix cô lập các điểm truy cập giữa các dịch vụ, dừng các lỗi xếp tầng trên chúng và cung cấp các tùy chọn dự phòng.
Ví dụ: khi bạn đang gọi một ứng dụng của bên thứ 3 , sẽ mất nhiều thời gian hơn để gửi phản hồi. Vì vậy, tại thời điểm đó, điều khiển sẽ chuyển sang phương thức dự phòng và trả về phản hồi tùy chỉnh cho ứng dụng của bạn.
Trong chương này, bạn sẽ xem Cách triển khai Hystrix trong ứng dụng Spring Boot.
Đầu tiên, chúng ta cần thêm phần phụ thuộc Spring Cloud Starter Hystrix vào tệp cấu hình bản dựng của mình.
Người dùng Maven có thể thêm phần phụ thuộc sau vào tệp pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle -
compile('org.springframework.cloud:spring-cloud-starter-hystrix')
Bây giờ, thêm chú thích @EnableHystrix vào tệp lớp ứng dụng Spring Boot chính của bạn. Chú thích @EnableHystrix được sử dụng để kích hoạt các chức năng Hystrix vào ứng dụng Spring Boot của bạn.
Mã tệp lớp ứng dụng Spring Boot chính được cung cấp bên dưới:
package com.tutorialspoint.hystrixapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@SpringBootApplication
@EnableHystrix
public class HystrixappApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixappApplication.class, args);
}
}
Bây giờ, hãy viết một Rest Controller đơn giản để nó trả về Chuỗi sau 3 giây kể từ thời gian được yêu cầu.
@RequestMapping(value = "/")
public String hello() throws InterruptedException {
Thread.sleep(3000);
return "Welcome Hystrix";
}
Bây giờ, thêm lệnh @Hystrix và @HystrixProperty cho API Rest và xác định thời gian chờ theo giá trị mili giây.
@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
Tiếp theo, xác định phương thức dự phòng fallback_hello () nếu yêu cầu mất nhiều thời gian để phản hồi.
private String fallback_hello() {
return "Request fails. It takes long time to response";
}
Tệp lớp Rest Controller hoàn chỉnh chứa các thuộc tính REST API và Hystrix được hiển thị ở đây -
@RequestMapping(value = "/")
@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
public String hello() throws InterruptedException {
Thread.sleep(3000);
return "Welcome Hystrix";
}
private String fallback_hello() {
return "Request fails. It takes long time to response";
}
Trong ví dụ này, API REST được viết trong chính tệp lớp ứng dụng Spring Boot chính.
package com.tutorialspoint.hystrixapp;
import org.springframework.boot.SpringApplication;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@SpringBootApplication
@EnableHystrix
@RestController
public class HystrixappApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixappApplication.class, args);
}
@RequestMapping(value = "/")
@HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
public String hello() throws InterruptedException {
Thread.sleep(3000);
return "Welcome Hystrix";
}
private String fallback_hello() {
return "Request fails. It takes long time to response";
}
}
Tệp cấu hình bản dựng hoàn chỉnh được cung cấp bên dưới.
Maven – pom.xml file
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>hystrixapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hystrixapp</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Gradle – build.gradle
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
ext {
springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-hystrix')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng các lệnh Maven hoặc Gradle sau:
Đối với Maven, sử dụng lệnh như minh họa -
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, sử dụng lệnh như minh họa -
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bây giờ, hãy chạy tệp JAR bằng cách sử dụng lệnh dưới đây:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ, hãy nhấn vào URL http://localhost:8080/từ trình duyệt web của bạn và xem phản hồi Hystrix. API mất 3 giây để phản hồi, nhưng thời gian chờ của Hystrix là 1 giây.