মাইক্রোপরিষেবা

**মাইক্রোপরিষেবা (Microservices)** একটি সফ্টওয়্যার ডেভলপমেন্ট টেকনিক এবং পরিষেবা ভিত্তিক স্থাপত্য (এসওএ) স্টাইলের একটি বৈকল্পিক যা কোনও অ্যাপ্লিকেশনকে আলগাভাবে যুগল পরিষেবাগুলির সংগ্রহ হিসাবে কাঠামো করে। একটি মাইক্রোসার্ভেসেস আর্কিটেকচারে, পরিষেবাদিগুলি বিস্তৃতযুক্ত এবং প্রোটোকলগুলি হালকা হয়। বিভিন্ন ছোট পরিষেবাগুলিতে একটি অ্যাপ্লিকেশন পচানোর সুবিধা হ'ল এটি পরিমিতি উন্নত করে। এটি অ্যাপ্লিকেশনটিকে বোঝা, বিকাশ, পরীক্ষা করা এবং আর্কিটেকচার ক্ষয়ের ক্ষেত্রে আরও স্থিতিশীল হয়ে ওঠে  এটি ক্ষুদ্র স্বায়ত্তশাসিত সদস্য গুলিকে তাদের নিজ নিজ পরিষেবাদিগুলি স্বাধীনভাবে বিকাশ, মোতায়েন এবং স্কেল করে সক্ষম করে উন্নয়নের সাথে সমান্তরাল করে তোলে।  এটি ক্রমাগত রিফ্যাক্টরিংয়ের মাধ্যমে কোনও পৃথক পরিষেবার আর্কিটেকচারকে উত্থিত করার অনুমতি দেয়  মাইক্রোসারওয়াস-ভিত্তিক স্থাপত্যগুলি অবিচ্ছিন্ন বিতরণ এবং স্থাপনার সুবিধার্থে। 

## ইতিহাস
২০১১ সালের মে মাসে ইতালীর ভেনিস শহরে সফটওয়্যার বিষয়ক সম্মেলনে এর প্রথম প্রকাশ বলে মনে করা হয়।  যদিও আজ অব্দি এর কোনো সংজ্ঞা নথি নেই।

## প্রযুক্তি
* গুগল কুবেরনেটেস (গভর্নর) - বহুভাষিক পরিষেবা জাল তত্ত্ব 
* স্প্রিং ক্লাউড - নেটফ্লিক্স  - জাভা নির্ভর

নিচে উভয়ের একটি তুল্যমূল্য তালিকা দেয়া হলো গ্রাহক হতে পরিসেবক ক্রমে :

## প্লাটফর্ম
* উইন্ডোজ আজুরে
* আমাজন ওয়েব সার্ভিস
* রেডহ্যাট ওপেনসিফ্ট 
* ক্লাউড ফাউন্ডরী (পিভোটল সফটওয়্যার দ্বারা)

## স্প্রিং ক্লাউড - নেটফ্লিক্স OSS

### প্যাকেজিং, স্থাপনা এবং সময়সূচী
এই ক্ষেত্রে স্প্রিং বুট এপ্লিকেশন এ স্প্রিং ক্লাউড প্রোপারটিস যুক্ত করতে হবে :
 
    org.springframework.cloud
    spring-cloud-dependencies
    Dalston.RELEASE
    pom
    runtime
 

application.properties ফাইলে এপ্লিকেশন এর নাম ও পোর্ট নির্দিষ্ট হবে নিম্ন রূপ :
 server.port = *পোর্ট* 
 spring.profiles.active=dev
 spring.application.name = *এপ্লিকেশন নাম*

