স্প্রিং ক্লাউড (Spring Cloud) একটি শক্তিশালী ফ্রেমওয়ার্ক যা মাইক্রোসার্ভিস আর্কিটেকচার তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক ছোট, স্বাধীন সার্ভিস থাকে, যেগুলি একে অপরের সাথে যোগাযোগ করে এবং পুরো অ্যাপ্লিকেশন তৈরি করে। স্প্রিং ক্লাউড মাইক্রোসার্ভিস তৈরি করতে সাহায্য করে, যেখানে ডিস্ট্রিবিউটেড সিস্টেম, ডায়নামিক সার্ভিস ডিসকভারি, এবং লোড ব্যালান্সিং ব্যবহৃত হয়।
এখানে, আমরা স্প্রিং ক্লাউড ব্যবহার করে একটি সাধারণ মাইক্রোসার্ভিস তৈরি করার উদাহরণ দেখব।
স্প্রিং ক্লাউড মাইক্রোসার্ভিস তৈরি করার জন্য প্রস্তুতি
- Spring Initializr ব্যবহার করে দুটি মাইক্রোসার্ভিস তৈরি করব।
- Eureka Server (Service Registry) তৈরি করব, যেখানে সার্ভিসগুলি রেজিস্টার হবে।
- Service A এবং Service B তৈরি করব, যেখানে Service A এবং Service B একে অপরের সাথে যোগাযোগ করবে।
১. Eureka Server (Service Registry) তৈরি করা
Eureka Server হল Netflix-এর একটি সার্ভিস ডিসকভারি সার্ভিস। এটি মাইক্রোসার্ভিসগুলির জন্য সার্ভিস রেজিস্ট্রি হিসেবে কাজ করে এবং সার্ভিসগুলির অবস্থান ট্র্যাক করতে সহায়তা করে। এতে সার্ভিসগুলি একে অপরকে খুঁজে বের করতে পারে।
১.১ pom.xml - ডিপেনডেন্সি যোগ করা:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
১.২ EurekaServerApplication.java - Eureka সার্ভার ক্লাস:
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
১.৩ application.properties - Eureka সার্ভারের কনফিগারেশন:
server.port=8761
spring.application.name=eureka-server
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
এখানে, Eureka Server পোর্ট 8761 এ রান করবে এবং ক্লায়েন্ট রেজিস্ট্রেশন বন্ধ থাকবে কারণ এটি শুধুমাত্র সার্ভিস রেজিস্ট্রি হিসেবে কাজ করবে।
২. Service A (Microservice) তৈরি করা
এটি প্রথম মাইক্রোসার্ভিস হবে, যেটি Service A নামে পরিচিত। Service A মাইক্রোসার্ভিস Eureka Server এ রেজিস্টার হবে এবং Service B কে কল করবে।
২.১ pom.xml - ডিপেনডেন্সি যোগ করা:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
২.২ ServiceAApplication.java - Service A মাইক্রোসার্ভিস ক্লাস:
package com.example.servicea;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
}
@RestController
class ServiceAController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-service-b")
public String callServiceB() {
String url = "http://service-b/hello";
return restTemplate.getForObject(url, String.class);
}
}
২.৩ application.properties - Service A কনফিগারেশন:
spring.application.name=service-a
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
২.৪ RestTemplate Bean তৈরি করা:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
৩. Service B (Microservice) তৈরি করা
এটি দ্বিতীয় মাইক্রোসার্ভিস হবে, যেটি Service B নামে পরিচিত। Service B একটি সাধারণ REST API প্রদান করবে যা Service A দ্বারা কল করা হবে।
৩.১ pom.xml - ডিপেনডেন্সি যোগ করা:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
৩.২ ServiceBApplication.java - Service B মাইক্রোসার্ভিস ক্লাস:
package com.example.serviceb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceBApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceBApplication.class, args);
}
}
@RestController
class ServiceBController {
@GetMapping("/hello")
public String sayHello() {
return "Hello from Service B!";
}
}
৩.৩ application.properties - Service B কনফিগারেশন:
spring.application.name=service-b
server.port=8082
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
৪. মাইক্রোসার্ভিসগুলো চালানো
Eureka Server: প্রথমে Eureka Server চালু করুন। এটি সার্ভিস রেজিস্ট্রি হিসেবে কাজ করবে।
mvn spring-boot:runService A এবং Service B: তারপর Service A এবং Service B চালু করুন।
mvn spring-boot:run
৫. Service A থেকে Service B কল করা
- Service A এর মধ্যে
/call-service-bএন্ডপয়েন্ট কল করলে, এটি Service B এর/helloএন্ডপয়েন্টে রিকোয়েস্ট পাঠাবে। - Service A রেসপন্স হিসেবে Service B থেকে "Hello from Service B!" বার্তা পাবে।
সারাংশ
স্প্রিং ক্লাউড এবং মাইক্রোসার্ভিস আর্কিটেকচারের মাধ্যমে আপনি ছোট ছোট সেবাগুলির মাধ্যমে একটি বড় অ্যাপ্লিকেশন তৈরি করতে পারেন, যেখানে প্রতিটি সেবা নিজের কাজটি সম্পাদন করে। Eureka সার্ভিস রেজিস্ট্রি হিসেবে কাজ করে, যা বিভিন্ন মাইক্রোসার্ভিস একে অপরকে খুঁজে পেতে সাহায্য করে। Service A এবং Service B এর মাধ্যমে আমরা দেখলাম কিভাবে একটি সার্ভিস আরেকটি সার্ভিসের সাথে যোগাযোগ করে কাজ করতে পারে। স্প্রিং ক্লাউড মাইক্রোসার্ভিসগুলো সহজেই স্কেল করা যায় এবং অ্যাপ্লিকেশন ডিজাইনের জন্য নমনীয়তা প্রদান করে।
Read more