[Spring clound] Bắt đầu với eureka server và dùng zuul làm service gateway

Microservices cái này hiểu theo cách cơ bản là chia module thành cách service nhỏ để thuận tiện cho việc vận hành, nâng cấp, bảo trì,....
Spring clound là một bộ thư viện nằm trong họ nhà spring giúp chúng ta xây dựng các ứng dụng microservices nó đơn giản hơn
Eureka server nó là Service discovery cho phép các service khi khởi chạy sẽ tự mình đăng ký thông tin lên đây. Khi service đăng ký thông tin lên đây thì từ service này gọi đến service kia sẽ gọi bằng tên của service chư không cần gọi qua ip với port của service kia nữa :grin:
Zuul Thế này nhé, mọi request đi vào hệ thống của mình đều phải qua cái thằng này, rồi nó mới đi tới instance thích hợp.

Cơ bản có thế thôi :pensive: giờ mình bắt đầu nhé.

Tạo eureka server

  • Đầy tiên thêm thư viên này này
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • File Application sẽ như này

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
    }
    
  • Mặc đình thì eureka sẽ coi chính nó là một client
    alt text
    để bỏ đi thì trong application.properties như bên dưới

  spring.application.name=eureka-server
  server.port=8761
  # hai dòng bên dưới sẽ không không coi eureka là một client nữa
  eureka.client.register-with-eureka=false
  eureka.client.fetch-registry=false

như dưới hình là không còn eureka-server nữa rồi :yum:
alt text

Tạo thử một service con

  • Theo lý thuyết thì mỗi service này sẽ một nghiệp vụ riêng như sản phẩm, tài khoản, thanh toán,.. nhưng vì trong cái demo này mình không có nghiệp vụ nào cả nên mình chỉ có tạo demo service :no_mouth:
  • Cần 2 thư viện này để mình tạo ra cái api và đăng ký với eureka server đã tạo ở bên trên
<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-client</artifactId>
</dependency>
  • Trong class application chỉ cần 1 cái annotation để bảo là đây là eureka client :astonished:
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {

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

}
  • Rồi trong application.properties ta cần thêm cái địa chỉ của eureka server nữa là được,
spring.application.name=demo-service
server.port=9000

eureka.client.service-url.default-zone=http://localhost:8761/eureka

để gọi chéo giữa các service trong cùng 1 eureka server bạn chỉ cần gọi qua tên là được, như cái service vừa tạo đây là demo-service chứ không cần phải gọi qua ip nữa.

  • Rồi mình cũng tạo 1 api để test
@RestController
public class Controller {

    @RequestMapping({"","/"})
    public ResponseEntity<String> hello(){
        return ResponseEntity.ok("Xin chào");
    }
}

Tạo gateway service

  • Như ở phần giới thiệu là mình sẽ sử dụng netflix zuul nên mình cần có 2 thư viện sau
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  • Trong class application thì ta cần phải giớ thiệu là đây cũng là eureka clientgateway service dùng zuul nữa
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class GatewayServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServiceApplication.class, args);
    }
}
  • Rồi sang application.properties ta cần 1 vài dòng để biết zuul này biết đến thằng demo service mình đã viết ở trên
server.port=9981
spring.application.name=gateway-service

eureka.client.service-url.default-zone=http://localhost:8761/eureka/

zuul.ignored-services=*
zuul.routes.demo-service.path=/demo/**
zuul.routes.demo-service.service-id=demo-service

về cơ bản nó chỉ như này thôi. Những request bên ngoài hệ thống sẽ phải qua zuul rồi mới tới api cần tới, chứ không thể gọi thẳng đến service luôn được. Ví dụ cái api demo của mình thì sẽ gọi như này
alt text

  • Và các eureka client đang chạy bao gồm như hình dưới alt text

Tổng kết

  • Cơ bản là mình đã vừa tạo 1 demo về các dùng cơ bản netflix eureka server cùng netflix zuul, hi vọng nó có giúp ích gì đó cho các bạn.
  • Về bài viết có gì thiếu sót các bạn comment góp ý giúp mình với nhé :innocent:
  • Đây là toàn bộ source bài này https://github.com/hunghhdev/guide/tree/master/spring-boot/spring-clound-first
  • Cảm ơn các bạn đến đây, mình xin cảm ơn nhé :purple_heart:
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

hunghh.dev

8 bài viết.
7 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 0
Xin chào các bạn đọc, trong seri này mình dự định sẽ chia sẻ cách dùng spring security để phân quyền trong web service, cách đọc ghi một JWT, rồi t...
hunghh.dev viết 8 tháng trước
7 0
White
6 1
Restful api Rest (Representational State Transfer) hiểu nôm na nó là một kiểu kiến trúc được dùng để giao tiếp giữa các máy tính, được truyền tải...
hunghh.dev viết 7 tháng trước
6 1
White
3 0
Ở (Link) mình đã tạo một số model và tạo thử một api register, ở phần này mình sẽ hướng dẫn các bạn tạo một chuỗi JWT và khi login sẽ chả về cái ch...
hunghh.dev viết 8 tháng trước
3 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
7 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!