### স্প্রিং -ওপেন ফেইগন
অটো কনফিগারেশনে আন্তঃ পরিষেবা সংহতকরণ ক্ষেত্রে ব্যবহৃত হয়। ফেইন একটি এপিআই, জ্যাকস-আরএস, জ্যাকসন, জিএসএন, স্যাক্স, জ্যাকস-বি, ওকএইচটিপি, রিবন, হাইস্ট্রিক্স, এসএলএফ 4 জে এবং আরও অনেক কিছু যেমন, API এর জন্য একটি সমৃদ্ধ ইন্টিগ্রেশন সরবরাহ করে, পরিষেবার চুক্তিগুলি ইন্টারফেস এবং টীকাগুলি ব্যবহার করে নির্দিষ্ট করা হয়। স্প্রিং ক্লাউড সহজেই ফিগেন এবং রিবনকে সংহত করতে সহায়তা করে । রেস্টছাঁচ এর তুলনায় এটি অনেক সহজ। এর জন্য করতে হবে :
গ্রাহকের pom.xml  এ :
 
    org.springframework.cloud
    spring-cloud-starter-openfeign
 

গ্রাহকের প্রধান ক্লাস এ :
  @EnableFeignClients(*প্যাকেজ এর নাম যেখানে গ্রাহক মেথড খোঁজা হবে*)

যেখানে ফেইগন গ্রাহক সক্রিয় করা হয়েছে সেখানের সামগ্রিক নিয়ন্ত্রণ পেতে উক্ত গ্রাহকেই একটি ইন্টারফেসের মাধ্যমে করতে হবে যার ওপর ফেইগন গ্রাহক টিকা থাকবে। ইন্টারফেস তৈরিতে :
 @FeignClient(name = *পরিসেবক এপ্লিকেশন এর নাম*, url = "হোস্ট ও পোর্ট")
 public interface ABC {
     *পরিসেবক মেথডের স্বাক্ষর *
 }

### গ্রাহক প্রান্ত লোড ব্যালেন্সার
নেটফ্লিক্স রিবন গ্রাহক প্রান্ত লোড ব্যালেন্সার সুবিধা দিয়ে থাকে। গ্রাহকের pom.xml  এ :
 
    org.springframework.cloud
    spring-cloud-starter-ribbon
 

মূল গ্রাহকে একটি ফেইগন গ্রাহক ইন্টারফেস তৈরিতে :
 @FeignClient(name = *পরিসেবক এপ্লিকেশন এর নাম*)
 @RibbonClient(name = *পরিসেবক এপ্লিকেশন এর নাম*)
 public interface ABC {
     *পরিসেবক মেথডের স্বাক্ষর *
 }

যে গ্রাহক ভারসাম্যতার পরিষেবা নেবে তার appplication .properties এ :
 পরিসেবক এপ্লিকেশন এর নাম.ribbon.listOfServers=localhost:পোর্ট১,localhost:পোর্ট২,localhost:পোর্ট৩

### পরিষেবা আবিষ্কার
নেটফ্লিক্স ইউরেকা সমস্ত সুলভ পরিষেবার তালিকা রাখে এবং প্রয়োজন অনুযায়ী তা সরবরাহ করে । এটি সম্পূর্ণ আলাদা একটি পরিষেবা তৈরী করে তার  pom.xml  এ :
 
    org.springframework.cloud
    spring-cloud-starter-eureka-server
 

মূল মেথডে  :
 @SpringBootApplication
 @EnableEurekaServer
 public class ABC {
 }

অন্য পরিষেবাগুলোকে ইউরেকায় নথিভুক্ত করতে তাদের pom.xml এ :
 
    org.springframework.cloud
    spring-cloud-starter-eureka
 

শিশু পরিষেবার প্রধান মেথডে :
 @SpringBootApplication
 @EnableDiscoveryClient
 public class EFG {
 }

শিশু পরিষেবার appplication .properties এ :
 eureka.client.service-url.default-zone=ইউরেকা সার্ভার পরিষেবার ইউআরএল

এই ক্ষেত্রে আর ফেইগন এর প্রয়োজন পড়বে না। রিবন ইউরেকার মাধ্যমে সরাসরি অন্য পরিষেবার সাথে যোগাযোগ করবে।

