{"id":31584,"date":"2021-06-02T09:43:30","date_gmt":"2021-06-02T07:43:30","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/systemy-rozproszone-niezalezne-od-platformy-wprowadzenie-do-dapr-io\/"},"modified":"2024-09-10T16:15:42","modified_gmt":"2024-09-10T14:15:42","slug":"systemy-rozproszone-niezalezne-od-platformy-wprowadzenie-do-dapr-io","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/systemy-rozproszone-niezalezne-od-platformy-wprowadzenie-do-dapr-io\/","title":{"rendered":"Systemy rozproszone niezale\u017cne od platformy \u2013  wprowadzenie do Dapr.io"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\"><\/p>\n    <ol>\n                    <li><a href=\"#Architektura-mikrouslug-i-jej-wyzwania\">1.  Architektura mikrous\u0142ug i jej wyzwania<\/a><\/li>\n                    <li><a href=\"#Dapr-budowa-z-klockow-systemow-rozproszonych-niezaleznych-od-platformy\">2.  Dapr &#8211; budowa z klock\u00f3w system\u00f3w rozproszonych niezale\u017cnych od platformy<\/a><\/li>\n                    <li><a href=\"#Bloki-konstrukcyjne\">3.  Bloki konstrukcyjne<\/a><\/li>\n                    <li><a href=\"#Aplikacje-rozproszone-a-Dapr-podsumowanie\">4.  Aplikacje rozproszone a Dapr &#8211; podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Architektura-mikrouslug-i-jej-wyzwania\">Architektura mikrous\u0142ug i jej wyzwania<\/h2>\n\n\n\n<p>Budowa rozproszonych system\u00f3w w architekturze <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it\/\">mikrous\u0142ug<\/a> (<em>ang. microservices<\/em>) rozwi\u0105zuje problemy z dost\u0119pno\u015bci\u0105, skalowalno\u015bci\u0105, zwi\u0119ksza nasz\u0105 elastyczno\u015b\u0107 oraz skraca czas dostarczenia nowej funkcjonalno\u015bci na rynek, co jest istotnym aspektem projekt\u00f3w rozwoju oprogramowania. Natomiast z\u0142o\u017cono\u015b\u0107 takich system\u00f3w wymaga wiedzy, jak radzi\u0107 sobie z takimi wyzwaniami jak rozproszone transakcje, r\u00f3wnowa\u017cenie obci\u0105\u017cenia, przechowywanie stanu, monitoring, komunikacja pomi\u0119dzy us\u0142ugami oraz jej bezpiecze\u0144stwo. W konsekwencji programi\u015bci cz\u0119\u015b\u0107 swojego czasu musz\u0105 przeznaczy\u0107 na podejmowanie decyzji o wyborze narz\u0119dzi, wzorc\u00f3w i rozwi\u0105zywanie problem\u00f3w, kt\u00f3re nie maj\u0105 bezpo\u015bredniego zwi\u0105zku z implementacj\u0105 logiki biznesowej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Dapr-budowa-z-klockow-systemow-rozproszonych-niezaleznych-od-platformy\">Dapr &#8211; budowa z klock\u00f3w system\u00f3w rozproszonych niezale\u017cnych od platformy<\/h2>\n\n\n\n<p>W odpowiedzi na te wyzwania w pa\u017adzierniku 2019 roku Microsoft powo\u0142a\u0142 do \u017cycia na platformie GitHub (<a href=\"https:\/\/github.com\/dapr\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/dapr<\/a>) projekt open source Dapr (Distributed Application Runtime), kt\u00f3rego pierwsza stabilna wersja przeznaczona do u\u017cytku produkcyjnego zosta\u0142a wydana w lutym 2021&nbsp;roku. Zgodnie z przyj\u0119tym mottem \u201cAny language, any framework, run anywhere\u201d kluczow\u0105 cech\u0105 Dapr jest niezale\u017cno\u015b\u0107 od j\u0119zyka programowania oraz \u015brodowiska, w kt\u00f3rym mikrous\u0142ugi s\u0105 uruchamiane. Stanowi on zbi\u00f3r dobrych praktyk (wzorc\u00f3w projektowych) zaimplementowanych w formie niezale\u017cnych blok\u00f3w konstrukcyjnych (<em>ang. building blocks<\/em>) udost\u0119pnianych z wykorzystaniem wzorca przyczepy (<em>ang. sidecar<\/em>). Wielu programist\u00f3w nurtuje&nbsp; pytanie \u201eCzy Dapr to Service Mesh?\u201d. Podczas gdy narz\u0119dzia Service Mesh takie jak Istio, Linkerd czy OSM u\u0142atwiaj\u0105 komunikacj\u0119 pomi\u0119dzy mikrous\u0142ugami za pomoc\u0105 sidecar proxy, zadaniem DAPR jest raczej wspieranie developer\u00f3w buduj\u0105cych aplikacje rozproszone.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce:<\/strong> <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/service-mesh-ale-komu-to-potrzebne\/\"><strong>Service Mesh \u2013 ale komu to potrzebne.<\/strong><\/a><\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_02.06_graphic_1-1024x583-1.png\" alt=\"DAPR w systemach rozproszonych\" class=\"wp-image-34834\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Wzorzec przyczepy<\/h3>\n\n\n\n<p>Wzorzec przyczepy jest jednow\u0119z\u0142owym wzorcem sk\u0142adaj\u0105cym si\u0119 z dw\u00f3ch kontener\u00f3w: aplikacji (zawieraj\u0105cego logik\u0119 biznesow\u0105) i przyczepy. Zadaniem kontenera przyczepy jest rozszerzanie (udost\u0119pnianie nowej funkcjonalno\u015bci) i usprawnienie kontenera aplikacji. Zalet\u0105 korzystania z tego wzorca jest modu\u0142owo\u015b\u0107 oraz mo\u017cliwo\u015b\u0107 ponownego wykorzystania komponent\u00f3w u\u017cytych jako przyczepy. U\u0142atwia on r\u00f3wnie\u017c integracj\u0119 ze starszymi rozwi\u0105zaniami bez konieczno\u015bci ingerencji w ich kod.<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_02.06_graphic_2-1024x415-1.png\" alt=\" class=\" class=\"wp-image-34835\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Kontener lub proces (Dapr nie jest zale\u017cny od Kubernetesa i mo\u017ce by\u0107 uruchamiany niezale\u017cnie nawet na urz\u0105dzeniach brzegowych) przyczepy Dapr udost\u0119pnia kontenerowi\/procesowi aplikacji uniwersalne API do poszczeg\u00f3lnych blok\u00f3w konstrukcyjnych. Komunikacja odbywa za pomoc\u0105 protoko\u0142\u00f3w HTTP\/gRPC. Wykorzystanie blok\u00f3w konstrukcyjnych nie wymaga zatem umieszczania w kodzie aplikacji \u017cadnych zale\u017cno\u015bci do Dapr, a integracja odbywa si\u0119 w trakcie uruchamiania kodu, a nie kompilacji. Dodatkowo, aby uczyni\u0107 proces bardziej intuicyjnym, Dapr udost\u0119pnia SDK dla takich j\u0119zyk\u00f3w, jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go<\/li>\n\n\n\n<li>Java<\/li>\n\n\n\n<li>JavaScript<\/li>\n\n\n\n<li>Python<\/li>\n\n\n\n<li>.NET<\/li>\n\n\n\n<li>PHP<\/li>\n\n\n\n<li>C++<\/li>\n<\/ul>\n\n\n\n<p>Takie podej\u015bcie umo\u017cliwia r\u00f3wnie\u017c aplikacjom skorzystanie z rozwi\u0105za\u0144\/wzorc\u00f3w niedost\u0119pnych w j\u0119zyku, w kt\u00f3rym zosta\u0142y napisane. Przyk\u0142adowo, aplikacja napisana w PHP mo\u017ce skorzysta\u0107 z dobrodziejstw wzorca aktora (to wzorzec wykorzystywany dla aplikacji wielow\u0105tkowych).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Bloki-konstrukcyjne\">Bloki konstrukcyjne<\/h2>\n\n\n\n<p>Bloki konstrukcyjne stanowi\u0105 szkielet dla powstaj\u0105cych na nich system\u00f3w rozproszonych, hermetyzuj\u0105c funkcjonalno\u015bci infrastruktury. Ka\u017cdy blok sk\u0142ada si\u0119 z publicznego API oraz komponent\u00f3w, kt\u00f3re implementuj\u0105 jego funkcjonalno\u015b\u0107. Komponenty te mog\u0105 by\u0107 wymieniane bez konieczno\u015bci zmieniania udost\u0119pnianego API, co stanowi dodatkow\u0105 warstw\u0119 abstrakcji. Takie podej\u015bcie odseparowuje oraz uniezale\u017cnia aplikacj\u0119 od &nbsp; rozwi\u0105za\u0144 r\u00f3\u017cnych dostawc\u00f3w i umo\u017cliwia migracj\u0119 bez konieczno\u015bci ingerencji w kod.<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_02.06_graphic_3-1024x298-1.png\" alt=\"Budowa bloku konstrukcyjnego\" class=\"wp-image-34836\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142adowe u\u017cycie: migracja z Mongo DB do Redis<\/h3>\n\n\n\n<p>Nasza aplikacja do zarz\u0105dzania stanem aplikacji wykorzystuje no-SQLow\u0105 baz\u0119 danych \u2013 rozwi\u0105zanie MongoDB, odwo\u0142uj\u0105c si\u0119 do niego bezpo\u015brednio w kodzie poprzez SDK. Ze wzgl\u0119d\u00f3w na wydajno\u015b\u0107 podj\u0119li\u015bmy decyzj\u0119 o migracji do Redis. W konsekwencji musimy zmieni\u0107 SDK oraz kod aplikacji charakterystyczny dla MongoDB, aby dostosowa\u0107 go do Redis. W przypadku gdy od pocz\u0105tku wykorzystywaliby\u015bmy blok konstrukcyjny zarz\u0105dzania stanem z Dapr, taka zmiana ograniczy\u0142aby si\u0119 do korekty typu komponentu w pliku konfiguracyjnym YAML.<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_02.06_graphic_4-1024x385-1.png\" alt=\"bloki kontrukcyjne i ich odpowiedzialno\u015bci\" class=\"wp-image-34837\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Dapr sk\u0142ada si\u0119 z siedmiu blok\u00f3w konstrukcyjnych, natomiast z uwagi na jego otwart\u0105 natur\u0119 dodawanie kolejnych nie stanowi problemu. &nbsp;Przyjrzyjmy si\u0119 poszczeg\u00f3lnym blokom w kontek\u015bcie ich odpowiedzialno\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service-to-service invocation<\/h3>\n\n\n\n<p>Umo\u017cliwia bezpo\u015bredni\u0105 komunikacj\u0119 mi\u0119dzy us\u0142ugami, zapewniaj\u0105c:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>niezawodno\u015b\u0107 \u2013 automatyczne ponawianie wysy\u0142ania wiadomo\u015bci w przypadku b\u0142\u0119d\u00f3w np. sieciowych<\/li>\n\n\n\n<li>wzajemne uwierzytelnianie (mTLS) oraz szyfrowane<\/li>\n\n\n\n<li>kontrol\u0119 dost\u0119pu (ACL)<\/li>\n\n\n\n<li>r\u00f3wnowa\u017cenie obci\u0105\u017cenia \u2013 algorytm Round Robin<\/li>\n\n\n\n<li>automatyczne wykrywanie us\u0142ug (<em> service discovery<\/em>) \u2013 wykorzystuje Kubernetes DNS lub mDNS w zale\u017cno\u015bci od \u015brodowiska.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">State management<\/h3>\n\n\n\n<p>Umo\u017cliwia zarz\u0105dzanie stanem us\u0142ug \/ aktor\u00f3w, zapewniaj\u0105c:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>magazyny danych w postaci wtyczek \u2013 mo\u017cna podpi\u0105\u0107 jedno z wielu dost\u0119pnych na rynku rozwi\u0105za\u0144, Redis, MongoDB, MySQL itp.<\/li>\n\n\n\n<li>optymistyczn\u0105 kontrol\u0119 wsp\u00f3\u0142bie\u017cno\u015bci optymistyczn\u0105 kontrol\u0119 wsp\u00f3\u0142bie\u017cno\u015bci z wykorzystaniem nag\u0142\u00f3wk\u00f3w Etag<\/li>\n\n\n\n<li>sp\u00f3jno\u015b\u0107 danych \u2013 wspiera siln\u0105 (<em> strong consistency<\/em>) oraz ostateczn\u0105 sp\u00f3jno\u015b\u0107 (<em>ang. eventual consistency<\/em>)<\/li>\n\n\n\n<li>operacje masowe (ang. bulk)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Publish and subscribe<\/h3>\n\n\n\n<p>Implementuje wzorzec Publish\/Subscribe, zapewniaj\u0105c:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>integracj\u0119 z takimi rozwi\u0105zaniami jak Redis Streams, Azure Service Bus, AWS SNS\/SQS itp.<\/li>\n\n\n\n<li>format przesy\u0142anych komunikat\u00f3w zgodny ze specyfikacj\u0105 CloudEvents<\/li>\n\n\n\n<li>gwarancj\u0119 dostarczenia komunikatu (co najmniej raz)<\/li>\n\n\n\n<li>kontrol\u0119 czasu \u017cycia wiadomo\u015bci (<em> Time-To-Live<\/em>)<\/li>\n\n\n\n<li>tematyczne grupowanie komunikat\u00f3w, umo\u017cliwiaj\u0105c kontrol\u0119 wysy\u0142aj\u0105cych oraz odbieraj\u0105cych<\/li>\n\n\n\n<li>grupowanie odbiorc\u00f3w komunikat\u00f3w \u2013 implementuje wzorzec konkuruj\u0105cych odbiorc\u00f3w<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Resource bindings<\/h3>\n\n\n\n<p>Umo\u017cliwia dwukierunkow\u0105 integracj\u0119 z zewn\u0119trznymi \u017ar\u00f3d\u0142ami (systemami\/komponentami) w oderwaniu od konkretnej implementacji. Wi\u0105zanie zdarze\u0144 z konkretnymi akcjami odbywa si\u0119 na poziomie plik\u00f3w konfiguracyjnych YAML. Przyk\u0142adowo w odpowiedzi na zdarzenia rejestracji u\u017cytkownika wywo\u0142ujemy zewn\u0119trzn\u0105 us\u0142ug\u0119 SendGrid wysy\u0142aj\u0105c\u0105 e-mail z potwierdzeniem. Zmiana us\u0142ugodawcy do wysy\u0142ki e-maili nie poci\u0105gnie zmian w kodzie aplikacji \u2013 wystarczy zmieni\u0107 konfiguracj\u0119 i mo\u017ce to zrobi\u0107 operator aplikacji, nie anga\u017cuj\u0105c programist\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Actors<\/h3>\n\n\n\n<p>Implementuje wzorzec aktora (<em>ang. actor model<\/em>), kt\u00f3ry upraszcza budow\u0119 wysoce dost\u0119pnych i niezawodnych system\u00f3w bez konieczno\u015bci stosowania z\u0142o\u017conych wzorc\u00f3w wsp\u00f3\u0142bie\u017cno\u015bci i skalowania. W modelu tym aktor stanowi podstawow\u0105 jednostk\u0119 przetwarzania wsp\u00f3\u0142bie\u017cnego. Aktorzy s\u0105 ca\u0142kowicie hermetyczni i komunikuj\u0105 si\u0119 ze \u015bwiatem zewn\u0119trznym tylko za pomoc\u0105 wiadomo\u015bci.<\/p>\n\n\n\n<p><strong><u>Charakterystyka aktor\u00f3w:<\/u><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zarz\u0105dzaj\u0105 swoim w\u0142asnym stanem (aktorzy nie wsp\u00f3\u0142dziel\u0105 stanu)<\/li>\n\n\n\n<li>odbieraj\u0105 wiadomo\u015bci od innych aktor\u00f3w i przetwarzaj\u0105 je sekwencyjnie (jeden aktor = jeden w\u0105tek)<\/li>\n\n\n\n<li>komunikuj\u0105 si\u0119 asynchronicznie z innymi aktorami<\/li>\n<\/ul>\n\n\n\n<p>Podobnie jak we frameworku Microsoft Orleans, w Dapr zastosowano koncepcj\u0119 wirtualnego aktora, gdzie zarz\u0105dzanie cyklem \u017cycia aktora odbywa si\u0119 automatycznie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Observability<\/h3>\n\n\n\n<p>Zapewnia ustrukturyzowane podej\u015bcie do wykorzystania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metryk \u2013 do ich monitorowania mo\u017cemy wykorzysta\u0107 np. Grafan\u0119<\/li>\n\n\n\n<li>log\u00f3w \u2013 przegl\u0105danie mo\u017cemy zrealizowa\u0107 za pomoc\u0105 np. FluentD lub Elasticsearch i Kibany<\/li>\n\n\n\n<li>distributed tracing \u2013 zgodne ze standardami W3C Trace Context, co zapewnia integracj\u0119 z takimi rozwi\u0105zaniami jak ZIPKIN, Jaeger, Application Insights<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Secrets<\/h3>\n\n\n\n<p>Zapewnia bezpieczne przechowywanie wra\u017cliwych danych konfiguracyjnych, tj. has\u0142a, klucze, integruj\u0105c si\u0119 z takimi rozwi\u0105zaniami jak Azure Key Vault, HashiCorp Vault, Kubernetes Secrets itp.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Aplikacje-rozproszone-a-Dapr-podsumowanie\">Aplikacje rozproszone a Dapr &#8211; podsumowanie<\/h2>\n\n\n\n<p>Pandemia COVID-19 i zwi\u0105zane z ni\u0105 zmiany i wyzwania biznesowe gwa\u0142townie przy\u015bpieszy\u0142y tempo przenoszenia infrastruktury do <a href=\"https:\/\/www2.deloitte.com\/pl\/pl\/pages\/technology\/articles\/przyszlosc-infrastruktury-pracy-w-srodowisku-chmury.html\" target=\"_blank\" rel=\"noopener\">chmury obliczeniowej <\/a>i wp\u0142yn\u0119\u0142y na wzrost popularno\u015bci \u015brodowisk wielochmurowych (ang. multicloud) oraz hybrydowych. Wymaganie wysokiej skalowalno\u015bci aplikacji wymusi\u0142o \u201erozbijanie\u201d monolit\u00f3w<br>i transformacj\u0119 do architektury mikrous\u0142ug. Powy\u017csze stawia przed firmami powa\u017cne wyzwanie technologiczne oraz kadrowe (z uwagi na ograniczon\u0105 dost\u0119pno\u015b\u0107 specjalist\u00f3w z danej dziedziny). Rozwi\u0105zania takie jak Dapr (<a href=\"https:\/\/dapr.io\" target=\"_blank\" rel=\"noopener\">https:\/\/dapr.io<\/a>) oraz Open Application Model (<a href=\"https:\/\/oam.dev\/\" target=\"_blank\" rel=\"noopener\">https:\/\/oam.dev<\/a>) i stoj\u0105ce za nimi koncepcje, dostarczaj\u0105c zbi\u00f3r najlepszych praktyk oraz usprawniaj\u0105c proces migracji, mog\u0105 t\u0105 drog\u0119 znacznie skr\u00f3ci\u0107 i sprawi\u0107, aby sta\u0142a si\u0119 mniej wyboista.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tworzenie coraz bardziej popularnych system\u00f3w rozproszonych oraz migracja do architektury mikrous\u0142ug mo\u017ce by\u0107 dzi\u015b o wiele \u0142atwiejsza. Z pomoc\u0105 przychodz\u0105 narz\u0119dzia takie jak Dapr, kt\u00f3re pozwalaj\u0105 budowa\u0107 systemy rozproszone niezale\u017cne od platformy z \u201eklock\u00f3w&#8221;. Przeczytaj artyku\u0142, w kt\u00f3rym znajdziesz wprowadzenie do Dapr.io &#8211; narz\u0119dzia, kt\u00f3re wychodzi naprzeciw wyzwaniom architektury mikrous\u0142ug.<\/p>\n","protected":false},"author":98,"featured_media":31598,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":13,"footnotes":""},"categories":[1,582],"tags":[],"offering":[516],"class_list":["post-31584","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","offering-cloud-engineering"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/98"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=31584"}],"version-history":[{"count":3,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31584\/revisions"}],"predecessor-version":[{"id":32066,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31584\/revisions\/32066"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/31598"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=31584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=31584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=31584"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=31584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}