Config Server
Microservices architecture এ, বিভিন্ন সার্ভিসের জন্য আলাদা আলাদা configuration ফাইল manage করা অনেক জটিল হয়ে পড়ে। যেমন: Database URL, API key, Environment-specific properties (Dev, QA, Prod ইত্যাদি)। এই সমস্যা সমাধানেই আসে Spring Cloud Config Server।
Config Server কী?
Spring Cloud Config Server হলো একটি কেন্দ্রীয় configuration management service, যা তোমার সব microservice এর জন্য external configuration প্রদান করে। অর্থাৎ, প্রতিটি সার্ভিসের application.properties বা application.yml সার্ভারে থাকবে, এবং runtime এ Config Server থেকে সেই configuration গুলো লোড হবে।
আর্কিটেকচার ডায়াগ্রাম
+-----------------------+
| Git Repository |
| (config files) |
+-----------+-----------+
|
v
+-----------------------+
| Config Server (8761) |
+-----------+-----------+
|
v
+-------------------+------------------+
| Service A (Order Service) |
| Service B (Payment Service) |
| Service C (User Service) |
+--------------------------------------+
ধাপ ১: Config Server তৈরি
Dependency (pom.xml)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Main Class
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.yml
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/marufh/config-repo
default-label: main
এখানে https://github.com/marufh/config-repo হলো তোমার config repository।
ধাপ ২: Config Repository তৈরি
GitHub বা GitLab এ একটি নতুন repository তৈরি করো, যেমন: config-repo
ভিতরে প্রতিটি সার্ভিসের জন্য আলাদা YAML ফাইল রাখো:
config-repo/
├── order-service.yml
├── payment-service.yml
└── application.yml
উদাহরণ: order-service.yml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/orderdb
username: order_user
password: secret
ধাপ ৩: Client (Microservice) কনফিগার করা
ধরা যাক, আমাদের একটি Order Service আছে।
Dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
bootstrap.yml
💡
bootstrap.ymlফাইলটি ব্যবহার হয় Config Server থেকে configuration load করার আগে।
spring:
application:
name: order-service
cloud:
config:
uri: http://localhost:8888
profile: dev
label: main
application.yml
spring:
config:
import: optional:configserver:http://localhost:8888
এখন যখন তুমি OrderServiceApplication চালাবে,
এটি Config Server থেকে order-service.yml ফাইল লোড করবে।
কিভাবে Config Fetch হয়?
ধরা যাক spring.application.name=order-service
তাহলে Config Server fetch করবে এই URL থেকে 👇
http://localhost:8888/order-service/default
অথবা
http://localhost:8888/order-service/dev
(যদি profile: dev দেওয়া থাকে)
Config Refresh (without restart)
যদি তুমি Config repo তে কোনো property পরিবর্তন করো,
তাহলে সার্ভিস restart না করে রিয়েলটাইমে update করা যায়।
Dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Enable refresh
@RefreshScope
@RestController
public class MessageController {
@Value("${service.message}")
private String message;
@GetMapping("/message")
public String getMessage() {
return message;
}
}
Refresh call
POST http://localhost:8081/actuator/refresh
এখন Config Server থেকে নতুন value load হবে।
Optional: Secure Config Server
তুমি Config Server কে basic authentication বা OAuth2 দিয়ে সুরক্ষিত করতে পারো।
application.yml
spring:
security:
user:
name: admin
password: secret
Client bootstrap.yml
spring:
cloud:
config:
uri: http://admin:secret@localhost:8888
Bonus: Local file-based config
Git ছাড়াও, লোকাল ফোল্ডার থেকেও config লোড করা যায়:
spring:
cloud:
config:
server:
native:
search-locations: file:///C:/config-repo/
এক্ষেত্রে Config Server চালু করার সময় profile দিতে হবে:
--spring.profiles.active=native
Spring Config Server Workflow
| ধাপ | কাজ |
|---|---|
| 1️⃣ | Config Server Git repo থেকে YAML ফাইল পড়ে |
| 2️⃣ | Client সার্ভিস bootstrap.yml দিয়ে config সার্ভারের সাথে সংযোগ স্থাপন করে |
| 3️⃣ | Config Server সার্ভিসের নাম ও প্রোফাইল অনুযায়ী config ফাইল পাঠায় |
| 4️⃣ | Spring Context লোড হওয়ার সময় সেই প্রোপার্টিগুলো প্রযোজ্য হয় |
| 5️⃣ | /actuator/refresh এর মাধ্যমে runtime এ রিফ্রেশ করা যায় |
Best Practices
- Config Server সবসময় Git repo থেকে config লোড করো
- Sensitive data (password, API key) Vault বা Encrypted property হিসেবে রাখো
- সার্ভিসগুলোতে bootstrap.yml আলাদা রাখো- /actuator/refresh endpoint সিকিউর করো
- Config Server কে cluster-ready রাখো (HA)