{"id":89259,"date":"2019-03-11T10:00:51","date_gmt":"2019-03-11T08:00:51","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=89259"},"modified":"2019-03-08T12:02:49","modified_gmt":"2019-03-08T10:02:49","slug":"domain-specific-configuration-api","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html","title":{"rendered":"Guidance for Building a Control Plane for Envoy Part 3 &#8211; Domain Specific Configuration API"},"content":{"rendered":"<p>This is part 3 of a <a href=\"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-manage-envoy-proxy-edge.html\">series<\/a> that explores building a control plane for Envoy Proxy.<\/p>\n<p>In this blog series, we\u2019ll take a look at the following areas:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/blog.christianposta.com\/envoy\/guidance-for-building-a-control-plane-to-manage-envoy-proxy-based-infrastructure\/\">Adopting a mechanism to dynamically update Envoy\u2019s routing, service discovery, and other configuration<\/a><\/li>\n<li><a href=\"https:\/\/blog.christianposta.com\/envoy\/guidance-for-building-a-control-plane-for-envoy-identify-components\/\">Identifying what components make up your control plane, including backing stores, service discovery APIs, security components, et. al.<\/a><\/li>\n<li>Establishing any domain-specific configuration objects and APIs that best fit your usecases and organization <em>(this entry)<\/em><\/li>\n<li>Thinking of how best to make your control plane pluggable where you need it<\/li>\n<li>Options for deploying your various control-plane components<\/li>\n<li>Thinking through a testing harness for your control plane<\/li>\n<\/ul>\n<p>In the <a href=\"https:\/\/blog.christianposta.com\/envoy\/guidance-for-building-a-control-plane-for-envoy-identify-components\/\">previous entry<\/a> we evaluated the components you may need for your control plane. In this section, we explore what a domain-specific API might look like for your control plane.<\/p>\n<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 of the network between your services and applications. 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<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" width=\"802\" height=\"337\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/istio-crd-pilot.png\" alt=\"Domain Specific Configuration API\" class=\"wp-image-89295\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/istio-crd-pilot.png 802w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/istio-crd-pilot-300x126.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/istio-crd-pilot-768x323.png 768w\" sizes=\"(max-width: 802px) 100vw, 802px\" \/><\/figure>\n<\/div>\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>.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/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<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" width=\"624\" height=\"196\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/contour-crd.png\" alt=\"Domain Specific Configuration API\" class=\"wp-image-89296\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/contour-crd.png 624w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/contour-crd-300x94.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/contour-crd-620x196.png 620w\" sizes=\"(max-width: 624px) 100vw, 624px\" \/><\/figure>\n<\/div>\n<p>On the <a href=\"https:\/\/gloo.solo.io\">Gloo project<\/a> we\u2019ve made the decision to split the available configuration objects into two levels:<\/p>\n<ul class=\"wp-block-list\">\n<li>The user-facing configurations for best ergonomics of <em>user<\/em> 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>Note these are different than the Istio variants of these objects.<\/p>\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<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/gloo-crd.png\" alt=\"Domain Specific Configuration API\" class=\"wp-image-89297\" width=\"650\" height=\"376\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/gloo-crd.png 866w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/gloo-crd-300x174.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/gloo-crd-768x444.png 768w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/figure>\n<\/div>\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 more detail in part 4 of this series.<\/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. Gloo\u2019s control plane lays the foundation to be extended and customized. As we\u2019ll see in the next entry, 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 noreferrer\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.christianposta.com\/envoy\/guidance-for-building-a-control-plane-for-envoy-domain-specific-configuration-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">Guidance for Building a Control Plane for Envoy Part 3 &#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>This is part 3 of a series that explores building a control plane for Envoy Proxy. In this blog series, we\u2019ll take a look at the following areas: Adopting a mechanism to dynamically update Envoy\u2019s routing, service discovery, and other configuration Identifying what components make up your control plane, including backing stores, service discovery APIs, &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-89259","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 Part 3 - Domain Specific Configuration API - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we&#039;&#039;see the Domain Specific Configuration\" \/>\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\/03\/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 Part 3 - Domain Specific Configuration API - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we&#039;&#039;see the Domain Specific Configuration\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/03\/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-03-11T08:00:51+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=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/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 Part 3 &#8211; Domain Specific Configuration API\",\"datePublished\":\"2019-03-11T08:00:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html\"},\"wordCount\":1178,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/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\\\/03\\\/domain-specific-configuration-api.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html\",\"name\":\"Guidance for Building a Control Plane for Envoy Part 3 - Domain Specific Configuration API - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-03-11T08:00:51+00:00\",\"description\":\"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we''see the Domain Specific Configuration\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/domain-specific-configuration-api.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/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\\\/03\\\/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 Part 3 &#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 Part 3 - Domain Specific Configuration API - Java Code Geeks","description":"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we''see the Domain Specific Configuration","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\/03\/domain-specific-configuration-api.html","og_locale":"en_US","og_type":"article","og_title":"Guidance for Building a Control Plane for Envoy Part 3 - Domain Specific Configuration API - Java Code Geeks","og_description":"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we''see the Domain Specific Configuration","og_url":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-03-11T08:00:51+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":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/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 Part 3 &#8211; Domain Specific Configuration API","datePublished":"2019-03-11T08:00:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html"},"wordCount":1178,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/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\/03\/domain-specific-configuration-api.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html","url":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html","name":"Guidance for Building a Control Plane for Envoy Part 3 - Domain Specific Configuration API - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-03-11T08:00:51+00:00","description":"Interested to learn about Domain Specific Configuration API? Check our series of article about control plane.Today we''see the Domain Specific Configuration","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/03\/domain-specific-configuration-api.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/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\/03\/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 Part 3 &#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\/89259","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=89259"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/89259\/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=89259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=89259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=89259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}