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)