Giới thiệu

Trước hết ta cần hiểu microservices nó là gì? Thực thế theo cách hiểu ngữ cảnh nhiều người thì sẽ khác nhau nhưng đại khái là 1 ứng dụng sẽ được tách nhiều thành phần nhỏ khác nhau, mỗi thành phần được xem là 1 service đảm nhận 1 nhiệm vụ nhất định và không ảnh hưởng trực tiếp đến thành phần khác.
*Trong spring bạn có thể tìm hiểu thêm ở đây: https://spring.io/microservices/
mc
flow

Eureka Server

Hiểu nôm na đây là 1 server để quản lý các service con - nếu mỗi service đang được đăng kí quản lý bởi Eureka thì sẽ được nó theo dõi , nếu server không nhận được reponse nào từ serivce con thì service đó sẽ bị gỡ khỏi Eureka một cách tự động.
Dưới đây là ví dụ mẫu file .pom của server :

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.cloud</groupId>  
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-devtools</artifactId>  
        <scope>runtime</scope>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-test</artifactId>  
        <scope>test</scope>  
    </dependency>  
</dependencies>

Tiếp theo, trong file application.properties, chúng ta cần cấu hình như sau:

spring.application.name=eureka-server
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

hoặc file .yml

eureka:
  instance:
    hostname: localhost
  client: 
    registerWithEureka: false
    fetchRegistry: false
server:
  port: 1111   # HTTP (Tomcat) port

Trên kia có 2 biến giá trị false vì ở đây bản thân nó là server rồi nên không cần đăng kí, mặc định sẽ là true nên chúng ta đổi thành false.
Đặc biệt trong hàm main thì cần khai báo anotion @EnableEurekaServer

import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;  

@SpringBootApplication  
@EnableEurekaServer  
public class ServerApplication {  

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

}

Account-Service

Xây dựng 1 service Account chẳng hạn:
Tương tự trong main:

@EnableAutoConfiguration
@EnableDiscoveryClient
@Import(AccountsWebApplication.class)
public class AccountsServer {

    @Autowired
    AccountRepository accountRepository;

    public static void main(String[] args) {
        // Will configure using accounts-server.yml
        System.setProperty("spring.config.name", "accounts-server");

        SpringApplication.run(AccountsServer.class, args);
    }
}

@EnableAutoConfiguration- cấu hình bean tự động của spring
@EnableDiscoveryClient - đăng kí service với server
Cấu hình .yml của service Account ví dụ:

spring:
  application:
     name: accounts-service
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/
server:
  port: 2222   # HTTP (Tomcat) port

Lưu ý port của service với server phải khác nhau nhé!
Tương tự các service khác có thể tạo thêm.

Gateway - Zuul

Nếu chúng ta có nhiều instance của một service, mỗi instance lại sử dụng một port khác nhau. Vậy làm thế nào chúng ta có thể gọi tất cả các service từ browser và phân tán những request đến các instance đó thông qua các cổng khác nhau? Câu trả lời là sử dụng một Gateway.

Một gateway là một entry point đơn trong hệ thống, được dùng để handle các request bằng cách định tuyến chúng đến các service tương ứng. Nó cũng có thể được dùng để xác thực, giám sát và làm nhiều việc khác.

Zuul là gì?

Nó là một proxy, gateway và một lớp trung gian giữa user và các service của bạn. Eureka server đã giải quyết vấn đề đặt tên cho từng service thay vì dùng địa chỉ IP của chúng. Tuy nhiên một service vẫn có thể có nhiều instance và chúng sẽ chạy trên các cổng khác nhau nên nhiệm vụ của Zuul sẽ là:

Map giữa một prefix path (/account/**) và một service (account-service). Nó sử dụng Euraka server để định tuyến các service được request.
Nó giúp cân bằng tải giữa các instance của một service.
Còn gì nữa? Chúng ta có thể dùng nó để filter request, thêm xác thực,…

Các bạn có thể tham khảo thêm tại đây: https://spring.io/blog/2015/07/14/microservices-with-spring/