Học Microservice với Spring Boot - ToiHieuRoi.com

Học Microservice với Spring Boot – [Phần 1]

Posted by

Hướng dẫn này sẽ giúp bạn học những điều cơ bản về microservice và microservice architecture. Chúng ta cũng sẽ bắt đầu xem xem cách cài đặt cơ bản một microservice với Spring Boot.

Chúng ta sẽ tạo một cặp microservice và làm cho chúng có thể giao tiếp với nhau bằng cách sử dụng Eureka Naming Server và Ribbon cho Client Side Load Balancing.

Loạt bài hướng dẫn này bao gồm 5 phần như sau:

Trong phần 1 này, chúng ta sẽ nhìn qua tổng quan của microservice và hiểu được cách để tạo ra những microservice với Spring Boot và Spring Cloud.

Mục tiêu

Mục tiêu của chúng là là trả lời được những câu hỏi dưới đây:

  • Monolith là gì?
  • Microservice là gì?
  • Những thử thách của Microservice?
  • Spring Boot & Spring Cloud làm cho việc phát triển Microservice trở nên dễ dàng như thế nào?
  • Làm thế nào để cài đặt Client Side Load Balancing với Ribbon?
  • Làm thế nào để cài đặt Naming Server (Eureka Naming Server)?
  • Làm thế nào để kết nối các microservice với Naming Server và Ribbon?

Bức tranh tổng quát về ví dụ với Microservice

Trong series này, chúng ta sẽ tạo ra 2 microservice là:

  • Forex Service – gọi tắt là FS
  • Currency Conversion Service – gọi tắt là CCS

Đừng lo lắng nếu có một vài thứ bạn không hiểu. Ý tưởng này sẽ đưa ra bức tranh tổng quát về microservice trước khi chúng ta bắt tay vào tạo ra microservice từng bước một.

Forex Service

Forex Service (FS) là một Service Provider. Nó cung cấp giá trị quy đổi tiền tệ cho các loại tiền tệ khác nhau. Hãy giả sử nó trao đổi với Forex Exchange và cung cấp các giá trị quy đổi hiện tại giữa các loại tiền tệ.

Một ví dụ về request và response:

Request

Response

Request trên là giá trị quy đổi từ EUR thành INR. Trong response thì conversionMultipe là 75.

Chúng ta sẽ nói về port sau nhé.

Currency Conversion Service

Currency Conversion Service (CCS) có thể chuyển đổi một nhóm tiền tệ sang một loại tiền tệ khác. Nó sử dụng Forex Service (FS) để lấy các giá trị quy đổi. CSS là một Service Consumer.

Ví dụ về request và response:

Request

Response

Request trên thực hiện quy đổi 10000 EUR thành INR. Giá trị quy đổi totalCalculatedAmount là 750000 INR.

Sơ đồ dưới đây mô tả cách giao tiếp giữa CSS và FS.

Học Microservice với Spring Boot - ToiHieuRoi.com

Eureka Naming Server và Ribbon

Dựa trên số lượng truy cập, ta có thể tạo ra và chạy nhiều instance của CSS và FS:

Học Microservice với Spring Boot - ToiHieuRoi.com

Và số lượng instance của mỗi service có thể thay đổi theo thời gian. Hình dưới đây cho thấy một trường hợp cụ thể mà có 5 instances của FS được chạy.

Học Microservice với Spring Boot - ToiHieuRoi.com

Trong tình huống trên thì tải trọng nên được phân bố đồng đều đến 5 instances CSS như dưới đây:

Học Microservice với Spring Boot - ToiHieuRoi.com

Trong loạt bài này, chúng ta sẽ sử dụng Ribbon cho Load Balancing và Eureka Naming Server để đăng ký tất cả microservice.

Monolith Application là gì?

Bạn đã từng làm việc trong một project:

  • Release (trên production) vài tháng một lần
  • Có một loạt (rất nhiều) các tính năng và chức năng
  • Có team nhiều hơn 50 members
  • Debug là một thử thách lớn
  • Áp dụng công nghệ mới và quy trình mới là gần như không thể

Đấy là một vài đặc điểm của Monolith Application.

Các Monolith Application thường rất lớn – nhiều hơn 100.000 dòng code. Một số trường hợp lên đến vài triệu dòng code.