যদি কোনো পরিষেবা ইউরেকা ভুক্ত না হতে চায় তবে 
 eureka.client.register-with-eureka=false

### এপিআই গেটওয়ে
মাইক্রোপরিষেবার বাইরের জগতের জন্য কোনো মাইক্রোপরিষেবা বাস্তুতন্ত্রে প্রবেশের পথ হিসেবে থাকে এপিআই গেটওয়ে। নেটফ্লিক্স জুওল  এই সুবিধা অর্জনে সহায়তা করে । এ ক্ষেত্রে একটি সম্পূর্ণ আলাদা একটি পরিষেবা তৈরী করা হয় যেটি বাকি সমস্ত এপ্লিকেশন এর সঙ্গে সমন্বয় করবে এবং প্রান্তিক ব্যবহারকারীর সাথে যোগাযোগ থাকবে। তার  pom.xml  এ :
 
    org.springframework.cloud
    spring-cloud-starter-zuul
 

মূল মেথডে  :
 @SpringBootApplication
 @EnableZuulProxy 
 public class ABC {
 }

জুওল এর সাহায্যে ফিল্টার প্রয়োগ। প্রধান জাভা ক্লাস এর সাথে একটি জুওলফিল্টার ক্লাস তৈরী হবে। 
 public class ABCFilter extends ZuulFilter {  
  @Override 
  public int filterOrder() {
   return 1; // run before PreDecoration
  }
  @Override
  public String filterType() {
   return PRE_TYPE; *এক অর্থ এটি রিকোয়েস্ট পাঠানোর আগে পরিখ্হিত হবে *
  }
  @Override
  public boolean shouldFilter() {
   return true ;
  }
  @Override
  public Object run() {
   RequestContext ctx = RequestContext.getCurrentContext();
   HttpServletRequest request = ctx.getRequest();
   return null;
  }
 }

* PRE : অনুরোধটি রুট হওয়ার আগে প্রাক ফিল্টারগুলি কার্যকর করা হয়,
* ROUTE : রুট ফিল্টারগুলি অনুরোধটির আসল রাউটিং পরিচালনা করতে পারে,
* POST :অনুরোধটি সরানোর পরে পোস্ট ফিল্টারগুলি কার্যকর করা হয় এবং।
* ERROR :অনুরোধটি পরিচালনা করার সময় কোনও ত্রুটি ঘটলে ত্রুটি ফিল্টারগুলি কার্যকর করা হয়।

যদি এমনটি দরকার হয় যে কোনো পরিষেবা ওপর পরিষেবার সাথে সরাসরি যোগাযোগ না করে জুওল এর মাধ্যমে সংযোগ স্থাপন করতে চায় তবে সেক্ষেত্রে জুওল এপ্লিকেশন নামটি ফেইগন এ ব্যবহার করতে হবে।

সকেট টাইমআউটগুলি কনফিগার করতে হয় এবং জুহুলের মাধ্যমে প্রক্স করা অনুরোধগুলির জন্য টাইমআউটগুলি পড়তে হয় তবে  কনফিগারেশনের উপর ভিত্তি করে  দুটি বিকল্প রয়েছে:
 zuul.host.connect-timeout-millis 
 zuul.host.socket-timeout-millis

### বিতরণ ট্রেসিং
স্প্রিং ক্লাউড স্লুথ হচ্ছে জিপকিন, এইচরাস এবং লগ-ভিত্তিক ট্রেসিংয়ের সাথে সামঞ্জস্যপূর্ণ স্প্রিং ক্লাউড অ্যাপ্লিকেশনগুলির জন্য বিতরণ করা ট্রেসিং। সাধারণ বিতরণযোগ্য ট্রেসিং ডেটা মডেলগুলির উপর বিমূর্ততা সরবরাহ করে। এটি অভিন্ন আইডি প্রদান করে থাকে। স্লুথ প্রতিটি রিকোয়েস্টের জন্য ২ ধরনের আইডি দিয়ে থাকে 
# স্প্যান আইডি ( বেসিক কাজের ) 
# ট্রেস আইডি (স্প্যান আইডি এর বৃক্ষসূলভ সমন্বয় )

