Tìm hiểu về Hystrix của Spring Cloud Netflix

Trong một hệ thống Microservice, việc đảm bảo các service luôn available là một điều quan trọng giúp cho ứng dụng của chúng ta có thể hoạt động ổn định. Chúng ta có thể sử dụng load balancer để thực hiện điều này, thế nhưng không ai có thể chắc chắn việc sử dụng load balancer có thể đảm bảo 100% các service luôn available được. Chúng ta cần có một cơ chế để khi gặp bất cứ vấn đề gì, ví dụ như service mà chúng ta cần gọi không response hay response vượt quá thời gian timeout thì ứng dụng của chúng ta vẫn có cách để chạy với giá trị response mặc định từ service đó. Nếu các bạn đang muốn hiện thực ý tưởng này thì có thể sử dụng Hystrix từ Netflix OSS hoặc một wrapper của nó từ Spring Cloud Netflix. Cụ thể như thế nào? Trong bài viết này, mình sẽ trình bày với các bạn các bước để sử dụng Hystrix từ Spring Cloud Netflix các bạn nhé!

Để làm ví dụ cho bài viết này, mình sẽ sử dụng service “Eureka Client Example” mà mình đã tạo trong bài viết này về Eureka Client với một request URL “/hello” trả về dòng text “Hello !!!” mà mình đã thêm trong bài viết này. Mặc định service này sẽ cố gắng tìm Eureka Server để đăng ký nên các bạn sẽ thấy nhiều error xuất hiện. Không sao cả, các bạn có thể ignore những error đó đi.

Bây giờ, mình sẽ tạo mới một Spring Boot project với một request URL gọi tới request “/hello” của service “Eureka Client Example” và sử dụng Hystrix để trong trường hợp service “Eureka Client Example” không available thì request này cũng sẽ trả về kết quả cho người dùng.

Project của mình như sau:

Tìm hiểu về Hystrix của Spring Cloud Netflix

Kết quả:

Tìm hiểu về Hystrix của Spring Cloud NetflixMình sẽ thêm mới một controller gọi tới request “/hello” của service “Eureka Client Example” với đối tượng RestTemplate như sau:

Vì service “Eureka Client Example” đã chạy trên port 8080 rồi nên mình sẽ config để ứng dụng này của chúng ta run trên port 8180 bằng cách cấu hình property server.port trong tập tin application.properties như sau:

Chạy cả 2 ứng dụng và kết quả khi chúng ta request tới URL http://localhost:8180/call-hello sẽ như sau:

Tìm hiểu về Hystrix của Spring Cloud Netflix

Sẽ như thế nào nếu các bạn stop service “Eureka Client Example” đi!

Kết quả:

Tìm hiểu về Hystrix của Spring Cloud Netflix

Các bạn thấy đó, một error sẽ xảy ra khi service “Eureka Client Example” bị stop đi. Các bạn hãy tưởng tượng sẽ như thế nào nếu đây là một service trong một hệ thống Microservice?

Để giải quyết vấn đề này với Hystrix của Spring Cloud Netflix, các bạn cần làm những bước sau:

Đầu tiên, các bạn cần khai báo annotation @EnableCircuitBreaker của Hystrix vào trong class main của ứng dụng như sau:

Có thể có bạn sẽ ngạc nhiên với tên gọi Circuit Breaker của annotation này, mình xin nói với các bạn là: với những vấn đề mà chúng ta discuss ở trên, solution để giải quyết chúng được gọi là Circuit Breaker! Tên gọi của annotation @EnableCircuitBreaker bắt nguồn từ đó.

Circuit Breaker sẽ giúp chúng ta trả về giá trị mặc định nếu chúng ta không thể gọi tới service mà chúng ta cần, và nó cũng sẽ tự động kết nối lại nếu service mà chúng ta cần available lại.

Việc tiếp theo mà chúng ta cần làm là khai báo thêm annotation @HystrixCommand bên trên method mà chúng ta đang sử dụng để gọi tới service mà chúng ta cần như sau:

Như các bạn thấy annotation @HystrixCommand có một attribute tên là fallbackMethod với giá trị là tên method sẽ trả về giá trị mặc định khi ứng dụng của chúng ta không thể connect tới service mà chúng ta cần.

Nếu bây giờ các bạn restart lại ứng dụng của chúng ta rồi request tới URL http://localhost:8180/call-hello, các bạn sẽ thấy giá trị mặc định được trả về như sau:

Tìm hiểu về Hystrix của Spring Cloud Netflix

Nếu giờ các bạn restart lại service “Eureka Client Example” rồi request lại URL http://localhost:8180/call-hello, các bạn sẽ thấy dòng chữ “Hello !!!” được trả về.

Rất hay phải không các bạn?

Đánh giá bài viết
Chia sẽ bài viết này ...Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Add Comment