Đặc trưng của Monolith Application:

  • Kích thước ứng dụng lớn
  • Thời gian release dài
  • Các team lớn (nhiều member)

Các thử thách đi kèm:

  • Khả năng mở rộng
  • Tương thích với công nghệ mới
  • Áp dụng quy trình phát triển mới
  • Áp dụng Automation test
  • Thích nghi với các bài học phát triển hiện đại
  • Tương thích với việc mở rộng thiết bị

Microservices là gì?

Microservice architecture đã phát triển như một giải pháp mở rộng và đổi mới đối với Monolith architecture.

Dưới đây là một số định nghĩa được đưa ra cho Microservice (các bạn xem bản gốc nhé):

Small autonomous services that work together – Sam Newman

Developing a single application as a suite of small services each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies – James Lewis and Martin Fowler

Mặc dù không có một định nghĩa duy nhất nào được chấp nhận khi nói về microservice, với tôi, một vài đặc trưng của nó như sau:

  • REST – Xây dựng xung quanh tài nguyên RESTful. Sự giao tiếp có thể là HTTP hoặc event based.
  • Các đơn vị có thể lựa chọn triển khai khá nhỏ – giới hạn về phạm vi của đơn vị
  • Cloud Enabled – Dynamic Scaling

Microservice Architecture nhìn như thế nào?

Sơ đồ dưới đây là một ví dụ về Monolith Application, một application cho tất cả mọi thứ.

Học Microservice với Spring Boot - ToiHieuRoi.com

Và sơ đồ dưới đây mô tả mô hình về một ứng dụng tương tự ví dụ trên sử dụng Microservice Architecture:

Học Microservice với Spring Boot - ToiHieuRoi.com

Microservice Architectures bao gồm một số thành phần nhỏ được thiết kế tốt, các thành phần tương tác với nhau bằng messages.

Học Microservice với Spring Boot - ToiHieuRoi.com

Ưu điểm của Microservice

  • Việc thích ứng với công nghệ và quy trình mới trở nên dễ dàng hơn. Chúng ta có thể thử áp dụng những công nghệ mới với những service mới được tạo ra.
  • Thời gian release được rút ngắn lại
  • Có thể mở rộng với Cloud

Những thử thách với Microservice Architecture

Trong khi việc phát triển một vài thành phần nhỏ trở nên dễ dàng hơn, bên cạnh đó có một số thử thách phức tạp liên quan đến Microservice đang tồn tại:

  • Cần phải thiết lập nhanh: Chúng ta không thể tốn một tháng để thiết lập cho mỗi microservice. Chúng ta cần phải tạo microservice thật nhanh.
  • Tự động hoá: Bằng việc thay thế Monolith Application bằng một số các thành phần nhỏ (microservice) thì chúng ta cần phải tự động hoá tất cả mọi thứ: builds, deploys, monitorings, …
  • Tầm nhìn: Chúng ta sẽ có một số các thành phần nhỏ, thậm chí lên tới 100 hay 1000 thành phần. Vì vậy, ta cần phải kiểm soát và xác định vấn đề của chúng một cách tự động. Chúng ta nên hiển thị bao quát tất cả các thành phần để có một tầm nhìn tốt.
  • Giới hạn phạm vi: giới hạn phạm vi của microservice không phải là việc dễ. Khởi đầu với Domain Driven Design là một sự lựa chọn tốt. Chúng ta phải hiểu về giới hạn phát triển của microservice trong một khoảng thời gian và phải đảm bảo rằng giới hạn phát triển của microservice được đưa ra.
  • Quản lý cấu hình: Chúng ta cần maintain cấu hình của nhiều thành phần trong các môi trường khác nhau, vì vậy chúng ta sẽ cần một giải pháp cấu hình để xử lý vấn đề này.
  • Mở rộng hoặc thu hẹp quy mô linh động (dynamic scale up and down): Lợi thế của microservice chỉ đem lại giá trị nếu ứng dụng của chúng ta có thể mở rộng hoặc thu hẹp quy mô một cách linh động trong Cloud.
  • Khả năng chịu lỗi: nếu một microservice ở cuối cùng của chuỗi cuộc gọi thất bại, nó có thể ảnh hưởng đến tất cả những microservice khác. Microservice cần có khả năng chịu lỗi khi thiết kế.
  • Khả năng debug: Khi xảy ra một sự cố cần điều tra, chúng ta có thể cần xem xét trong nhiều service khác nhau của các thành phần khác nhau. Tập trung Log và Dashboard là điều cần thiết để việc debug dễ dàng hơn.
  • Tính nhất quán: Chúng ta không có một loạt các tool để giải quyết vấn đề này, thúc đẩy phát triển mới là điều quan trọng. Chúng ta nên có các hệ quản trị khác nhau để quản trị xung quanh các ngôn ngữ, nền tảng, công nghệ và các công cụ được sử dụng cho việc phát triển/triển khai/kiểm soát các microservice để đảm bảo tính nhất quán.

