{"id":19479,"date":"2022-11-28T08:32:52","date_gmt":"2022-11-28T07:32:52","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=19479"},"modified":"2022-11-28T08:45:01","modified_gmt":"2022-11-28T07:45:01","slug":"design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/","title":{"rendered":"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork"},"content":{"rendered":"\n<p><strong>Key Takeaways:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You can allow teams to work in parallel by designing gRPC APIs before starting to code.&nbsp;<\/li>\n\n\n\n<li>When teams work in parallel, you significantly decrease the time-to-market of your products.<\/li>\n\n\n\n<li>A sample workflow has a few key stages.\n<ul class=\"wp-block-list\">\n<li>The teams start by designing the gRPC API<\/li>\n\n\n\n<li>Then, producer and consumer teams can work in parallel on their microservices.<\/li>\n\n\n\n<li>The consumer team can use mocks to simulate the backend producer service.<\/li>\n\n\n\n<li>Communicating feedback about the API specification during the development phase is essential.<\/li>\n\n\n\n<li>Once the microservices are ready, they can test them together and release them to production.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>You can start by onboarding just one API to this new workflow; you don&#8217;t have to migrate your whole company, to begin with<\/li>\n\n\n\n<li>Working in parallel is excellent for team morale as there is less hard-deadline pressure<\/li>\n\n\n\n<li>You can estimate the return on investment by using a simple spreadsheet.<\/li>\n<\/ul>\n\n\n\n<p>See &#8220;<em>Figure 1: Design-first gRPC service development and testing workflow<\/em>&#8221; for a high-level overview of the workflow described in this article.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/1_zz6P3w8RO0eiqK_B2bqgb8qbaaCdVgAx_qGAw8Vmd7RVqew7vMuZXdLpvp1GDUuYX_utIBZFbUzL_-rdYIykOaEnmq-l35q0Q4NSLaweSheka7X90KAQ1ej5yuZhhBLRt3KC0_h4znUGBvUldTkwu9jBcZxJZQ5QxfMIXTgLJToSsqOgGXgiRW8y3Rlw\" alt=\"Figure 1: Design-first gRPC service development and testing workflow\"\/><figcaption class=\"wp-element-caption\"><em>Figure 1: Design-first gRPC service development and testing workflow<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-is-api-first-design-first-and-code-first\">What is API-first, design-first and code-first?<\/h2>\n\n\n\n<p>What does it mean to follow the <a href=\"https:\/\/www.codemotion.com\/magazine\/devops\/api-first-why-it-still-matters\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">API-first approach<\/a>? It means that APIs are <a href=\"https:\/\/en.wiktionary.org\/wiki\/first-class_citizen\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">first-class citizens <\/a>that can be products the company offers its customers; they are critical business assets.<\/p>\n\n\n\n<p>What is the API design-first approach? It means working closely with the client, product, architecture, testing and development teams to design the services available in the API and the data format before actually starting to code them.<\/p>\n\n\n\n<p>It is in contrast to code-first APIs, where you would dive straight into coding and creating the API without any upfront specifications. The API schema can be defined in a format like OpenAPI for HTTP APIs, Protobuf for gRPC or AsyncAPI for RabbitMQ, Kafka and other asynchronous systems.<\/p>\n\n\n\n<p>The API design-first approach is proven to <a href=\"https:\/\/www.infoq.com\/articles\/api-mocking-break-dependencies\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">parallelise teamwork and get products to customers much faster<\/a>, which is <a href=\"https:\/\/www.codemotion.com\/magazine\/devops\/api-first-why-it-still-matters\/\" class=\"ek-link\">still relevant<\/a>. <a href=\"https:\/\/www.infoq.com\/articles\/design-first-api-development\/\" class=\"ek-link\">Design-first fits into the API-first approach<\/a> adopted by companies that treat APIs as first-class citizens critical to their business success.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-1024x576.jpeg\" alt=\"gRPC API, microservices\" class=\"wp-image-19481\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-1024x576.jpeg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-300x169.jpeg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-768x432.jpeg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-1536x864.jpeg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-896x504.jpeg 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2-400x225.jpeg 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-2.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Figure 2: The relationship between API-first, Design-first APIs and Code-first APIs.&nbsp;<\/em><\/figcaption><\/figure>\n\n\n\n<p>This article is for you if you have never used design-first APIs to parallelise teamwork. I share a sample workflow for adopting it in your teams, including how developers from different teams working with different architectures and tech stacks can work together.<\/p>\n\n\n\n<p>I share my experience learned from working with large enterprises (i.e. global Spanish e-commerce and a global UK media company) and smaller companies (i.e. a US insurtech startup and a UK challenger bank).<\/p>\n\n\n\n<p>I use gRPC and Protobuf as the technologies in the examples in this article. There are other great articles discussing the popular HTTP and OpenAPI stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-is-grpc\">What is gRPC?<\/h2>\n\n\n\n<p>gRPC is a Remote Procedure Call (RPC) framework used by companies to communicate between systems, mobile applications and microservices that require high performance. It has been <a href=\"https:\/\/trends.google.com\/trends\/explore?date=today%205-y&amp;q=%2Fg%2F11cp5mklv8\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">steadily gaining popularity<\/a> in the past five years.<br>Typically companies use gRPC along with Protobuf to encode data. &#8220;<em>Figure 3: order-service.proto&#8221; <\/em>shows a Protobuf file that defines the format of the messages. It describes an &#8220;Order&#8221; service where you can send &#8220;Item&#8221; messages to order items with a given &#8220;SKU&#8221;.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">message Item {\n    int32 sku = 1;\n    int32 quantity = 2;\n}\n\nenum Status {\n    SUCCESS = 0;\n    ERROR = 1;\n}\n\nmessage OrderStatus {\n    Status status = 1;\n    string message = 2;\n}\n\nservice Order {\n    rpc Purchase(Item) returns (OrderStatus) {}\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Design-first gRPC service development and testing workflow<\/h2>\n\n\n\n<p>It is advisable to work closely with your product and architecture teams to define your gRPC services before you start creating them. It will help to <a href=\"https:\/\/www.infoq.com\/articles\/api-mocking-break-dependencies\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">get your team off the critical path and work in parallel<\/a>.<\/p>\n\n\n\n<p><em>\u201cFigure 1: Design-first gRPC service development and testing workflow\u201d <\/em>shows a high-level overview of a workflow you can use to be design-first.<\/p>\n\n\n\n<p>To start, the teams get together and define gRPC APIs. Once they confirm what the API looks like, the producer and consumer teams can work in parallel to meet the defined API specs.<\/p>\n\n\n\n<p>The consumer team then starts by creating gRPC service API mocks, so they can work on their consumer microservice without waiting for the producer team to have their microservice up and running. Once they create the mocks, they can proceed to code the consumer microservice, which for now, will connect to the gRPC service mocks, not to the real producer microservice.<\/p>\n\n\n\n<p>In the meantime, the producer team can work on their producer microservice.<\/p>\n\n\n\n<p>When the producer and consumer teams finish developing their microservices, they can test their work without mocks. They will test the producer and consumer microservice and if they work together.<\/p>\n\n\n\n<p>Once the testing is complete, the teams can release the microservices to production.<\/p>\n\n\n\n<p>For simplicity, I have skipped in this workflow security testing, performance and load testing, penetration testing and other types of ensuring the quality of your microservices. This sample workflow demonstrates how to parallelise work by defining APIs upfront. I do not focus on how to <a href=\"https:\/\/martinfowler.com\/articles\/microservice-testing\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">test microservices<\/a>. I have also skipped API maintenance and other workflows. This workflow also assumes working with over-the-wire gRPC mocks, which are the easiest to get started with in my experience. There are other possible workflows, for example, in-process mocking of classes, relying on the generated gRPC stub connectors.<\/p>\n\n\n\n<p>Now that we have covered the workflow&#8217;s main stages, let&#8217;s dig into the details of each one by one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining gRPC services<\/h2>\n\n\n\n<p>To define the gRPC API, all the stakeholders come together and discuss the purpose of the services, typical use cases and data format. They look at the API from different angles like usability, security and compliance. The developers then create a Profobuf schema file that contains the data structure and service definitions. See a sample Protobuf file in \u201c<em>Figure 2: order-service.proto<\/em>\u201d.<\/p>\n\n\n\n<p>Once the Profobuf file is ready, the developers commit the file to Git.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-1024x576.png\" alt=\"\" class=\"wp-image-19482\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-1024x576.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-300x169.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-768x432.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-1536x864.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-896x504.png 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9-400x225.png 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/image-9.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Figure 4: Defining gRPC services<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Creating gRPC service mocks<\/h2>\n\n\n\n<p>When you have the Protobuf definitions, the consumer microservice team can start constructing the gRPC service mocks. They will then connect the consumer microservice to these mocks. It will allow them to develop without relying on the producer microservice.<\/p>\n\n\n\n<p>A developer will start by checking out the project with the Protobuf file. Then, they will need to use the gRPC mocking tool. There are a number of them <a href=\"https:\/\/en.wikipedia.org\/wiki\/Comparison_of_API_simulation_tools\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">listed on Wikipedia<\/a>. For example, from the OpenSource bucket, there are <a href=\"https:\/\/github.com\/testinggospels\/camouflage\/tree\/main\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Camouflage<\/a>, <a href=\"https:\/\/github.com\/tokopedia\/gripmock\" class=\"ek-link\">Gripmock<\/a> and <a href=\"https:\/\/github.com\/cbrz\/mountebank-grpc\" class=\"ek-link\">Mountebank-gRPC<\/a>. There are also commercial tools like <a href=\"https:\/\/trafficparrot.com\/tutorials\/mocking-and-simulating-grpc.html\" class=\"ek-link\">Traffic Parrot<\/a> (disclaimer: I represent Traffic Parrot).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/hqlnvf-8J4tLN1vjmwiu6kYM634aUxQG9Jr90k0MkxAR6gQsZ3EEXVRlpoh_XrtpZyGZJM-YnZx3CyLRE8mPUW7Uud_lpWYGCm2eQo8ksA6Gqqa8Y75ZA6iXfKxK3s4YYjh_aQp1HlhN7X4S10RWo3whE2FtZ6KeeSEFlCAN6wHD_SKvPqP5c_-I7hTewQ\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Figure 5: Creating gRPC service mocks<\/em><\/figcaption><\/figure>\n\n\n\n<p>The commercial tools can help you, for example, by generating the mocks from the proto file, so you can focus on developing your prod code instead of spending too much time creating the mocks. You will have to pay for the commercial offering, though.<\/p>\n\n\n\n<p>When you choose an OpenSource tool, there are no license fees. Also, if you know how to code and have the time, you can help improve the tool and fix any bugs if you find them.<\/p>\n\n\n\n<p>Once the developer has created the gRPC service mocks in the tool of choice, they will be committed to Git. Keeping mocks in Git is in the spirit of keeping <a href=\"https:\/\/medium.com\/ethanjb\/the-beginning-of-everything-as-code-a25c4e9a75e9\">everything-as-code<\/a>.<\/p>\n\n\n\n<p>Since the gRPC service mocks are ready, it&#8217;s time to build a Docker image combined with the tool and the mocks. In our example, GitHub actions pick up that the definition of the mocks has been changed in Git, build the Docker image and publish it to the company Docker registry. There are a few other variants to this approach, for example, keeping mocks outside the gRPC mocking tool Docker image, which is out of scope for this simple and focused article.&nbsp;<\/p>\n\n\n\n<p>Now that the mocks are ready, we can use them to help develop and test the consumer microservice!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Develop and test in isolation the consumer microservice<\/h2>\n\n\n\n<p>A developer working on the consumer microservice will face a problem. The producer microservice is not ready yet, as the producer team is actively developing it. So the consumer team developer cannot quickly develop and test the microservice as the gRPC API she wants to consume is not ready yet.&nbsp;<\/p>\n\n\n\n<p>gRPC service mocks come with help. The mocks will &#8220;simulate&#8221; the producer microservice server side so the consumer team developer can develop and test. That way, both the consumer and producer teams can work in parallel.<\/p>\n\n\n\n<p>Often the same person working on the production code would have been the one creating the mocks.<\/p>\n\n\n\n<p>The developer will start by running locally on her laptop the Docker image with the gRPC service mocks.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/-h0WGd8oKTuB3rHyd7hrBGELlPXBeAFnDRzQ4TK_GsP75s_qoFIoTJfbGHu-CKlm-fT1s7r_Q3QcbNB6ps5hILMP13HzBx46uvzrqfCqf2CG26tE-Q0FnCfQz_sx_F3fmyDOTEXQfEBjenRz3-WIJBOsafc7VwgNKLFTsPqLrADT3rZe3x9lrQMAOg934Q\" alt=\"gRPC API, Microservices\"\/><figcaption class=\"wp-element-caption\"><em>Figure 6: Develop and test in isolation the consumer microservice.<\/em><\/figcaption><\/figure>\n\n\n\n<p>She will then code the microservice while it&#8217;s connected to the locally running gRPC service mocks. Those mocks are &#8220;simulating&#8221; the server side &#8211; the producer microservice. She is working in &#8220;isolation&#8221;, meaning that she does not rely on any external APIs or services and can configure the mocks herself as needed for the tests. Typically she will write automated tests and follow a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Behavior-driven_development\">BDD process<\/a> of discussing with relevant stakeholders and capturing the requirements in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Specification_by_example\">spec-by-example or BDD tests<\/a>.<\/p>\n\n\n\n<p>It&#8217;s worth mentioning that the developer often might find issues with the gRPC service specification during this stage. For example, issues not anticipated during the design stage. It is critical the developer communicates any concerns and feedback about the API specification with the producer team and whoever else is involved. It&#8217;s easier to change the specifications early in the API software lifecycle. An example of such a feedback note would be a usability issue with the API based on real-code usage or missing data in a data structure.&nbsp;<\/p>\n\n\n\n<p>She then checks her changes into Git and pushes them to the remote repository. The CI pipeline runs. It tests and builds the microservice artifact. We will look at the specifics of that in the next paragraph. Once CI\/CD completes, QAs might pick up the artifacts and test the microservice locally. Then QAs potentially test it in a shared environment as well.<\/p>\n\n\n\n<p>Let&#8217;s have a closer look at a sample CI\/CD loop.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CI\/CD for the consumer microservice<\/h2>\n\n\n\n<p>Once the microservice coding is done, the CI pipeline can run and create the microservice artifacts. It will run the tests that the developer has written.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/d5C1RT8p01saK3oanRGsQsjXrH7cTWVeipD4hXw54QXoUTREutx-efEZlV5sFMCZmpoz8B4EfqtwFEkpuxyzcxOENvOxDUY59xnKDYW8KzVsi9vU3ERnJU6PugH74k3VKT9-ZDRVREUEx77DOiZTPJn4MNWbcjjsjhp0MI7RwOR0-v_Mp2FEXcX_V2tZfQ\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Figure 7: CI\/CD for the consumer microservice<\/em><\/figcaption><\/figure>\n\n\n\n<p>The CI agent will check out the microservice project. It will then start the Docker image with gRPC service mocks inside the CI agent just to run this one build. Then it starts the microservice and runs all tests locally. The tests are hitting the microservice APIs, which in turn communicate with the gRPC mocks of the producer microservice. The mocks allow the tests to pass even though the backend producer microservice does not exist yet. The pipeline ends with producing a tested microservice artifact.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Communicate changes using Git PRs<\/h2>\n\n\n\n<p>It is important to remember that the API specification is a living organism. It should be updated and moulded based on learnings during development, testing and early usage of the services. The changes to the Protobuf specifications need to be communicated effectively to all interested parties.<\/p>\n\n\n\n<p>One way of communicating changes is by using <a href=\"https:\/\/docs.github.com\/en\/pull-requests\/collaborating-with-pull-requests\/proposing-changes-to-your-work-with-pull-requests\/about-pull-requests\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">PRs (pull requests)<\/a>.<\/p>\n\n\n\n<p>To propose a change in the API specification, a developer will pull the project with Protobuf files and make changes to those files. He will then create a PR with the proposed changes.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/EVGBgHInKJizkCOzWi5ryF_-bPDKpPnOHKkZqvNxwfqWTkVUzjZJogU-QwFA9YGdy8ksn8syWUj-ZM11xEX5raT0DDxfxTpJEKbU4uFww-KEgbp2F8dbT7hLmpQtHKo9sp3YzypGlAvsl9NR6Q4pVZAlCWChrTAARkDJhZaPy1Clqg0WoWuMstuW9B3LNw\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Figure 8: Communicate changes using Git PRs<\/em><\/figcaption><\/figure>\n\n\n\n<p>Then, the other team or involved parties can suggest changes to the proposal. The involved parties, such as the producer team, consumer team, architects, product owners, and QAs can go backwards and forwards to make sure the changes meet their requirements. Once the changeset is confirmed, it gets merged into the master, and the new Protobuf files use in both producer and consumer microservice. The mocks might need updating as well. Some commercial tools might help you with that by highlighting which mocks are not in line with the new spec. If you use the OpenSource gRPC mocking tools will assess the change needed and then update the mocks manually.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Test the producer and consumer microservice together<\/h2>\n\n\n\n<p>Once the producer and consumer microservice are ready, the QAs can test them together. There will be no mocks used here anymore between the producer and consumer microservice. We do want to test if there are any when real microservices communicate with each other. You might need a gRPC mock to decouple yourself from other microservices and dependents, though (for an example, see the <a href=\"https:\/\/youtu.be\/cJoXDp3i8Tc?t=806\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">&#8220;Backend Integration Test Environment&#8221; slide at 13m21s<\/a>).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/rc1hroNeFSfxSwTPNH19-UAGx53MszBj06qreaMJKrR1CMuItZzjzt4EIefsoslZDZORYaHdvq2c0mEaMSd58NLyD4oCClz0Faq0FMI5a5_E29-_Yp6i4qxLesXaBpomJYU-y-eDVECLjfVN20d6VRWqdYCa_sjbWM5F-KBx7v_qiMmBGtRM4KlzUORb9g\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Figure 8: Communicate changes using Git PRs<\/em><\/figcaption><\/figure>\n\n\n\n<p>Both microservices can be started in a shared testing environment and manually or automatically tested. Once tests pass, the artifacts are promoted and ready for release.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting started is simple<\/h2>\n\n\n\n<p>Getting started with parallelising work by designing APIs before coding them can be done on both a small and large scale.&nbsp;<\/p>\n\n\n\n<p>The good news is you can start with just one API and two teams. You don\u2019t need to boil the ocean and migrate all your teams simultaneously. Once the project has been proven successful, scale to more groups.&nbsp;<\/p>\n\n\n\n<p>You can use <a href=\"https:\/\/www.infoq.com\/articles\/api-mocking-break-dependencies\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">the spreadsheet from this article<\/a> to calculate the ROI (Return on Investment) you will see when you implement this workflow. <a href=\"https:\/\/www.infoq.com\/articles\/api-mocking-break-dependencies\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">The article<\/a> describes how to use the sheet. If your situation is different, <a href=\"https:\/\/www.linkedin.com\/in\/wojciechbulaty\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">feel free to contact me<\/a>, and we can work on an ROI model for your specific situation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Next steps<\/h2>\n\n\n\n<p>Learning new things is fantastic, but the knowledge does not yield returns if you don&#8217;t use it!&nbsp;<\/p>\n\n\n\n<p>If you are an architect or a software developer, it\u2019s time to talk to your team members about this workflow and see if it applies to your situation.&nbsp;<\/p>\n\n\n\n<p>If you are a team lead or manager, ask your team what they think about this workflow. Check if it would solve a critical problem you currently face, for example, a team waiting for another team\u2019s API to be able to continue working.<\/p>\n\n\n\n<p>If you have any questions, do not hesitate to reach out to Wojciech Bulaty directly via <a href=\"https:\/\/www.linkedin.com\/in\/wojciechbulaty\/\">LinkedIn<\/a> or email him at <a href=\"mailto:wojtek@trafficparrot.com\" class=\"ek-link\">wojtek@trafficparrot.com<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted\">About the author:\nWojciech Bulaty specialises in enterprise software development and testing architecture. He brings more than a decade of hands-on coding and leadership experience to his writing. He is now part of the Traffic Parrot team. He helps teams working with microservices to accelerate delivery, improve quality, and reduce time to market by providing a tool for API mocking and service virtualisation. You can follow Wojciech on LinkedIn.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Key Takeaways: See &#8220;Figure 1: Design-first gRPC service development and testing workflow&#8221; for a high-level overview of the workflow described in this article. What is API-first, design-first and code-first? What does it mean to follow the API-first approach? It means that APIs are first-class citizens that can be products the company offers its customers; they&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\">Read more<\/a><\/p>\n","protected":false},"author":154,"featured_media":19494,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":10,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[3355],"tags":[7192,9977],"collections":[],"class_list":{"0":"post-19479","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-microservices","8":"tag-api","9":"tag-grpc","10":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Design-first gRPC API for microservices: sample parallel workflow<\/title>\n<meta name=\"description\" content=\"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork\" \/>\n<meta property=\"og:description\" content=\"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-28T07:32:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-28T07:45:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Wojciech Bulaty\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Wojciech Bulaty\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\"},\"author\":{\"name\":\"Wojciech Bulaty\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/39845f416efa52e34c536d23dde8bd93\"},\"headline\":\"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork\",\"datePublished\":\"2022-11-28T07:32:52+00:00\",\"dateModified\":\"2022-11-28T07:45:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\"},\"wordCount\":2332,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg\",\"keywords\":[\"API\",\"gRPC\"],\"articleSection\":[\"Microservices\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\",\"name\":\"Design-first gRPC API for microservices: sample parallel workflow\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg\",\"datePublished\":\"2022-11-28T07:32:52+00:00\",\"dateModified\":\"2022-11-28T07:45:01+00:00\",\"description\":\"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg\",\"width\":1024,\"height\":576,\"caption\":\"developer working together illustration vector, creative designer team, UI UX development concept\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Microservices\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/39845f416efa52e34c536d23dde8bd93\",\"name\":\"Wojciech Bulaty\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4bb4e190b967861f725adbaf1b169e11c67b0590bd45eb9995d88061198e58f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4bb4e190b967861f725adbaf1b169e11c67b0590bd45eb9995d88061198e58f4?s=96&d=mm&r=g\",\"caption\":\"Wojciech Bulaty\"},\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/wojciech-bulaty\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Design-first gRPC API for microservices: sample parallel workflow","description":"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/","og_locale":"en_US","og_type":"article","og_title":"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork","og_description":"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.","og_url":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2022-11-28T07:32:52+00:00","article_modified_time":"2022-11-28T07:45:01+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg","type":"image\/jpeg"}],"author":"Wojciech Bulaty","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Wojciech Bulaty","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/"},"author":{"name":"Wojciech Bulaty","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/39845f416efa52e34c536d23dde8bd93"},"headline":"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork","datePublished":"2022-11-28T07:32:52+00:00","dateModified":"2022-11-28T07:45:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/"},"wordCount":2332,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg","keywords":["API","gRPC"],"articleSection":["Microservices"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/","url":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/","name":"Design-first gRPC API for microservices: sample parallel workflow","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg","datePublished":"2022-11-28T07:32:52+00:00","dateModified":"2022-11-28T07:45:01+00:00","description":"You can allow teams to work in parallel by designing gRPC APIs before starting to code. Discover a sample workflow and the key stages.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg","width":1024,"height":576,"caption":"developer working together illustration vector, creative designer team, UI UX development concept"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/design-first-grpc-apis-for-microservices-a-sample-workflow-for-parallel-teamwork\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Microservices","item":"https:\/\/www.codemotion.com\/magazine\/microservices\/"},{"@type":"ListItem","position":3,"name":"Design-first gRPC APIs for microservices: a sample workflow for parallel teamwork"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/39845f416efa52e34c536d23dde8bd93","name":"Wojciech Bulaty","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4bb4e190b967861f725adbaf1b169e11c67b0590bd45eb9995d88061198e58f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4bb4e190b967861f725adbaf1b169e11c67b0590bd45eb9995d88061198e58f4?s=96&d=mm&r=g","caption":"Wojciech Bulaty"},"url":"https:\/\/www.codemotion.com\/magazine\/author\/wojciech-bulaty\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-600x400.jpg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-600x576.jpg","author_info":{"display_name":"Wojciech Bulaty","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/wojciech-bulaty\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg",1024,576,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-150x150.jpg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-300x169.jpg",300,169,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-768x432.jpg",768,432,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg",1024,576,false],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg",1024,576,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg",1024,576,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC.jpg",100,56,false],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-180x128.jpg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-896x504.jpg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-400x225.jpg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-600x400.jpg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2022\/11\/foto-gRPC-600x576.jpg",600,576,true]},"uagb_author_info":{"display_name":"Wojciech Bulaty","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/wojciech-bulaty\/"},"uagb_comment_info":0,"uagb_excerpt":"Key Takeaways: See &#8220;Figure 1: Design-first gRPC service development and testing workflow&#8221; for a high-level overview of the workflow described in this article. What is API-first, design-first and code-first? What does it mean to follow the API-first approach? It means that APIs are first-class citizens that can be products the company offers its customers; they&#8230;&hellip;","lang":"en","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/19479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/154"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=19479"}],"version-history":[{"count":8,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/19479\/revisions"}],"predecessor-version":[{"id":19493,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/19479\/revisions\/19493"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/19494"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=19479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=19479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=19479"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=19479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}