স্লুথ নিবেশ করতে প্রতিটি পরিষেবার  pom.xml  এ :
 
    org.springframework.cloud
    spring-cloud-starter-sleuth
 

কনসোলে প্রিন্ট হবে নিম্নরূপ : [ *এপ্লিকেশন নাম*, *ট্রেস আইডি*,*স্প্যান আইডি* ]

### কেন্দ্রীভূত ট্রেসিং
জিপকিন একটি কেন্দ্রীভূত ট্রেসিং সিস্টেম । জিপকিন তার নিজস্সো পাতায় সেগুলোকে দেখতে ও পর্যালোচনা করতে সাহায্য করে। কোনও পরিষেবাতে ব্যয় করা সময়ের শতাংশ, এবং অপারেশনগুলি ব্যর্থ হয়েছে কি না তা সংক্ষেপিতভাবে প্রকাশ করা হবে।  জিপকিন নিবেশ করতে একটি পরিষেবা তৈরী করে তার pom.xml  এ :
 
    io.zipkin.java
    zipkin-server
 
 
    io.zipkin.java
    zipkin-autoconfigure-ui
 

মূল মেথডে  :
 @SpringBootApplication
 @EnableZipkinServer 
 public class ABC {
 }

জিপকিন-এ লগ পাঠাতে শিশু পরিষেবার pom.xml  এ :
 
   org.springframework.cloud
   spring-cloud-sluth-zipkin 
 

শিশু পরিষেবার প্রধান মেথডে :
 @Bean
 public AlwaysSampler alwaysSampler() {
        return new AlwaysSampler();
 }
 
কনসোলে প্রিন্ট হবে নিম্নরূপ : [*এপ্লিকেশন নাম*, *ট্রেস আইডি*,*স্প্যান আইডি*,*true* ]

### দোষ সহনশীলতা
pom.xml  এ :
 
   org.springframework.cloud
   spring-cloud-sluth-hystrix 
 

পরিষেবা মেথডে  :
 @RestController
 @EnableHystrix  
 public class ABC {
  @HystrixCommand(fallbackMethod = "call_Fallback")
  public String callData() {
   return null;
  }
  public String call_Fallback() {
   return null;
  }
 }

### কনফিগারেশন পরিচালনা
প্রধান মেথডে :
 @EnableConfigServer

#### রিপোসিটোরি
গিট্ রিপোসিটোরি সংযুক্ত করতে application.properties এ :
 spring.cloud.config.server.git.uri=*গিট্ লোকাল রিপোসিটোরি লোকেশন*
 
#### রেস্ট প্রান্তিক
কোনো ডিফল্ট ভ্যালুর জন্য পরিষেবার  application.properties এ :
 *প্রকল্পের নাম*.ভ্যালুনাম=ভ্যালু

একটি ক্লাসে ডিফল্ট ভ্যালুর গেটার -সেটার তৈরী করতে হবে @ConfigurationProperties এর মাধ্যমে

#### এক্যুয়েটর
অ্যাকিউউটর মূলত চলমান অ্যাপ্লিকেশন সম্পর্কে পরিচালিত তথ্য প্রকাশের জন্য ব্যবহৃত হয়