Giải pháp cho các thách thức với Microservice Architectures

Spring Boot

Sẵn sàng để xây dựng sản phẩm một cách nhanh chóng

Cung cấp tính năng non-functional:

  • embedded servers (dễ dàng triển khai với containers)
  • metrics (monitoring)
  • health checks (monitoring)
  • externalized configuration

Spring Cloud

Spring Cloud cung cấp giải pháp để cloud hoá microservice của chúng ta. Nó là giải pháp Cloud mã nguồn mở hàng đầu từ Netflix (Netflix OSS).

Những điều quan trọng từ Spring Cloud Modules

Dynamic Scale Up and Down, sử dụng tập hợp:

  • Naming Server (Eureka)
  • Ribbon (Client Side Load Balancing)
  • Feign (Easier REST Clients)

Hiển thị và Kiểm soát với:

  • Zipkin Distributed Tracing
  • Netflix API Gateway

Quản lý cấu hình với:

  • Spring Cloud Config Server

Khả năng chịu tải với:

  • Hystrix

Loạt bài về Microservice

Trong loạt bài này, chúng ta sẽ tạo ra 2 microservice:

  • Forex Service – Viết tắt là FS
  • Currency Conversion Service – Viết tắt là CCS

Sơ đồ dưới đây mô tả sự giao tiếp giữa CSS và FS. Chúng ta sẽ thiết lập sự giao tiếp giữa hai thành phần này.

Học Microservice với Spring Boot - ToiHieuRoi.com

Chúng ta sẽ cần khả năng linh động scale up và scale down số lượng instance của mỗi service trên.

Học Microservice với Spring Boot - ToiHieuRoi.com

Và số lượng instance của mỗi service có thể thay đổi theo thời gian. Sơ đồ dưới đây cho thấy một trường hợp cụ thể trong đó FS có 5 instance.

Học Microservice với Spring Boot - ToiHieuRoi.com

Cài đặt giải pháp cho dynamic scale up and down cần trả lời được hai câu hỏi dưới đây:

  • Làm thế nào Currency Conversion Service (CCS) biết có bao nhiêu instance của Forex Service (FS) đang active?
  • Làm thế nào Currency Conversion Service (CCS) chia tải giữa các instance của Forex Service (FS) đang active?

Bởi vì chúng ta muốn việc này trở nên linh hoạt, thế nên ta không thể hardcode url FS trong CSS. Đó là lý do tại sao chúng ta sẽ sử dụng Naming Server.

Tất cả instance của CSS và FS sẽ đăng ký với Eureka Naming Server. Khi FS cần phải gọi CSS, nó sẽ hỏi Eureka Naming Server những instance nào đang active. Chúng ta sẽ sử dụng Ribbon để làm Load Balancing cho Client side giữa những instance của FS.

Dưới đây là sequence diagram ở mức high level nhằm giải thích điều gì sẽ xảy ra khi một request từ CSS tới FS.

Học Microservice với Spring Boot - ToiHieuRoi.com

Dưới đây là nội dung trong những bài tiếp:

  • Tạo FS – Forex Microservice – Chúng ta sẽ tạo một rest service đơn giản dựa trên Spring Boot Starter Web và Spring Boot Started JPA. Bên cạnh đó ta sẽ sử dụng Hibernate và kết nối đến H2 database.
  • Tạo CCS – Currency Conversion Service – Chúng ta sẽ tạo một rest service đơn giản sử dụng Feign để gọi FS.
  • Sử dụng Ribbon cho Load Balancing
  • Cài đặt Eureka Naming Service và kết nối FS và CCS qua Eureka.

Nguồn: http://www.springboottutorial.com/creating-microservices-with-spring-boot-part-1-getting-started

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *