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: PaymentService → Eureka → OrderService
Service Discovery Best Practices
- সার্ভিস নামগুলো ছোট ও স্পষ্ট রাখো (user-service, order-service)- @LoadBalanced RestTemplate ব্যবহার করো
- Eureka Server সবসময় HA (High Availability) মোডে রাখো
- সার্ভিস হেলথচেক (/actuator/health) ব্যবহার করো
- Environment আলাদা করো (dev/stage/prod)