[Spring Boot] - @PropertySource và Reload Config JSON File

Chắc hẳn ai dùng Spring cũng quen với việc dùng biến Environment
hoặc Anotation @Value để đọc dữ liệu từ file *.property
Cũng như sử dụng @PropertySource("${classpath:../path-to-file}") để trỏ tới nơi nào đó.

Mọi việc đều bình thường cho tới khi chúng ta nhận ra rằng, mình chỉ muốn thay đổi vài 1 biến nhỏ xíu thôi mà phải restart hẳn cái service đang chạy ngon ơ với vài K concurrent user trên production.

Thật tệ nếu chẳng may trong thời restart đó khách hàng complain, gọi điện trực tiếp tới văn phòng, chửi xối xả vào CSKH và bạn nhận được vài bát cháo hành từ BOSS.

Okey, We are fine. Quay lại vấn đề chính.
Các dữ liệu trong file property trong Spring được init lên khi start.
Vậy vấn đề là phải restart để có dữ liệu mới. OOPs.

Có một vài cách để thực thi việc này:

  • Sử dụng Spring Cloud Config (Dành cho các dự án kiểu Microservice)
  • Reinit Spring Bean (Hơi nguy hiểm - Chẳng khác gì việc restart)

Vậy sao mình không thử một cách đơn giản sau đây:

Chuyển từ file property sang JSON (dễ control) :))

B1. Tạo 1 Bean chạy đầu tiên
B2. Load file config từ đâu đó lên (app.config-path chẳng hạn)
B3. Chuyển dạng sang 1 cái object (AppConfig) --> Lưu ở class này
B4. Viết một hàm reloadConfig
B5. Viết thêm 1 cái api để tiện thao tác cho việc reload này
B6. Sau khi khởi tạo xong, chúng ta chỉ cần truy xuất vào AppConfig và xài nó;

=========== Null Pointer Exception ==========

Khởi tạo Config
Screen-Shot-2018-04-15-at-6.22.38-PM

API reload

Screen-Shot-2018-04-15-at-6.25.40-PM

Object config

Screen-Shot-2018-04-15-at-6.26.37-PM

Có một số dự án có nhiều file config khác, chúng ta cũng có thể làm tương tự
Thêm 1 list các đường dẫn, object khác nhau và reload từng file khác nhau.

Repository

Find out