Spring Cloud Gateway হল একটি API গেটওয়ে সলিউশন যা মাইক্রোসার্ভিস আর্কিটেকচারে গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি Spring WebFlux ভিত্তিক, যা হাই পারফরম্যান্স এবং রিঅ্যাকটিভ সার্ভিস রাউটিং প্রদান করে। Spring Cloud Gateway ক্লায়েন্টের রিকোয়েস্টকে বিভিন্ন মাইক্রোসার্ভিসে রাউট করে, একাধিক ফিচার যেমন লোড ব্যালান্সিং, রিকোয়েস্ট ফিল্টারিং, সিকিউরিটি, লগিং, এবং রেট লিমিটিং সরবরাহ করে।
API গেটওয়ে হিসাবে Spring Cloud Gateway সার্ভিসের মধ্যে কমপ্লেক্স রাউটিং, রিকোয়েস্ট/রেসপন্স ম্যানিপুলেশন এবং ইন্টিগ্রেশন সহজ করে তোলে। এটি Spring Boot এবং Spring Cloud ইকোসিস্টেমের মধ্যে একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান।
Spring Cloud Gateway এর সুবিধাসমূহ:
- Dynamic Routing: এটি রিকোয়েস্টের উপর ভিত্তি করে ডাইনামিক রাউটিং প্রদান করে।
- Filters: রিকোয়েস্ট এবং রেসপন্স ফিল্টার করতে সহায়ক। এটি প্রি/পোস্ট প্রসেসিং এবং রিকোয়েস্ট/রেসপন্স ম্যানিপুলেশন সক্ষম করে।
- Load Balancing: সার্ভিসের মধ্যে লোড সমানভাবে বিতরণ করতে সহায়ক (Ribbon বা DiscoveryClient ব্যবহার করে)।
- Rate Limiting: প্রতি ব্যবহারকারীর জন্য API কল সীমিত করতে সহায়ক।
- Security: OAuth2 এবং JWT Authentication-এর মাধ্যমে নিরাপত্তা প্রদান।
- Circuit Breaker: Resilience4J বা Hystrix-এর মাধ্যমে সার্ভিস ফেইলিওর ম্যানেজমেন্ট।
- Integration with Spring Cloud: Eureka বা Consul এর সাথে ইন্টিগ্রেশন সুবিধা, যাতে সার্ভিসের অবস্থান স্বয়ংক্রিয়ভাবে আবিষ্কৃত হয়।
Spring Cloud Gateway Setup এবং কনফিগারেশন
Step 1: Dependency Setup
প্রথমে আপনার pom.xml ফাইলে Spring Cloud Gateway এর জন্য প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করুন।
<dependencies>
<!-- Spring Boot Starter WebFlux for Reactive Programming -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- Spring Cloud Gateway Dependency -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Eureka Discovery Client for Service Discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
Note: Spring Cloud Gateway ডিপেন্ডেন্সি Spring WebFlux এর উপর ভিত্তি করে কাজ করে, যা রিঅ্যাকটিভ প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়।
Step 2: Application Properties Configuration
Spring Cloud Gateway কনফিগারেশনের জন্য application.yml অথবা application.properties ফাইলে প্রয়োজনীয় সেটিংস যোগ করুন।
Example application.yml:
spring:
cloud:
gateway:
routes:
- id: service_route
uri: lb://my-service # Load Balancing with Eureka
predicates:
- Path=/my-service/** # Path matching
filters:
- AddRequestHeader=X-Request-Foo, Bar # Add header to the request
- RewritePath=/my-service/(?<segment>.*), /${segment} # Path rewriting
# Discovery client for service discovery
discovery:
locator:
enabled: true # Enable dynamic service discovery
server:
port: 8080 # Port for Gateway service
- uri:
lb://ব্যবহারের মাধ্যমে Eureka বা Consul সার্ভিস ডিসকভারি প্ল্যাটফর্মের মাধ্যমে লোড ব্যালান্সিং করা হয়। - filters: রিকোয়েস্ট এবং রেসপন্স ম্যানিপুলেশন করা হয়, যেমন header যোগ করা বা path rewrite করা।
- predicates: রাউটিং রুলস বা শর্ত, যেমন Path match বা Host match।
Step 3: Create a Simple Gateway Route
আপনি যদি নির্দিষ্ট রাউটিং কনফিগারেশন করতে চান, তবে Spring Cloud Gateway এ RouteLocator ব্যবহার করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.RouteLocatorBuilder;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("service_route", r -> r.path("/service/**")
.uri("http://localhost:8081"))
.route("service_load_balanced", r -> r.path("/loadbalanced/**")
.uri("lb://my-service"))
.build();
}
}
এখানে:
"http://localhost:8081": সরাসরি URL এ রিকোয়েস্ট রাউট করা হয়।"lb://my-service": Eureka সার্ভিস ডিসকভারি ব্যবহার করে লোড ব্যালান্সিং করা হয়।
Step 4: Service Discovery Integration (Eureka)
Spring Cloud Gateway সাধারণত Eureka সার্ভিস ডিসকভারি প্ল্যাটফর্মের সঙ্গে কাজ করে। এটি @EnableEurekaClient এবং সার্ভিসের নামের মাধ্যমে সার্ভিস অবস্থান খুঁজে বের করে।
Eureka Client Configuration:
@EnableEurekaClient
@SpringBootApplication
public class MyServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MyServiceApplication.class, args);
}
}
application.yml (Eureka Client Configuration):
spring:
application:
name: my-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ # Eureka Server URL
Step 5: Add Filters (Optional)
Spring Cloud Gateway বিভিন্ন ধরনের filters ব্যবহার করতে দেয়, যেমন:
- Request Filters: রিকোয়েস্টের আগে বা পরে কাস্টম কার্যক্রম করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, লগিং, অথেনটিকেশন হ্যান্ডলিং, বা রিকোয়েস্ট হেডার ম্যানিপুলেশন।
- Response Filters: রেসপন্সের আগে বা পরে কাস্টম কার্যক্রম করা।
Example Filter:
spring:
cloud:
gateway:
routes:
- id: my-route
uri: http://localhost:8081
filters:
- AddRequestHeader=Authorization, Bearer mytoken123
- RequestRateLimiter=2,5 # Limit to 2 requests per second, with a burst capacity of 5
Step 6: Run the Application
- Eureka Server চালু করুন (যদি আপনি সার্ভিস ডিসকভারি ব্যবহার করেন)।
- Spring Cloud Gateway চালু করুন, যা API গেটওয়ে হিসেবে কাজ করবে।
- আপনার সার্ভিস (যেমন
my-service) চালু করুন এবং Spring Cloud Gateway এর মাধ্যমে রাউটিং পরীক্ষা করুন।
Additional Features:
Authentication & Authorization (OAuth2/JWT): Spring Cloud Gateway OAuth2 এবং JWT authentication সমর্থন করে, যা API রিকোয়েস্টের জন্য নিরাপত্তা প্রদান করে।
Example OAuth2 Security Configuration:
spring: security: oauth2: client: registration: google: client-id: YOUR_CLIENT_ID client-secret: YOUR_CLIENT_SECRET scope: profile, email redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"Rate Limiting: Spring Cloud Gateway রেট লিমিটিং ফিচার সমর্থন করে, যা নির্দিষ্ট পরিমাণ রিকোয়েস্টের পরে সার্ভিস রিকোয়েস্ট ব্লক বা থ্রটল করতে পারে।
Example Rate Limiting:
spring: cloud: gateway: routes: - id: rate_limit_route uri: lb://my-service predicates: - Path=/my-service/** filters: - RequestRateLimiter=1,1- Hystrix Integration (Circuit Breaker): Spring Cloud Gateway Hystrix সার্ভিস ব্রেকার সাপোর্ট করে, যা সার্ভিস ফেইলিওর হ্যান্ডল করতে ব্যবহৃত হয়।
উপসংহার
Spring Cloud Gateway হল একটি অত্যন্ত শক্তিশালী API গেটওয়ে, যা সার্ভিস রাউটিং, ফিল্টারিং, সিকিউরিটি, এবং অন্যান্য ফিচার প্রদান করে। এটি মাইক্রোসার্ভিস আর্কিটেকচারে highly flexible এবং performant API গেটওয়ে সমাধান প্রদান করে। Spring Cloud Gateway ব্যবহার করে আপনি সহজে মাইক্রোসার্ভিসগুলোর মধ্যে রিকোয়েস্ট গেটওয়ে, ফিল্টারিং, এবং সার্ভিস কমিউনিকেশন পরিচালনা করতে পারবেন।
API Gateway হল একটি সার্ভিস যা মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক ব্যাকএন্ড সার্ভিসের জন্য একক পয়েন্ট হিসেবে কাজ করে। এটি ক্লায়েন্ট (যেমন ওয়েব ব্রাউজার বা মোবাইল অ্যাপ্লিকেশন) এবং ব্যাকএন্ড মাইক্রোসার্ভিসগুলির মধ্যে একটি ব্রোকার হিসেবে কাজ করে, যা বিভিন্ন সার্ভিসের রিকোয়েস্ট এবং রেসপন্সগুলো কেন্দ্রীভূতভাবে পরিচালনা করে। API Gateway মাইক্রোসার্ভিসের যোগাযোগ সহজ করে এবং সার্ভিসগুলির মধ্যে লোড ব্যালান্সিং, সিকিউরিটি, রাউটিং, ফিল্টারিং এবং মনিটরিং কার্যক্রম সম্পাদন করে।
API Gateway এর কাজ:
- Request Routing:
- ক্লায়েন্টের রিকোয়েস্টকে সঠিক ব্যাকএন্ড সার্ভিসে রাউট করা। এর মাধ্যমে ব্যাকএন্ড সার্ভিসের জন্য ডিরেক্ট অ্যাক্সেসের প্রয়োজন হয় না।
- Load Balancing:
- API Gateway লোড ব্যালান্সিং কার্যক্রম পরিচালনা করে, সার্ভিসের মধ্যে রিকোয়েস্ট সঠিকভাবে বিতরণ করতে সাহায্য করে।
- Security:
- ক্লায়েন্টের রিকোয়েস্টে সিকিউরিটি যাচাই করা, যেমন OAuth2, JWT টোকেন, API কী, ইত্যাদি।
- Rate Limiting:
- API Gateway রিকোয়েস্টের পরিমাণ সীমাবদ্ধ করতে পারে, যাতে এক ক্লায়েন্ট একসাথে অত্যধিক রিকোয়েস্ট না পাঠায়।
- Request Transformation:
- API Gateway রিকোয়েস্ট বা রেসপন্সের ডাটা ফরম্যাট পরিবর্তন করতে পারে (যেমন JSON থেকে XML বা vice versa)।
- Authentication & Authorization:
- API Gateway সার্ভিসের জন্য সেন্ট্রালাইজড অথেন্টিকেশন এবং অথোরাইজেশন সিস্টেম প্রদান করে, যেমন OAuth 2.0, JWT টোকেন, ইত্যাদি।
- CORS (Cross-Origin Resource Sharing):
- একাধিক ডোমেইন থেকে অ্যাক্সেস নিশ্চিত করতে CORS কনফিগারেশন করা যেতে পারে।
- Caching:
- কিছু API রেসপন্স ক্যাশে করে রাখা যায়, যাতে বারবার একই রিকোয়েস্ট এলে দ্রুত রেসপন্স পাওয়া যায়।
- Fault Tolerance:
- সার্ভিসের ফেইল হলে API Gateway সার্কিট ব্রেকার (যেমন Hystrix) ব্যবহার করে সার্ভিস ডাউন হওয়ার পর ব্যাকআপ সার্ভিসে রিকোয়েস্ট পাঠায়।
API Gateway এর প্রয়োজনীয়তা:
API Gateway মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক কারণে গুরুত্বপূর্ণ। এর প্রধান কিছু প্রয়োজনীয়তা নিচে আলোচনা করা হলো:
১. সেন্ট্রালাইজড রিকোয়েস্ট হ্যান্ডলিং:
- যখন মাইক্রোসার্ভিসে একাধিক সার্ভিস থাকে, তখন API Gateway সকল রিকোয়েস্ট একত্রিত করে এবং রাউটিং, সিকিউরিটি, এবং অন্যান্য কার্যক্রম সেন্ট্রালাইজডভাবে পরিচালনা করে।
- ক্লায়েন্টকে বিভিন্ন সার্ভিসে যাওয়ার প্রয়োজন হয় না, API Gateway এর মাধ্যমে সকল সার্ভিসের রিকোয়েস্ট পরিচালনা করা যায়।
২. নিরাপত্তা এবং অথেন্টিকেশন:
- API Gateway একক পয়েন্ট হিসেবে কাজ করে, যার মাধ্যমে সমস্ত সিকিউরিটি চেক (যেমন OAuth2, JWT, API Key) এবং অথেন্টিকেশন কার্যক্রম এক জায়গায় নিয়ন্ত্রণ করা যায়।
- এতে করে প্রত্যেক সার্ভিসকে আলাদাভাবে সিকিউরিটি কনফিগার করার প্রয়োজন হয় না।
৩. রাউটিং এবং লোড ব্যালান্সিং:
- API Gateway রিকোয়েস্টগুলিকে সঠিক সার্ভিসে রাউট করতে সহায়তা করে এবং সার্ভিস ইনস্ট্যান্সের মধ্যে লোড ব্যালান্সিং করে। এতে সার্ভিসগুলোর মধ্যে ভারসাম্য বজায় থাকে।
৪. সার্ভিস কলের সহজীকরণ:
- ক্লায়েন্ট সার্ভিসগুলির সাথে যোগাযোগ করতে API Gateway ব্যবহার করতে পারে, যেখানে একাধিক API কলের পরিবর্তে একক পয়েন্টের মাধ্যমে বিভিন্ন সার্ভিসের মধ্যে যোগাযোগ স্থাপন করা যায়।
- এটি একাধিক সার্ভিস কলের সংখ্যা কমিয়ে দেয় এবং ডেভেলপমেন্ট সহজ করে।
৫. সার্ভিসের স্কেলিং:
- API Gateway সহকারী হিসাবে স্কেলিং-এর সুবিধা প্রদান করে, যেখানে একাধিক সার্ভিসের মাঝে লোড এবং রিকোয়েস্ট সঠিকভাবে ভাগ করে নেওয়া হয়।
৬. মোনিটরিং এবং লগিং:
- API Gateway সার্ভিসগুলির মধ্যে রিকোয়েস্ট এবং রেসপন্সের তথ্য সংগ্রহ করতে পারে, যা পরে সার্ভিস মনিটরিং এবং লগিং কার্যক্রমে সহায়ক হয়।
৭. Fault Tolerance (SLA Management):
- সার্ভিস ডাউন বা লোড বেশি হলে API Gateway সার্কিট ব্রেকার ব্যবহার করে ফেইলওভার রাউটিং সক্ষম করে এবং সার্ভিসের স্থিতিশীলতা নিশ্চিত করে।
৮. ক্যাশিং:
- API Gateway কিছু রেসপন্স ক্যাশে করে রাখতে পারে, যা একই রিকোয়েস্টে দ্রুত রেসপন্স দেয় এবং সার্ভারের লোড কমায়।
Spring Cloud Gateway: API Gateway উদাহরণ
Spring Cloud Gateway হল Spring Framework এর একটি প্রকল্প যা API Gateway হিসেবে ব্যবহৃত হয়। এটি ক্লাউড-নেটিভ অ্যাপ্লিকেশনগুলির জন্য একটি শক্তিশালী এবং কনফিগারেবল API Gateway প্রদান করে।
Spring Cloud Gateway সেটআপ:
- প্রজেক্ট ডিপেনডেন্সি:
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
- API Gateway কনফিগারেশন (application.yml):
spring:
cloud:
gateway:
routes:
- id: example-route
uri: http://localhost:8080
predicates:
- Path=/api/**
filters:
- AddRequestHeader=X-Request-Foo, Bar
- uri: যে সার্ভিসে রিকোয়েস্ট পাঠানো হবে।
- predicates: রাউটিং শর্ত, যেমন
Path,Host,Methodইত্যাদি। - filters: রিকোয়েস্ট বা রেসপন্সের ওপর প্রয়োগ করতে হবে এমন ফিল্টার।
- Spring Cloud Gateway কন্ট্রোলার:
@SpringBootApplication
public class SpringCloudGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudGatewayApplication.class, args);
}
}
API Gateway এর কিছু জনপ্রিয় ব্যবহার:
- Microservices Communication: একাধিক মাইক্রোসার্ভিসের মধ্যে যোগাযোগের জন্য একক পয়েন্ট API গেটওয়ে।
- Security: সার্ভিসগুলির মধ্যে নিরাপদ যোগাযোগ এবং অ্যাক্সেস কন্ট্রোল (JWT, OAuth2)।
- Rate Limiting: অতিরিক্ত রিকোয়েস্ট আটকানোর জন্য সীমাবদ্ধতা আরোপ করা।
- Service Aggregation: একাধিক সার্ভিসের ফলাফল একত্র করে একটি একক রেসপন্স প্রদান।
উপসংহার:
API Gateway মাইক্রোসার্ভিস আর্কিটেকচারে একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান, যা সার্ভিসগুলির মধ্যে যোগাযোগ সহজ করে, লোড ব্যালান্সিং, সিকিউরিটি, রাউটিং, এবং মনিটরিং কার্যক্রম সেন্ট্রালাইজডভাবে পরিচালনা করতে সাহায্য করে। Spring Cloud Gateway Spring ফ্রেমওয়ার্কের একটি শক্তিশালী API গেটওয়ে সমাধান, যা মাইক্রোসার্ভিস অ্যাপ্লিকেশনগুলোতে খুব কার্যকরীভাবে কাজ করে।
যদি আরো বিস্তারিত জানার প্রয়োজন হয় বা অন্য কোনো প্রশ্ন থাকে, জানাতে পারেন! 😊
Spring Cloud Gateway একটি API গেটওয়ে প্রকল্প, যা Spring Framework-এ নির্মিত এবং মাইক্রোসার্ভিস আর্কিটেকচারে ব্যবহৃত হয়। এটি বিভিন্ন ধরনের রাউটিং, ফিল্টারিং, লোড ব্যালান্সিং, সিকিউরিটি, রেট লিমিটিং, এবং সার্ভিস কমিউনিকেশন সহজ করে। Spring Cloud Gateway ব্যবহার করে, আপনি API গেটওয়ে হিসেবে একটি একক এন্ট্রি পয়েন্ট তৈরি করতে পারেন, যা আপনার মাইক্রোসার্ভিসগুলিতে সমস্ত ইনকামিং ট্রাফিক রাউট করবে।
Spring Cloud Gateway কে সাধারণত Eureka, OAuth2, JWT, বা Rate Limiting এর সাথে একত্রে ব্যবহার করা হয়।
এখানে Spring Cloud Gateway সেটআপ এবং কনফিগার করার ধাপগুলো আলোচনা করা হয়েছে।
১. Spring Cloud Gateway ডিপেনডেন্সি যোগ করা
প্রথমে, Spring Cloud Gateway সেটআপ করার জন্য আপনাকে Maven বা Gradle এর মাধ্যমে ডিপেনডেন্সি যোগ করতে হবে।
Maven ডিপেনডেন্সি
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Gradle ডিপেনডেন্সি
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.boot:spring-boot-starter-web'
২. Spring Cloud Gateway কনফিগারেশন
application.yml বা application.properties ফাইলে Spring Cloud Gateway কনফিগার করুন। এখানে গেটওয়ে রাউটিং এবং অন্যান্য ফিচার কনফিগার করা হবে।
application.yml কনফিগারেশন উদাহরণ
spring:
cloud:
gateway:
routes:
- id: serviceA
uri: lb://serviceA
predicates:
- Path=/serviceA/**
- id: serviceB
uri: lb://serviceB
predicates:
- Path=/serviceB/**
এখানে, আমরা দুটি সার্ভিস (serviceA এবং serviceB) রাউট করেছি:
lb://serviceAওlb://serviceBএর মাধ্যমে Eureka সার্ভিস ডিসকভারি ব্যবহার করা হচ্ছে, যেখানে গেটওয়ে সার্ভিসের নামের মাধ্যমে সার্ভিস রেজিস্ট্রি থেকে সার্ভিসটি খুঁজে পাবে এবং রাউট করবে।predicatesএর মাধ্যমে সার্ভিসের জন্য URL প্যাথ কনফিগার করা হচ্ছে, যেমন/serviceA/**বা/serviceB/**।
application.properties কনফিগারেশন উদাহরণ
spring.cloud.gateway.routes[0].id=serviceA
spring.cloud.gateway.routes[0].uri=lb://serviceA
spring.cloud.gateway.routes[0].predicates[0]=Path=/serviceA/**
spring.cloud.gateway.routes[1].id=serviceB
spring.cloud.gateway.routes[1].uri=lb://serviceB
spring.cloud.gateway.routes[1].predicates[0]=Path=/serviceB/**
৩. Spring Cloud Gateway ফিল্টারিং কনফিগারেশন
Spring Cloud Gateway ফিল্টার ব্যবহার করে API রিকোয়েস্ট এবং রেসপন্সগুলির উপর বিভিন্ন ধরনের অপারেশন করা যায়। যেমন, হেডার যোগ করা, কাস্টম রাউটিং, রেট লিমিটিং ইত্যাদি।
ফিল্টার উদাহরণ
spring:
cloud:
gateway:
routes:
- id: serviceA
uri: lb://serviceA
predicates:
- Path=/serviceA/**
filters:
- AddRequestHeader=X-Request-Foo, Bar
- AddResponseHeader=X-Response-Foo, Baz
এখানে, দুটি ফিল্টার ব্যবহার করা হয়েছে:
- AddRequestHeader: API রিকোয়েস্টে একটি কাস্টম হেডার যোগ করা হয়েছে (
X-Request-Foo: Bar)। - AddResponseHeader: API রেসপন্সে একটি কাস্টম হেডার যোগ করা হয়েছে (
X-Response-Foo: Baz)।
Rate Limiting Filter
আপনি Spring Cloud Gateway-এ রেট লিমিটিংও কনফিগার করতে পারেন।
spring:
cloud:
gateway:
routes:
- id: serviceA
uri: lb://serviceA
predicates:
- Path=/serviceA/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
এটি Redis ব্যবহার করে প্রতি সেকেন্ডে 10টি রিকোয়েস্ট এবং প্রতি সেকেন্ডে 20টি উচ্চতর রিকোয়েস্ট ব্যারাস্ট করার অনুমতি দেবে।
৪. Spring Cloud Gateway Security কনফিগারেশন
Spring Cloud Gateway-এ সিকিউরিটি কনফিগার করতে OAuth2, JWT, অথবা Basic Authentication ব্যবহার করা যেতে পারে।
OAuth2 Security উদাহরণ
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR-CLIENT-ID
client-secret: YOUR-CLIENT-SECRET
scope: profile, email
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
client-name: Google
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
এটি OAuth2 ব্যবহার করে Google থেকে অথেন্টিকেশন এবং অথোরাইজেশন চালু করবে।
JWT Security উদাহরণ
spring:
cloud:
gateway:
routes:
- id: serviceA
uri: lb://serviceA
predicates:
- Path=/serviceA/**
filters:
- name: JwtTokenFilter
এটি JWT টোকেন যাচাই করার জন্য একটি কাস্টম ফিল্টার (যেমন JwtTokenFilter) ব্যবহার করবে।
৫. Spring Cloud Gateway ইন্টিগ্রেশন
Spring Cloud Gateway সাধারণত Eureka এবং Spring Cloud Discovery এর সাথে ইন্টিগ্রেট করা হয়। এটি সার্ভিস ডিসকভারি এবং ক্লায়েন্ট-সাইড লোড ব্যালান্সিং সাপোর্ট করে।
Eureka সার্ভিস ডিসকভারি ব্যবহার
Eureka সার্ভিস ডিসকভারি কনফিগার করুন যাতে Gateway সার্ভিসগুলোকে সার্ভিস রেজিস্ট্রির মাধ্যমে রাউট করতে পারে।
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka সার্ভার URL
এখানে discovery.locator.enabled: true সাপোর্ট করবে Eureka সার্ভিস ডিসকভারি। এটি সার্ভিস রেজিস্ট্রিতে থাকা সার্ভিসগুলিকে গেটওয়ে-তে রাউট করার জন্য সক্রিয় করবে।
৬. Spring Cloud Gateway এবং Eureka Integration উদাহরণ
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/orders/**
- id: product-service
uri: lb://product-service
predicates:
- Path=/products/**
এখানে, আমরা Eureka ব্যবহার করে order-service এবং product-service রাউট করেছি। lb:// (লোড ব্যালান্সার) প্রটোকল Eureka সার্ভিস ডিসকভারি সিস্টেম থেকে সার্ভিস ইন্সট্যান্সগুলি সনাক্ত করবে।
৭. Spring Cloud Gateway শুরু করা
Spring Cloud Gateway চালু করার জন্য, আপনাকে Spring Boot অ্যাপ্লিকেশন হিসেবে এটি রান করতে হবে:
mvn spring-boot:run # Maven ব্যবহারকারী
অথবা
./gradlew bootRun # Gradle ব্যবহারকারী
উপসংহার
Spring Cloud Gateway একটি শক্তিশালী API গেটওয়ে সমাধান, যা রাউটিং, ফিল্টারিং, সিকিউরিটি, রেট লিমিটিং এবং সার্ভিস ডিসকভারি সমর্থন করে। এটি মাইক্রোসার্ভিস আর্কিটেকচারের জন্য অত্যন্ত কার্যকরী, যেখানে একাধিক সার্ভিসের মধ্যে ট্রাফিক সেন্ট্রালাইজডভাবে পরিচালিত হয়। Spring Cloud Gateway সেটআপ করা এবং কনফিগার করা বেশ সহজ এবং এতে Spring Cloud-এর অন্যান্য কম্পোনেন্ট যেমন Eureka, OAuth2, JWT ইত্যাদি ইন্টিগ্রেশন করা যায়।
Spring Cloud Gateway একটি আধুনিক API গেটওয়ে যা Routing, Filters, এবং Predicates এর মাধ্যমে HTTP রিকোয়েস্টগুলিকে রাউট এবং পরিচালনা করতে সহায়তা করে। এর মাধ্যমে সার্ভিসগুলো সহজে রাউট করা যায়, ফিল্টারিং করা যায় এবং নির্দিষ্ট শর্তে কাজ করতে পারে। নিচে Routing, Filters, এবং Predicates এর ব্যবহার তুলে ধরা হয়েছে।
১. Routing
Routing এর মাধ্যমে API গেটওয়ে রিকোয়েস্টগুলোকে নির্দিষ্ট সার্ভিসের কাছে পাঠায়। Spring Cloud Gateway রাউটিং কনফিগারেশন application.yml ফাইলে করা হয়।
১.১ Routing কনফিগারেশন উদাহরণ:
spring:
cloud:
gateway:
routes:
- id: route1
uri: http://example-service:8081 # Destination service URI
predicates:
- Path=/service1/** # Path Predicate
filters:
- AddRequestHeader=X-Request-Foo, Bar
- id: route2
uri: http://another-service:8082
predicates:
- Path=/service2/** # Path Predicate
filters:
- AddRequestHeader=X-Request-Foo, Baz
এখানে দুটি রাউট তৈরি করা হয়েছে:
route1:/service1/**পাথে আসা রিকোয়েস্টগুলোexample-serviceএ রাউট করা হবে।route2:/service2/**পাথে আসা রিকোয়েস্টগুলোanother-serviceএ রাউট করা হবে।
২. Predicates
Predicates হল শর্ত যা রিকোয়েস্টের সাথে ম্যাচ করে এবং কোন রাউট নির্বাচন করা হবে তা নির্ধারণ করে। Spring Cloud Gateway-এ বিভিন্ন ধরনের Predicate রয়েছে, যা আপনি Path, Method, Host, Query, Header ইত্যাদি দ্বারা কনফিগার করতে পারেন।
২.১ Common Predicates:
Path Predicate: রিকোয়েস্ট URL পাথের উপর ভিত্তি করে রাউটিং সিদ্ধান্ত নেয়।
predicates: - Path=/service1/**Method Predicate: রিকোয়েস্ট মেথডের উপর ভিত্তি করে রাউট নির্বাচন করা হয় (যেমন:
GET,POST, ইত্যাদি)।predicates: - Method=POSTHost Predicate: রিকোয়েস্ট হোস্টনেমের উপর ভিত্তি করে রাউট নির্বাচন করা হয়।
predicates: - Host=example.comQuery Predicate: URL এর কুয়েরি প্যারামিটার দিয়ে রাউট নির্বাচন করা হয়।
predicates: - Query=param=valueHeader Predicate: রিকোয়েস্ট হেডারে নির্দিষ্ট ভ্যালু দিয়ে রাউট নির্বাচন করা হয়।
predicates: - Header=X-Request-Foo=Bar
২.২ Multiple Predicates:
একাধিক Predicates ব্যবহার করে একসাথে শর্ত দেওয়া যায়। প্রতিটি Predicate যেকোনো সময়ে OR বা AND শর্তে যুক্ত হতে পারে। একাধিক Predicate যোগ করতে:
predicates:
- Path=/service1/**
- Method=GET
- Header=X-Request-Foo=Bar
এটি রিকোয়েস্টের Path /service1/** হতে হবে, মেথড GET হওয়া উচিত এবং X-Request-Foo হেডারে Bar থাকতে হবে।
৩. Filters
Filters Spring Cloud Gateway-এ HTTP রিকোয়েস্ট এবং রেসপন্সে পরিবর্তন আনার জন্য ব্যবহৃত হয়। Filters ক্লায়েন্ট থেকে সার্ভারে যাওয়া রিকোয়েস্ট অথবা সার্ভার থেকে ক্লায়েন্টে যাওয়া রেসপন্সের ওপর কাজ করতে পারে।
৩.১ Filter Types:
- Global Filters: গ্লোবাল ফিল্টার সমস্ত রিকোয়েস্ট এবং রেসপন্সে প্রযোজ্য হয়।
- Route-specific Filters: নির্দিষ্ট রাউটের জন্য Filters প্রযোজ্য হয়।
৩.২ Common Filters:
AddRequestHeader: রিকোয়েস্ট হেডারে নতুন হেডার যোগ করে।
filters: - AddRequestHeader=X-Request-Foo, BarAddResponseHeader: রেসপন্স হেডারে নতুন হেডার যোগ করে।
filters: - AddResponseHeader=X-Response-Foo, BazSetPath: রিকোয়েস্টের পাথ পরিবর্তন করে।
filters: - SetPath=/newpath/**RewritePath: পাথ রাইটারে প্রি-ডিফাইন্ড পাথ দিয়ে রিকোয়েস্ট রাউট করে।
filters: - RewritePath=/service/(?<segment>.*), /new-service/${segment}RequestRateLimiter: রিকোয়েস্ট রেট লিমিটিং পরিচালনা করে।
filters: - RequestRateLimiter=redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20
৩.৩ Custom Filters:
Spring Cloud Gateway-এ আপনি কাস্টম ফিল্টার তৈরি করতে পারেন। উদাহরণস্বরূপ, একটি কাস্টম ফিল্টার যা রিকোয়েস্টে লগিং যোগ করবে:
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
public class LoggingFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Log the incoming request path
System.out.println("Request Path: " + exchange.getRequest().getURI().getPath());
return chain.filter(exchange);
}
}
এটি গেটওয়ে রিকোয়েস্টে প্রক্রিয়া শুরু হওয়ার আগে রিকোয়েস্টের পাথ লগ করবে। কাস্টম ফিল্টার স্প্রিং বুট অ্যাপ্লিকেশনের মধ্যে @Component অ্যানোটেশন দিয়ে রেজিস্টার করা যেতে পারে।
৪. Advanced Routing Example
Spring Cloud Gateway-এর ব্যবহার কনফিগারেশন উদাহরণ:
spring:
cloud:
gateway:
routes:
- id: route1
uri: http://service1:8080
predicates:
- Path=/api/service1/**
- Method=GET
- Header=X-Request-Foo=Bar
filters:
- AddRequestHeader=X-Request-Id, 12345
- AddResponseHeader=X-Response-Time, 67890
এটি /api/service1/** পাথ, GET মেথড এবং X-Request-Foo=Bar হেডার সহ রিকোয়েস্টগুলোর জন্য service1 সার্ভিসে রাউট করবে, এবং রিকোয়েস্ট এবং রেসপন্সে অতিরিক্ত হেডার যোগ করবে।
সারাংশ:
- Routing: Spring Cloud Gateway রিকোয়েস্টের পাথ, মেথড, হেডার, কুয়েরি প্যারামিটার ইত্যাদির মাধ্যমে রিকোয়েস্টকে নির্দিষ্ট সার্ভিসে রাউট করে।
- Predicates: শর্ত, যা রিকোয়েস্টের বৈশিষ্ট্য দ্বারা রাউট নির্বাচন করতে সহায়তা করে। যেমন,
Path,Method,Header,Host,Queryইত্যাদি। - Filters: রিকোয়েস্ট এবং রেসপন্সের উপর পরিবর্তন আনে, যেমন হেডার যোগ করা, রাউটিং পাথ পরিবর্তন করা, অথবা কাস্টম ফিল্টার তৈরি করা।
Spring Cloud Gateway এর মাধ্যমে আপনি শক্তিশালী API গেটওয়ে কনফিগারেশন করতে পারেন, যা কাস্টম রাউটিং, ফিল্টারিং এবং শর্তাবলী প্রদান করে, এর মাধ্যমে মাইক্রোসার্ভিসে রিকোয়েস্ট পরিচালনা করা হয়।
Spring Cloud API Gateway হল একটি শক্তিশালী এবং নমনীয় সমাধান যা বিভিন্ন মাইক্রোসার্ভিসের জন্য একটি একক প্রবেশদ্বার হিসেবে কাজ করে। এটি রিকোয়েস্ট রাউটিং, অথেনটিকেশন, রেট লিমিটিং, লোড ব্যালান্সিং, এবং আরও অনেক কাজ সহজে পরিচালনা করতে পারে। API Gateway-এর মাধ্যমে, ক্লায়েন্ট শুধুমাত্র একটি পয়েন্ট ব্যবহার করে একাধিক সার্ভিসে রিকোয়েস্ট পাঠাতে পারে।
এখানে আমরা Spring Cloud Gateway ব্যবহার করে API Gateway বাস্তবায়ন করার একটি উদাহরণ দেখবো।
Spring Cloud Gateway API Gateway বাস্তবায়ন উদাহরণ
এখানে আমরা দুটি সার্ভিস তৈরি করবো:
- Service A – একটি সাধারণ Spring Boot অ্যাপ্লিকেশন যা
/helloপাথের মাধ্যমে একটি বার্তা রিটার্ন করবে। - API Gateway – সার্ভিসগুলোর জন্য রিকোয়েস্ট রাউটিং করার জন্য একটি API Gateway।
১. Maven Dependencies
API Gateway (spring-cloud-starter-gateway)
API Gateway এ প্রয়োজনীয় ডিপেনডেন্সি:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</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>
Service A (spring-cloud-starter-eureka-client)
Service A এর জন্য মাইক্রোসার্ভিস রেজিস্ট্রেশন এবং ডিসকভারির জন্য ডিপেনডেন্সি:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-web</artifactId>
</dependency>
২. Service A তৈরি করা
Service A একটি সাধারণ Spring Boot অ্যাপ্লিকেশন হবে যা /hello পাথে একটি বার্তা রিটার্ন করবে।
Service A Controller:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceAController {
@GetMapping("/hello")
public String sayHello() {
return "Hello from Service A!";
}
}
Service A - application.yml:
spring:
application:
name: service-a
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
৩. Eureka Server তৈরি করা
Eureka Server হল একটি Service Discovery সার্ভিস যা সমস্ত মাইক্রোসার্ভিসকে রেজিস্টার করতে সহায়ক। API Gateway এবং Service A উভয় সার্ভিসই Eureka Server এর মাধ্যমে রেজিস্টার হবে।
Eureka Server - application.yml:
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
৪. API Gateway (Spring Cloud Gateway) তৈরি করা
এখন আমরা একটি API Gateway তৈরি করবো যা Service A থেকে রিকোয়েস্ট রাউট করবে। এখানে আমরা Spring Cloud Gateway ব্যবহার করব, যা মাইক্রোসার্ভিসের জন্য একটি একক রাউটিং পয়েন্ট হিসেবে কাজ করবে।
API Gateway Controller (Gateway Configuration):
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.UriComponentsBuilder;
@Configuration
public class GatewayConfig {
@Bean
public FilterRegistrationBean<GatewayFilter> myFilter() {
FilterRegistrationBean<GatewayFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new GatewayFilter());
registrationBean.addUrlPatterns("/service-a/**");
return registrationBean;
}
}
API Gateway - application.yml:
spring:
application:
name: api-gateway
server:
port: 8080
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
cloud:
gateway:
routes:
- id: service-a-route
uri: lb://service-a # Load-balanced URI for Service A
predicates:
- Path=/service-a/** # Match requests to /service-a/**
এখানে lb://service-a দিয়ে Ribbon লোড ব্যালান্সিং ব্যবহার করা হচ্ছে। এতে API Gateway ক্লায়েন্ট-সাইড লোড ব্যালান্সিং সহ Service A-এ রিকোয়েস্ট রাউট করবে।
৫. Service A এবং API Gateway কে Eureka Server এর সাথে রেজিস্টার করা
আমরা Service A এবং API Gateway উভয় সার্ভিসকে Eureka Server এর সাথে রেজিস্টার করতে পারবো যাতে তারা একে অপরকে ডিসকভার করতে পারে।
API Gateway - application.yml (Eureka Client Configuration):
spring:
application:
name: api-gateway
server:
port: 8080
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Service A - application.yml (Eureka Client Configuration):
spring:
application:
name: service-a
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
৬. সার্ভিস চালানো
প্রথমে Eureka Server চালু করুন:
mvn spring-boot:run -Dspring-boot.run.profiles=eurekaতারপর Service A চালু করুন:
mvn spring-boot:run -Dspring-boot.run.profiles=service-aএরপর API Gateway চালু করুন:
mvn spring-boot:run -Dspring-boot.run.profiles=api-gateway
৭. API Gateway রাউটিং
এখন আপনি API Gateway-এর মাধ্যমে Service A থেকে রিকোয়েস্ট ফেচ করতে পারবেন।
Service A-এর /hello পাথটি রাউট করতে API Gateway-এর /service-a/hello পাথ ব্যবহার করুন।
API Gateway - /service-a/hello পাথ টেস্ট করা:
GET http://localhost:8080/service-a/hello
এটি Service A থেকে "Hello from Service A!" বার্তা রিটার্ন করবে।
৮. সার্ভিস ডিসকভারি এবং লোড ব্যালান্সিং
যেহেতু Eureka সার্ভিস ডিসকভারি ব্যবহার করা হচ্ছে এবং API Gateway লোড ব্যালান্সিং সহ Ribbon ব্যবহার করে রিকোয়েস্ট রাউট করছে, Service A এর একাধিক ইনস্ট্যান্স যোগ করা হলে, API Gateway সেগুলির মধ্যে রিকোয়েস্টগুলি ব্যালান্স করবে।
Conclusion
এভাবে, Spring Cloud Gateway ব্যবহার করে আপনি একটি API Gateway বাস্তবায়ন করতে পারেন যা আপনার সমস্ত মাইক্রোসার্ভিসের জন্য একটি একক প্রবেশপথ হিসেবে কাজ করবে। এটি Service Discovery, Routing, Load Balancing, এবং আরও অনেক গুরুত্বপূর্ণ ফিচার সরবরাহ করে। Spring Cloud Gateway ব্যবহার করে API গুলির রাউটিং এবং বিভিন্ন মাইক্রোসার্ভিসের মধ্যে যোগাযোগ আরও সহজ এবং কার্যকর হয়ে ওঠে।
Read more