Service Discovery


Microservices architecture এ অনেকগুলো সার্ভিস একে অপরের সাথে যোগাযোগ করে। এই সার্ভিসগুলো static IP বা port দিয়ে manage করা কঠিন — কারণ সার্ভিসগুলো scale up/down, move, বা restart হতে পারে। এই সমস্যা সমাধান করে 👉 Service Discovery


Service Discovery কী?

Service Discovery হলো এমন একটি মেকানিজম, যেখানে প্রতিটি সার্ভিস নিজেকে একটি কেন্দ্রীয় registry তে রেজিস্টার করে এবং অন্য সার্ভিসগুলো সেই registry থেকে dynamically একে অপরকে খুঁজে নেয়। সাধারণত আমরা Netflix এর Eureka Server ব্যবহার করি Spring Boot এ।


আর্কিটেকচার ডায়াগ্রাম

+-------------------+           +------------------+
|  Service A        |           |  Service B       |
| (Eureka Client)   |<--------->| (Eureka Client)  |
+-------------------+           +------------------+
           \                        /
            \                      /
             \                    /
            +--------------------+
            |  Eureka Server     |
            |  (Service Registry)|
            +--------------------+

👉 এখানে:

- প্রতিটি সার্ভিস নিজেকে Eureka Server এ রেজিস্টার করে

- একে অপরের লোকেশন জানতে Eureka এর মাধ্যমে lookup করে


ধাপ ১: Eureka Server তৈরি

Dependency (pom.xml)

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


Main Class

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryServerApplication.class, args);
    }
}


application.yml

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

এখন http://localhost:8761 খুললে Eureka Dashboard দেখা যাবে।


ধাপ ২: Eureka Client তৈরি (Service Registration)

ধরা যাক আমাদের একটি Order Service আছে, যা Eureka তে রেজিস্টার হবে।

Dependency

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


Main Class

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}


application.yml

spring:
  application:
    name: order-service

server:
  port: 8081

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

এখন OrderService start করলে, এটি স্বয়ংক্রিয়ভাবে Eureka Server এ রেজিস্টার হবে।


ধাপ ৩: অন্য সার্ভিস থেকে সার্ভিস ডিসকভারি

ধরা যাক PaymentService OrderService কে কল করতে চায়।

Dependency

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


RestTemplate Configuration

@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced  // Load balancing সহ সার্ভিস রেজোলিউশন সক্রিয় করবে
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}


Service Call Example

@Service
public class PaymentService {

    @Autowired
    private RestTemplate restTemplate;

    public String callOrderService() {
        String url = "http://order-service/api/orders";
        return restTemplate.getForObject(url, String.class);
    }
}

এখানে order-service নামটি Eureka registry থেকে resolve হবে।
Load Balancer (Ribbon) স্বয়ংক্রিয়ভাবে সার্ভিস ইনস্ট্যান্স বেছে নেবে।


Eureka Client Properties

Property Description
eureka.client.register-with-eureka ক্লায়েন্ট নিজেকে রেজিস্টার করবে কিনা
eureka.client.fetch-registry রেজিস্ট্রি ডাউনলোড করবে কিনা
eureka.instance.hostname সার্ভিসের হোস্টনেম নির্ধারণ করে
eureka.instance.instance-id সার্ভিসের ইউনিক আইডি সেট করে


Load Balancing in Service Discovery

Eureka ব্যবহার করলে Spring Boot স্বয়ংক্রিয়ভাবে Ribbon Load Balancer ইন্টিগ্রেট করে।
একই সার্ভিসের একাধিক ইনস্ট্যান্স থাকলে, প্রতিটি কল স্বয়ংক্রিয়ভাবে distribute হয়।


Bonus: Security সহ Eureka

Eureka Dashboard কে basic auth দিয়ে সুরক্ষিত করতে পারো।

application.yml

spring:
  security:
    user:
      name: admin
      password: admin123


Maven Dependency

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

এবার http://localhost:8761 খুললে লগইন দরকার হবে।


Real-world Example

Eureka Server /eureka এ রেজিস্ট্রেশন প্যানেল

Order Service (Client) /api/orders

Payment Service (Client) /api/payments

Call Flow: PaymentServiceEurekaOrderService


Service Discovery Best Practices

- সার্ভিস নামগুলো ছোট ও স্পষ্ট রাখো (user-service, order-service)
@LoadBalanced RestTemplate ব্যবহার করো
- Eureka Server সবসময় HA (High Availability) মোডে রাখো
- সার্ভিস হেলথচেক (/actuator/health) ব্যবহার করো
- Environment আলাদা করো (dev/stage/prod)