{"id":55671,"date":"2021-03-19T09:26:49","date_gmt":"2021-03-19T09:26:49","guid":{"rendered":"https:\/\/www.globallogic.com\/ua\/?post_type=insightsection&#038;p=55671"},"modified":"2025-01-31T05:10:04","modified_gmt":"2025-01-31T05:10:04","slug":"microservices-architecture-for-beginners-part-two","status":"publish","type":"insightsection","link":"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/microservices-architecture-for-beginners-part-two\/","title":{"rendered":"\u041c\u0456\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0456\u0441\u043d\u0430 \u0430\u0440\u0445\u0456\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0447\u0430\u0442\u043a\u0456\u0432\u0446\u0456\u0432. \u0427\u0430\u0441\u0442\u0438\u043d\u0430 \u0406\u0406"},"content":{"rendered":"<div class=\"classic_editor_content\">\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">We continue to understand the microservice architecture! In <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/blog\/microservices-architecture-for-beginners-part-one\/\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">the previous article,<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> we considered the terms without which it is impossible to take the first steps in this field.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">In general, <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/microservices-architecture-for-beginners-part-one\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">the architecture<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> of microservices is quite simple. It is just a pattern that guides us through the process of applying other architectural patterns according to best practices and principles. However, the implementation itself requires knowledge of some topics that should be kept in mind before starting development. We will not delve into the details because these topics require a deep dive and cannot be covered in one article. Instead, you can learn more about them on your own if you know what and where to look.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Interservice communication<\/span><\/span><\/strong><\/h5>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Strategy<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Communication and networking aspects are the first thing we should think about when we get into the field of distributed systems development. In particular, we will talk about interdepartmental communication, which differs from interprocessor communication.<\/span><\/span><\/p>\n<div class=\"img_container\">\n<p class=\"imgyoutube\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-55233\" src=\"https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_1.png\" alt=\"\" width=\"512\" height=\"453\" srcset=\"https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_1.png 512w, https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_1-300x265.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/p>\n<\/div>\n<p style=\"text-align: center;\" align=\"justify\"><em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Basic communication strategies<\/span><\/span><\/em><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">There are various high-level and low-level network protocols that can be used together or separately. However, first of all, a general communication strategy should be defined. The main communication strategies are divided into four types, shown in the diagram above.<\/span><\/span><\/p>\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">It:<\/span><\/span><\/p>\n<ul>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Blocking and synchronous<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Blocking and asynchronous<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Non-blocking and synchronous<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Non-blocking and asynchronous<\/span><\/span><\/li>\n<\/ul>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">If we take all the available technologies and put them on the diagram above, we will get a visual tool that will tell us which technologies are suitable for us and which are not. It is enough to remove from the scheme all the technologies that do not suit us.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">API<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">As part of choosing a communication strategy, REST\/HTTP and GraphQL are the basic protocols commonly used to provide high-level web APIs. In any case, the design of high-level APIs requires a clear understanding of API Management best practices.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">For beginners, it is important to understand the concepts of API Gateway and API versioning. Understanding the API-Led Connectivity pattern is the starting point for a deep dive into the organization of low-level APIs and subsystems.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Fault tolerance<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">In a microservices architecture, fault tolerance is not very different from common practices of distributed systems. However, I think it&#8217;s worth <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/python-how-to-start\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">starting<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> with latency tracking and error and exception handling.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Here you should think about:<\/span><\/span><\/p>\n<ul>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Timeout &#8211; to guarantee a response time<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Retry &#8211; to automate retries in case of network degradation<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Circuit Breaker &#8211; for control in case of cascading errors<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Deadline &#8211; for controlling long requests that depend on many services<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Rate Limiter &#8211; for load control according to SLA (Service Layer Agreement)<\/span><\/span><\/li>\n<\/ul>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Data consistency<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Unlike a monolith, we also don&#8217;t have a single database. Working with multiple data sources requires a distributed transaction management mechanism. But usually distributed transactions are not used in microservices architecture. The reason is that<\/span><\/span><\/p>\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">a) the use of existing solutions limits us in terms of supported technologies; <\/span><\/span><br \/>\n<span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">b) building your own distributed transaction processing system can be very complex, and again will be limited in technology support and may require significant maintenance efforts.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Instead, microservices use an event-driven approach available for implementation in two models: orchestration and\/or choreography.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Transactions<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">First of all, stop <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/thinking-digital-a-new-way-of-thinking-about-digital-transformation\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">thinking<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> about transactions in databases. Think about a business transaction. In economic organizations, business process transactions are performed in an event-oriented manner. Example.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">When you buy a cup of coffee, there are no database transactions involved in this process. You pay money and wait in line until you get a notification that your coffee is ready. If something goes wrong, you ask for compensation and either get your coffee or your money back. In other words, it is an event-driven architecture.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Events<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">There are two logical entities: events and messages. They differ logically in the same way as an event bus from a message queue. It is necessary to distinguish the logical difference between these terms.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">A message is a part of systems based on message brokers, where a message is sent to a queue\/topic, given that a consumer will receive it and do something about it. This model is called \u201cfire and forget\u201d.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Events are slightly different from messages. The message can be anything (number, text, JSON, etc.). Events, in turn, are logically complete contextual information and must have a well-defined structure (for example, JSON). Events can also be stored in the system until a specific time for repeated use (event replay) or audit.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Event buses are usually responsible for storing\/streaming\/processing events, which is how they differ from message brokers. For example, Kafka vs. RabbitMQ.<\/span><\/span><\/p>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Patterns<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">There are commonly used <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/microservices-architecture-for-beginners-part-one\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">patterns<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> that are used to implement event-oriented microservice systems.<\/span><\/span><\/p>\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">For example:<\/span><\/span><\/p>\n<ul>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Event Sourcing &#8211; for saving the state of the program in a series of events<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">CQRS &#8211; to take advantage of the separation of read and write models<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">SAGA &#8211; to ensure global data consistency using a sequence of local transactions<\/span><\/span><\/li>\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Event Streaming &#8211; for applying the principles of stream processing to events<\/span><\/span><\/li>\n<\/ul>\n<h5><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Infrastructure<\/span><\/span><\/strong><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">A microservices architecture can become very complex, so infrastructure management and DevOps best practices are important at all stages of development.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Developing a <\/span><\/span><em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">scalable<\/span><\/span><\/em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> and <\/span><\/span><em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">high<\/span><\/span><\/em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> -available microservice solution can take a lot of effort. Including, it is difficult to maintain a system where there are hundreds of microservices.<\/span><\/span><\/p>\n<div class=\"img_container\">\n<p class=\"imgyoutube\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-55234\" src=\"https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_2.png\" alt=\"\" width=\"512\" height=\"284\" srcset=\"https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_2.png 512w, https:\/\/www.globallogic.com\/ua\/wp-content\/uploads\/sites\/6\/2021\/03\/table_2-300x166.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/p>\n<p style=\"text-align: center;\"><em><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Event-driven domain-based decoupling<\/span><\/span><\/em><\/p>\n<\/div>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">One of the ways to overcome such a situation is the use of domain-oriented decoupling, which is based on the grouping of microservices by business domain (context). Such systems are divided into smaller business domains (contexts) that interact through the event bus. Within each domain (context), services can interact with each other either through an API or through an event bus. However, services do not have direct access to APIs of other domains&#8217; services, they can only communicate with them through the event bus. As a result, the subsystems built are smaller in size and more manageable in terms of support and maintenance.<\/span><\/span><\/p>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">In any case (multi-domain or not), in a microservices architecture you will have to deal with topics such as:<\/span><\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Code Repositories &#8211; mono-repo vs. multi-repo<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Deployment Strategies \u2014 including environment topology (dev, <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/qa-how-to-start\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">qa<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> , uat, prod) and deployment strategies (blue-green, canary, etc.).<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/qa-automation-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Automation<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> &#8211; including cluster orchestration, Service Mesh, <\/span><\/span><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/ci-cd-for-js-devs-theory\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">CI\/CD<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> .<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Common Concerns &#8211; containerization, orchestration, configuration, security, monitoring, logging, tracing, caching, communications, etc.<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/www.globallogic.com\/ua\/insights\/blogs\/qa-automation-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Testing<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> &#8211; e2e, integration, contract-driven, etc.<\/span><\/span><\/span><\/li>\n<\/ul>\n<h5><b><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Conclusion<\/span><\/span><\/b><\/h5>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">As you can see, the concept of microservice architecture has many topics to explore. We saw only the tip of the iceberg. Depending on the type of your application, you may also find it useful to learn about:<\/span><\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">best practices of refactoring monoliths to microservices<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">data processing platforms (Data Platform, Data Lake)<\/span><\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">various event-driven architectures<\/span><\/span><\/span><\/li>\n<\/ul>\n<p align=\"justify\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">So feel free to ask questions, collaborate and stay in touch! Where and how? To your attention &#8211; the professional communities of GlobalLogic operating on <\/span><\/span><a href=\"https:\/\/www.facebook.com\/GlobalLogicUkraine\" target=\"_blank\" rel=\"external nofollow\" target=\"_blank\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Facebook<\/span><\/span><\/a><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\"> :<\/span><\/span><\/p>\n<div><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">1.\u00a0 <\/span><\/span><a rel=\"external nofollow\" target=\"_blank\" href=\"https:\/\/www.facebook.com\/groups\/GLJavaScript\/\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">JavaScript Community<\/span><\/span><\/a><\/div>\n<div><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">2.\u00a0 <\/span><\/span><a rel=\"external nofollow\" target=\"_blank\" href=\"https:\/\/www.facebook.com\/groups\/GLJavaCommunity\/\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Java Community<\/span><\/span><\/a><\/div>\n<div><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">3.\u00a0 <\/span><\/span><a rel=\"external nofollow\" target=\"_blank\" href=\"https:\/\/www.facebook.com\/groups\/EmbeddedCommunity\/\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Embedded Community<\/span><\/span><\/a><\/div>\n<div><\/div>\n<div><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Join in!<\/span><\/span><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0430\u043d\u0443\u0440\u044e\u0454\u043c\u043e\u0441\u044c \u0433\u043b\u0438\u0431\u0448\u0435 \u0443 \u043f\u043e\u043d\u044f\u0442\u0442\u044f \u043c\u0456\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0456\u0441\u043d\u043e\u0457 \u0430\u0440\u0445\u0456\u0442\u0435\u043a\u0442\u0443\u0440\u0438<\/p>\n","protected":false},"author":26,"featured_media":55243,"parent":0,"menu_order":0,"template":"","insight":[41],"insight-subcats":[61],"insight-industry":[791],"insight-services":[],"insight-partners":[],"class_list":["post-55671","insightsection","type-insightsection","status-publish","has-post-thumbnail","hentry","insight-blogs","insight-subcats-architecture","insight-industry-cross-industry"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insightsection\/55671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insightsection"}],"about":[{"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/types\/insightsection"}],"author":[{"embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/users\/26"}],"version-history":[{"count":2,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insightsection\/55671\/revisions"}],"predecessor-version":[{"id":101652,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insightsection\/55671\/revisions\/101652"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/media\/55243"}],"wp:attachment":[{"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/media?parent=55671"}],"wp:term":[{"taxonomy":"insight","embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insight?post=55671"},{"taxonomy":"insight-subcats","embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insight-subcats?post=55671"},{"taxonomy":"insight-industry","embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insight-industry?post=55671"},{"taxonomy":"insight-services","embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insight-services?post=55671"},{"taxonomy":"insight-partners","embeddable":true,"href":"https:\/\/www.globallogic.com\/ua\/wp-json\/wp\/v2\/insight-partners?post=55671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}