* / স্বাস্থ্য - অ্যাপ্লিকেশন স্বাস্থ্য তথ্য দেখায় (অনুমোদনহীন সংযোগ বা সম্পূর্ণ বার্তার বিবরণ অ্যাক্সেস করা হলে একটি সাধারণ 'স্ট্যাটাস'); এটি ডিফল্টরূপে সংবেদনশীল নয়
* / তথ্য - স্বেচ্ছাসেবী অ্যাপ্লিকেশন তথ্য প্রদর্শন করে; ডিফল্ট হিসাবে সংবেদনশীল না
* / মেট্রিক্স - বর্তমান অ্যাপ্লিকেশনটির জন্য ‘মেট্রিকস’ তথ্য দেখায়; এটি ডিফল্টরূপে সংবেদনশীলও
* / ট্রেস - ট্রেস তথ্য প্রদর্শন করে (ডিফল্টরূপে শেষ কয়েকটি এইচটিটিপি অনুরোধ)

স্ব-প্রনোদিত ভাবে এপ্লিকেশন রিস্টার্ট না করে প্রোপারটিস তুলতে application.properties এ :
 management.security.enabled = false

#### ক্লাউড বাস
স্ব-প্রনোদিত ভাবে এপ্লিকেশন রিস্টার্ট না করে প্রোপারটিস তুলতে এক্ষেত্রে রাবিট MQ ব্যবহার হচ্ছে। pom.xml এ :
 
  org.springframework.cloud
  spring-cloud-starter-bus-amqp 
 

ডিফল্ট url রাবিট MQ র জন্য :
 localhost:15672

এম্পটি রিফ্রেশ লিঙ্ক হবে 
 localhost:পোর্ট/bus/refresh

এক্ষেত্রে সমস্ত পরিষেবায় রিফ্রেশ করতে হচ্ছে না।

## [[পরিষেবা ভিত্তিক স্থাপত্য]]-এর সাথে পার্থক্য

* পরিষেবা গ্রানুলারিটি : মাইক্রোপরিষেবার ক্ষেত্রে প্রতিটি পরিষেবা একক উদ্দেশ্যে গঠিত। পরিষেবা ভিত্তিক স্থাপত্য-এ তা একটি ক্ষুদ্র পরিষেবা থেকে খুব বড় এন্টারপ্রাইজ পরিষেবা হতে পারে।
* অণুঅংশ বিনিময়ভাগ : মাইক্রোপরিষেবার ক্ষেত্রে পার্শবর্তী পরিষেবাগুলোর মধ্যে অণুঅংশ যতটা কম পারা যায় বিনিময় করার নীতি নিয়ে চলা হয় । পরিষেবা ভিত্তিক স্থাপত্য-এ তা বিপরীতধর্মী , যতটা বেশি সম্ভব বিনিময় করার নীতি নিয়ে চলে ।

## বিতর্ক
বেশ কিছু ক্ষেত্রে এই স্থাপত্য নিয়ে বিতর্ক সৃষ্টি হয়েছে :

* পরিষেবাগুলি তথ্য বাঁধা সৃষ্টি করে। 
* নেটওয়ার্কের বিলম্বতা এবং বার্তা প্রক্রিয়াকরণের সময়ের ক্ষেত্রে নেটওয়ার্কে আন্তঃ-পরিষেবা কলগুলি বেশি ব্যায়বহুল। 
* টেস্টিং ও ডিপ্লয়মেন্ট প্রক্রিয়া জটিল। 
* যেহেতু পরিষেবাগুলো বিভিন্ন সদস্যের দ্বারা গঠিত তাই কোনো অংশ এক পরিষেবা থেকে অন্য পরিষেবায় স্থানান্তর করা কঠিন।

এই স্থাপত্ত্যে অপারেশনাল জটিলতা তৈরী হয়। এছাড়া অধিক সংখ্যায় সংযোগক্ষেত্র থাকলে সেটা স্থাপত্য জটিলতা সৃষ্টি করে।

## আরও দেখুন

## তথ্যসূত্র

বিষয়শ্রেণী:সফটওয়্যার নির্মাণ
বিষয়শ্রেণী:প্রোগ্রামিং ঘরানা
বিষয়শ্রেণী:সেবামুখিতা