{"id":88637,"date":"2019-02-20T13:00:45","date_gmt":"2019-02-20T11:00:45","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=88637"},"modified":"2019-02-19T13:11:55","modified_gmt":"2019-02-19T11:11:55","slug":"envoy-domain-specific-configuration-api","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html","title":{"rendered":"Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Establishing your control-plane interaction points and API surface<\/h2>\n<p>Once you\u2019ve thought through what components might make up your control-plane architecture (see previous), you\u2019ll want to consider exactly how your users will interact with the control plane and maybe even more importantly, <em>who will your users be?<\/em> To answer this you\u2019ll have to decide what roles your Envoy-based infrastructure will play and how traffic will traverse your architecture. It could be a combination of<\/p>\n<ul class=\"wp-block-list\">\n<li>API Management gateway (north\/south)<\/li>\n<li>Simple Kubernetes edge load balancer \/ reverse proxy \/ ingress control (north\/south)<\/li>\n<li>Shared services proxy (east\/west)<\/li>\n<li>Per-service sidecar (east\/west)<\/li>\n<\/ul>\n<p>For example, the Istio project is intended to be a platform service mesh that platform operators can build tools upon to drive control. Istio\u2019s domain-specific configuration objects for configuring Envoy center around the following objects:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/istio.io\/docs\/reference\/config\/istio.networking.v1alpha3\/#Gateway\">Gateway<\/a> \u2013 define a shared proxy component (capable of cluster ingress) that specifies protocol, TLS, port, and host\/authority that can be used to load balance and route traffic<\/li>\n<li><a href=\"https:\/\/istio.io\/docs\/reference\/config\/istio.networking.v1alpha3\/#VirtualService\">VirtualService<\/a> \u2013 rules for how to interact with a specific service; can specify things like route matching behavior, timeouts, retries, etc<\/li>\n<li><a href=\"https:\/\/istio.io\/docs\/reference\/config\/istio.networking.v1alpha3\/#DestinationRule\">DestinationRule<\/a> \u2013 rules for how to interact with a specific service in terms of circuit breaking, load balancing, mTLS policy, subsets definitions of a service, etc<\/li>\n<li><a href=\"https:\/\/istio.io\/docs\/reference\/config\/istio.networking.v1alpha3\/#ServiceEntry\">ServiceEntry<\/a> \u2013 explicitly add a service to Istio\u2019s service registry<\/li>\n<\/ul>\n<p>Running in Kubernetes, all of those configuration objects are implemented as <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/api-extension\/custom-resources\/\">CustomResourceDefinitions<\/a>.<\/p>\n<p><a href=\"https:\/\/github.com\/heptio\/contour\">Heptio\/VMWare Contour<\/a> is intended as a Kubernetes ingress gateway and has a simplified domain-specific configuration model with both a CustomResourceDefinition (CRD) flavor as well as a <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/\">Kubernetes Ingress resource<\/a><\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/heptio\/contour\/blob\/master\/docs\/ingressroute.md\">IngressRoute<\/a> which is a Kubernetes CRD that provides a single location to specify configuration for the Contour proxy<\/li>\n<li><a href=\"https:\/\/github.com\/heptio\/contour\/blob\/master\/docs\/annotations.md\">Ingress Resource support<\/a> which allows you to specify annotations on your Kubernetes Ingress resource if you\u2019re in to that kind of thing<\/li>\n<\/ul>\n<p>On the <a href=\"https:\/\/github.com\/solo-io\/gloo\/tree\/master\/docs\/dev\">Gloo project<\/a> we\u2019ve made the decision to split the available configuration objects into two levels:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<ul class=\"wp-block-list\">\n<li>The user-facing configurations for best ergonomics of user use cases and leave options for extensibility (more on that in next section)<\/li>\n<li>The lower-level configuration that abstracts Envoy but is not expressly intended for direct user manipulation. The higher-level objects get transformed to this lower-level representation which is ultimately what\u2019s used to translate to Envoy xDS APIs. The reasons for this will be clear in the next section.<\/li>\n<\/ul>\n<p>For users, Gloo focuses on teams owning their routing configurations since the semantics of the routing (and the available transformations\/aggregation capabilities) are heavily influenced by the developers of APIs and microservices. For the user-facing API objects, we use:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gateway\/api\/v1\/gateway.proto.sk\/\">Gateway<\/a> \u2013 specify the routes and API endpoints available at a specific listener port as well as what security accompanies each API<\/li>\n<li><a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gateway\/api\/v1\/virtual_service.proto.sk\/\">VirtualService<\/a> \u2013 groups API routes into a set of \u201cvirtual APIs\u201d that can route to backed functions (gRPC, http\/1, http\/2, lambda, etc); gives the developer control over how a route proceeds with <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/plugins\/transformation\/transformation.proto.sk\/\">different transformations<\/a> in an attempt to decouple the front end API from what exists in the backend (and any breaking changes a backend might introduce)<\/li>\n<\/ul>\n<p>The user-facing API objects in Gloo drive the lower-level objects which are then used to ultimately derive the Envoy xDS configurations. For example, Gloo\u2019s lower-level, core API objects are:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/upstream.proto.sk\/\">Upstream<\/a> \u2013 captures the details about backend clusters and the functions that are exposed on this. You can loosely associate a Gloo Upstream with an <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/api-v2\/api\/v2\/cds.proto\">Envoy cluster<\/a> with one big difference: An upstream can understand the actual service functions available at a specific endpoint (in other words, knows about <code>\/foo\/bar<\/code> and <code>\/bar\/wine<\/code> including their expected parameters and parameter structure rather than just <code>hostname:port<\/code>). More on that in a second.<\/li>\n<li><a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/proxy.proto.sk\/\">Proxy<\/a> \u2013 The proxy is the main object that abstracts all of the configuration we can apply to Envoy. This includes listeners, virtual hosts, routes, and upstreams. The higher-level objects (VirtualService, Gateway, etc) are used to drive this lower-level Proxy object.<\/li>\n<\/ul>\n<p>The split between the two levels of configuration for the Gloo control allows us to extend the Gloo control-plane capabilities while keeping a simple abstraction to configure Envoy. This is explained in the next section.<\/p>\n<p>In the previous three examples (Istio, Contour, Gloo) each respective control plane exposes a set of domain-specific configuration objects that are user focused but are ultimately transformed into Envoy configuration and exposed over the xDS data plane API. This provides a decoupling between Envoy and a user\u2019s predisposed way of working and their workflows. Although we\u2019ve seen a few examples of creating a more user and workflow focused domain-specific configuration for abstracting Envoy, that\u2019s not the only way to build up an Envoy control plane. <a href=\"https:\/\/www.slideshare.net\/IvanKruglov\/ivan-kruglov-introducing-envoybased-service-mesh-at-bookingcom-version-7\">Booking.com has a great presentation<\/a> on how they stayed much closer to the Envoy configurations and used an engine to just merge all the different teams\u2019 configuration fragments into the actual Envoy configuration.<\/p>\n<p>Alongside considering a domain-specific configuration, you should consider the specific touch points of your API\/object model. For example, Kubernetes is very YAML and resource-file focused. You could build a more domain-specific CLI tool (like <a href=\"https:\/\/docs.openshift.com\/enterprise\/3.2\/dev_guide\/new_app.html#dev-guide-new-app\">OpenShift did with the oc CLI<\/a>, like Istio <a href=\"https:\/\/istio.io\/docs\/reference\/commands\/istioctl\/\">did with istioctl<\/a> and like Gloo <a href=\"https:\/\/gloo.solo.io\/cli\/glooctl\/\">did with glooctl<\/a><\/p>\n<h3 class=\"wp-block-heading\">Takeaway<\/h3>\n<p>When you build an Envoy control plane, you\u2019re doing so with a specific intent or set of architectures\/users in mind. You should take this into account and build the right ergonomic, opinionated domain-specific API that suits your users and improves your workflow for operating Envoy. <a href=\"https:\/\/github.com\/solo-io\/gloo\/graphs\/contributors\">The Gloo team<\/a> recommends exploring <em>existing<\/em> Envoy control plane implementations and only building your own if none of the others are suitable. As we\u2019ll see in the next section, it\u2019s possible to build a control plane that is fully extendable to fit many different users, workflows, and operational constraints.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Christian Posta, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.christianposta.com\/guidance-for-building-a-control-plane-for-envoy-domain-specific-configuration-api\/\" target=\"_blank\" rel=\"noopener\">Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Establishing your control-plane interaction points and API surface Once you\u2019ve thought through what components might make up your control-plane architecture (see previous), you\u2019ll want to consider exactly how your users will interact with the control plane and maybe even more importantly, who will your users be? To answer this you\u2019ll have to decide what roles &hellip;<\/p>\n","protected":false},"author":204,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-88637","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface\" \/>\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.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-20T11:00:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Christian Posta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/christianposta\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christian Posta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html\"},\"author\":{\"name\":\"Christian Posta\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\"},\"headline\":\"Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API\",\"datePublished\":\"2019-02-20T11:00:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html\"},\"wordCount\":1004,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html\",\"name\":\"Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-02-20T11:00:45+00:00\",\"description\":\"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/envoy-domain-specific-configuration-api.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\",\"name\":\"Christian Posta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"caption\":\"Christian Posta\"},\"description\":\"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.\",\"sameAs\":[\"http:\\\/\\\/www.christianposta.com\\\/blog\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/christian-posta\\\/15\\\/412\\\/199\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/christianposta\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Christian-Posta\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks","description":"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface","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.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html","og_locale":"en_US","og_type":"article","og_title":"Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks","og_description":"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface","og_url":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-02-20T11:00:45+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Christian Posta","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/christianposta","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Christian Posta","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html"},"author":{"name":"Christian Posta","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed"},"headline":"Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API","datePublished":"2019-02-20T11:00:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html"},"wordCount":1004,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html","url":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html","name":"Guidance for Building a Control Plane for Envoy - Domain Specific Configuration API - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-02-20T11:00:45+00:00","description":"Interested to learn about Domain Specific Configuration Check our article explaining how to establish your control-plane interaction points and API surface","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/envoy-domain-specific-configuration-api.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Guidance for Building a Control Plane for Envoy &#8211; Domain Specific Configuration API"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed","name":"Christian Posta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","caption":"Christian Posta"},"description":"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.","sameAs":["http:\/\/www.christianposta.com\/blog\/","http:\/\/www.linkedin.com\/pub\/christian-posta\/15\/412\/199","https:\/\/x.com\/http:\/\/twitter.com\/christianposta"],"url":"https:\/\/www.javacodegeeks.com\/author\/Christian-Posta"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/88637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/204"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=88637"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/88637\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=88637"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=88637"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=88637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}