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

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

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

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

নিচে উভয়ের একটি তুল্যমূল্য তালিকা দেয়া হলো গ্রাহক হতে পরিসেবক ক্রমে :
 উদ্বেগগুলো স্প্রিং ক্লাউড - নেটফ্লিক্স OSS গুগল কুবেরনেটেস প্রাক সার্ভার পর্ব এপিআই গেটওয়ে: এপিআই গেটওয়েগুলি ফেসডগুলি বাস্তবায়ন , প্রক্সিিং - প্রোটোকল অনুবাদ এবং অন্যান্য পরিচালনার কাজগুলির মতো অতিরিক্ত পরিষেবা সরবরাহ করে।  Spring Cloud Zuul provides configuration-based API facades Kubernetes Service and Ingress resources, Istio, Ambassador are solutions that provide both north-south (traffic into and out of data center) as well as east-west (traffic across data centers or clouds or regions) API gateway functions. নিরাপত্তা জনিত: Many security concerns are pushed to the API gateway implementation. With distributed microservice applications, it makes sense to not reinvent the security wheel and allow for policy definition and implementation in components that are shared by all services. Spring Cloud Security addresses many security concerns through Spring Cloud Zuul The Kubernetes ecosystem provides service meshes like Istio, which are capable of providing security through their API gateway mechanisms. ভারসাম্যতা: The key to scaling a distributed system is being able to run more than one instance of a component. Load has to be then distributed across those instances via a load balancer. Spring Cloud Ribbon provides the ability for service clients to load balance across instances of the service. Kubernetes Service provides the ability for the service to be load-balanced across service instances. This is not the equivalent of what Ribbon provides. সার্ভার পর্ব কনফিগারেশন পরিচালনা: একটি মাইক্রোপরিষেবা অ্যাপ্লিকেশন জন্য কনফিগারেশনকে কোড থেকে বহিরাগত করা প্রয়োজন এবং সেটি যেন হয় একটি সাধারণ পরিষেবা কল মাধ্যমে পুনরুদ্ধারযোগ্য। Spring Config Server, Netflix Archaius both support a Git-repository—based location for configuration. Archaius supports data typing of configuration. Kubernetes ConfigMaps exposes the configuration stored in etcd via services. Kubernetes Secrets supports the service-based secure deployment and usage of sensitive configuration information (such as passwords, certificates, etc.). কেন্দ্রীভূত লগিং: পরিষেবাগুলির আধিক্য পরিচালনা করতে কেন্দ্রীয়ভাবে লগ সংগ্রহ এবং বিশ্লেষণের অবকাঠামো থাকা জরুরি - যার মধ্যে অনেকগুলি বিস্তৃত ধরনে কাজ করছে। ELK Stack (ইলাস্টিক সার্চ, লগস্ট্যাশ, কিবানা) EFK Stack (Elasticsearch, Fluentd, Kibana) ট্রেসিং: Per-process logging and metric monitoring have their place, but neither can reconstruct the complex paths that transactions take as they propagate across a distributed system. Distributed tracing is an essential tool for a microservices platform. Spring Cloud Sleuth, Zipkin Hawkular পরিষেবা পর্ব পরিষেবা আবিষ্কার: কোনও মাইক্রোপরিষেবা ডোমেনের মধ্যে কাজের জন্য উপলব্ধ পরিষেবাগুলির তালিকা বজায় রাখতে।  Spring Cloud Eureka allows clients to register to it, maintains a heartbeat with registered clients, and maps service names to hostnames for clients that look up services by service name. Kubernetes Services provide deployment-time registration of instances of services that are internally available within the cluster. Ingress is a mechanism whereby a service can be exposed to clients outside the cluster. অটো কনফিগারেশনে আন্তঃ পরিষেবা সংহতকরণ:   স্প্রিং -ওপেন ফেইগন প্রকল্পটি স্বতঃসিদ্ধকরণের মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশনগুলির সংহতকরণ সরবরাহ করে এবং স্প্রিং এনভায়রনমেন্ট এবং অন্যান্য স্প্রিং প্রোগ্রামিং মডেল আইডিয়ামগুলিকে আবদ্ধ করে। - স্থিতিস্থাপকতা এবং দোষ সহনশীলতা - বর্তনী ভঙ্গক: বিতরণকারী সিস্টেমগুলি অবশ্যই ব্যর্থতার ক্ষেত্র থেকে তার পরবর্তীতে অটো-রাউটিং করতে সক্ষম হতে হবে এবং পরিষেবা দৃষ্টান্তের জন্য অনুরোধগুলি রাউটিং করতে সক্ষম হবে যা ন্যূনতম প্রতিক্রিয়া সরবরাহ করবে। Spring Hystrix, Turbine, & Ribbon Health check, service meshes (example: Istio) সেন্ট্রালাইজড মেট্রিক্স: A centralized area where the health and performance of the individual services and overall system can be monitored is essential to proper operations. Spring Spectator & Atlas Heapster, Prometheus, & Grafana অটো-স্কেলিং এবং স্ব-নিরাময়: Distributed systems respond to higher load by scaling horizontally: the platform must detect and auto-respond to such conditions. Furthermore, the system needs to detect failures and attempt auto-restarts without operator input. - Health check, self-healing and auto-scaling প্যাকেজিং, নিবেশ এবং ক্রমপরিকল্পনা : Large-scale systems require robust package management, and deployment systems to manage rolling or blue-green deployments, and rollbacks if necessary. A scheduler helps determine which particular execution node a new set of services can be deployed to based on current conditions. Spring Boot, Apache Maven. The Spring Cloud system does not have a true scheduler. Docker, Rkt, Kubernetes Scheduler & Deployment, Helm Job management: scheduled computations disconnected from any individual user requests. Spring Batch Kubernetes Jobs and Scheduled Jobs Singleton application: limit a specific service to run as the only instance of that service within the entire system. Spring Cloud Cluster Kubernetes Pods

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

স্প্রিং ক্লাউড - নেটফ্লিক্স OSS
600px|MSA Reference Architecture
প্যাকেজিং, স্থাপনা এবং সময়সূচী
এই ক্ষেত্রে স্প্রিং বুট এপ্লিকেশন এ স্প্রিং ক্লাউড প্রোপারটিস যুক্ত করতে হবে :
     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

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

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

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

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

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

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

আরও দেখুন

তথ্যসূত্র

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