{"id":88734,"date":"2019-02-22T13:00:32","date_gmt":"2019-02-22T11:00:32","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=88734"},"modified":"2019-02-21T09:52:14","modified_gmt":"2019-02-21T07:52:14","slug":"control-plane-envoy-pluggability","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html","title":{"rendered":"Guidance for Building a Control Plane for Envoy &#8211; Build for Pluggability"},"content":{"rendered":"<p>Envoy is a very powerful piece of software and every day <a href=\"https:\/\/github.com\/envoyproxy\/envoy\/pull\/4950\">new use cases and new contributions are being proposed to the community<\/a>. Although the core of Envoy is very stable, it\u2019s built on a <a href=\"https:\/\/github.com\/envoyproxy\/envoy-filter-example\">pluggable filter architecture<\/a> so folks can write new codecs for different L7 protocols or add new functionality. At the moment, Envoy filter\u2019s are written in C++ and there is an option to extend Envoy with <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/http_filters\/lua_filter\">Lua<\/a> but there is also <a href=\"https:\/\/github.com\/envoyproxy\/envoy\/issues\/4272\">some discussion to support Web Assembly<\/a> for extensibility as well. Alongside the fast-moving Envoy community and the need to configure these new capabilities, there is also the need to include new domain-specific object models to support new platforms that want to take advantage of Envoy. In this section, we\u2019ll explore extending an Envoy control plane along both of those dimensions.<\/p>\n<p>Extending Envoy is fairly straight forward by writing C++ filters. Envoy filters we\u2019ve created on the <a href=\"https:\/\/github.com\/solo-io\/envoy-gloo\">Gloo project<\/a> include:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/solo-io\/squash\">Squash<\/a> debugger (https:\/\/github.com\/envoyproxy\/envoy\/tree\/master\/api\/envoy\/config\/filter\/http\/squash)<\/li>\n<li>Caching (closed source at the moment; should opensource in the near future)<\/li>\n<li>Request\/Response Transformation (https:\/\/github.com\/solo-io\/envoy-gloo\/tree\/master\/source\/extensions\/filters\/http\/transformation)<\/li>\n<li>AWS lambda (https:\/\/github.com\/solo-io\/envoy-gloo\/tree\/master\/source\/extensions\/filters\/http\/aws_lambda)<\/li>\n<li>NATS streaming (https:\/\/github.com\/solo-io\/envoy-nats-streaming, https:\/\/github.com\/solo-io\/envoy-gloo\/tree\/master\/source\/extensions\/filters\/http\/nats\/streaming)<\/li>\n<li>Google Cloud Functions (https:\/\/github.com\/solo-io\/envoy-google-function)<\/li>\n<li>Azure function (https:\/\/github.com\/solo-io\/envoy-azure-functions)<\/li>\n<\/ul>\n<p>Because Envoy is so versatile and new features are added all the time, it\u2019s worth spending some time to consider whether you want to build your control plane to be extensible to be able to use these new features. On the <a href=\"https:\/\/github.com\/solo-io\/gloo\">Gloo project<\/a> we\u2019ve chosen to do just that on the following levels:<\/p>\n<ul class=\"wp-block-list\">\n<li>Build more opinionated domain-specific configuration objects on top of a <em>core<\/em> Gloo configuration object<\/li>\n<li>Control plane <em>plugins<\/em> to augment the existing behavior of control plane<\/li>\n<li>Create tools to expedite the previous two points<\/li>\n<\/ul>\n<p>Let\u2019s take a look at each of these levels and how they contribute to an extensible and flexible control plane.<\/p>\n<h2 class=\"wp-block-heading\">Core API objects, built with flexibility in mind<\/h2>\n<p>In the previous section we discussed focusing on the domain-specific configuration objects we would use to configure the control plane. In Gloo, we have the <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/proxy.proto.sk\/\">lowest level configuration object<\/a> called <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/proxy.proto.sk\/\">Proxy<\/a>. Here\u2019s an example of the Proxy object (as a CRD in Kubernetes for this example):<\/p>\n<div>\n<div id=\"highlighter_723273\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<div class=\"line number39 index38 alt2\">39<\/div>\n<div class=\"line number40 index39 alt1\">40<\/div>\n<div class=\"line number41 index40 alt2\">41<\/div>\n<div class=\"line number42 index41 alt1\">42<\/div>\n<div class=\"line number43 index42 alt2\">43<\/div>\n<div class=\"line number44 index43 alt1\">44<\/div>\n<div class=\"line number45 index44 alt2\">45<\/div>\n<div class=\"line number46 index45 alt1\">46<\/div>\n<div class=\"line number47 index46 alt2\">47<\/div>\n<div class=\"line number48 index47 alt1\">48<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">apiVersion: gloo.solo.io\/v1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">kind: Proxy<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">metadata:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">clusterName: <\/code><code class=\"java string\">\"\"<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">creationTimestamp: <\/code><code class=\"java string\">\"2019-02-15T13:27:39Z\"<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">generation: <\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">labels:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">created_by: gateway<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">name: gateway-proxy<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">namespace: gloo-system<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">resourceVersion: <\/code><code class=\"java string\">\"5209108\"<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">selfLink: \/apis\/gloo.solo.io\/v1\/namespaces\/gloo-system\/proxies\/gateway-proxy<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">uid: 771377f2-<\/code><code class=\"java value\">3125<\/code><code class=\"java plain\">-11e9-<\/code><code class=\"java value\">8523<\/code><code class=\"java plain\">-42010aa800e0<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java plain\">spec:<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">listeners:<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">- bindAddress: <\/code><code class=\"java string\">'::'<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">bindPort: <\/code><code class=\"java value\">8080<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">httpListener:<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">virtualHosts:<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- domains:<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- <\/code><code class=\"java string\">'*'<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">name: gloo-system.<\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">routes:<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- matcher:<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">exact: \/petstore\/findPet<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">routeAction:<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">single:<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">destinationSpec:<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">rest:<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">functionName: findPetById<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">parameters: {}<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">upstream:<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">name: <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">-petstore-<\/code><code class=\"java value\">8080<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">namespace: gloo-system<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- matcher:<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">exact: \/sample-route-<\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">routeAction:<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">single:<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">upstream:<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">name: <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">-petstore-<\/code><code class=\"java value\">8080<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">namespace: gloo-system<\/code><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">routePlugins:<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">prefixRewrite:<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">prefixRewrite: \/api\/pets<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">name: gateway<\/code><\/div>\n<div class=\"line number46 index45 alt1\"><code class=\"java plain\">status:<\/code><\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">reported_by: gloo<\/code><\/div>\n<div class=\"line number48 index47 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">state: <\/code><code class=\"java value\">1<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>You can see the Proxy object specifies listeners, their types, as well as routing information. If you look close you can see it follows Envoy\u2019s configuration <em>to an extent<\/em> but diverges to support additional capabilities. In the routes, you can see that requests are sent to \u201cupstreams\u201d. Gloo knows how to route to <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/upstream.proto.sk\/\">Upstreams<\/a> and you can see these definitions in the above Proxy object. THe Proxy object is what is converted to Envoy xDS API by Gloo\u2019s control plane. If we take a look at the components that make up Gloo, we see the following:<\/p>\n<div>\n<div id=\"highlighter_489101\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; READY&nbsp;&nbsp; STATUS&nbsp;&nbsp;&nbsp; RESTARTS&nbsp;&nbsp; AGE<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">discovery-676bcc49f8-n55jt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">\/<\/code><code class=\"java value\">1<\/code>&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">Running&nbsp;&nbsp; <\/code><code class=\"java value\">0<\/code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">8m<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">gateway-d8598c78c-425hz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">\/<\/code><code class=\"java value\">1<\/code>&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">Running&nbsp;&nbsp; <\/code><code class=\"java value\">0<\/code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">8m<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">gateway-proxy-6b4b86b4fb-cm2cr&nbsp;&nbsp; <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">\/<\/code><code class=\"java value\">1<\/code>&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">Running&nbsp;&nbsp; <\/code><code class=\"java value\">0<\/code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">8m<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">gloo-565659747c-x7lvf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">\/<\/code><code class=\"java value\">1<\/code>&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">Running&nbsp;&nbsp; <\/code><code class=\"java value\">0<\/code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <code class=\"java plain\">8m<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <code>gateway-proxy<\/code> component is the Envoy proxy. The following comprise the control plane:<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><code>gateway<\/code><\/li>\n<li><code>discovery<\/code><\/li>\n<li><code>gloo<\/code><\/li>\n<\/ul>\n<p>The component that\u2019s responsible for this Proxy-&gt;Envoy xDS conversion is:<\/p>\n<ul class=\"wp-block-list\">\n<li><code>gloo<\/code> \u2013 an event-driven component responsible for the core xDS services and configuration of custom Envoy filters by transforming the Proxy object into Envoy\u2019s LDS\/RDS\/CDS\/EDS APIs<\/li>\n<\/ul>\n<p>Gloo knows how to route to Upstreams and functions that exist on Upstreams. <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/upstream.proto.sk\/\">Upstream<\/a> is also a core configuration object for Gloo. The reason we needed this Upstream object is to encapsulate more fidelity about the upstream\u2019s capabilities than what Envoy knows out of the box. Envoy knows about \u201cclusters\u201d, but Gloo (on top of Envoy) knows about functions. This knowledge enables <a href=\"https:\/\/medium.com\/solo-io\/announcing-gloo-the-function-gateway-3f0860ef6600\">function-level routing<\/a> which is a more powerful routing construct for composing new applications and APIs. Envoy knows about clusters in terms of \u201chost:port\u201d endpoints, but with Gloo, we can attach additional context to these clusters so they understand \u201cfunctions\u201d which can be REST method\/path, gRPC operations, or cloud functions like Lambda. For example, here\u2019s a Gloo upstream named <code>default-petstore-8080<\/code>:<\/p>\n<div>\n<div id=\"highlighter_883894\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<div class=\"line number39 index38 alt2\">39<\/div>\n<div class=\"line number40 index39 alt1\">40<\/div>\n<div class=\"line number41 index40 alt2\">41<\/div>\n<div class=\"line number42 index41 alt1\">42<\/div>\n<div class=\"line number43 index42 alt2\">43<\/div>\n<div class=\"line number44 index43 alt1\">44<\/div>\n<div class=\"line number45 index44 alt2\">45<\/div>\n<div class=\"line number46 index45 alt1\">46<\/div>\n<div class=\"line number47 index46 alt2\">47<\/div>\n<div class=\"line number48 index47 alt1\">48<\/div>\n<div class=\"line number49 index48 alt2\">49<\/div>\n<div class=\"line number50 index49 alt1\">50<\/div>\n<div class=\"line number51 index50 alt2\">51<\/div>\n<div class=\"line number52 index51 alt1\">52<\/div>\n<div class=\"line number53 index52 alt2\">53<\/div>\n<div class=\"line number54 index53 alt1\">54<\/div>\n<div class=\"line number55 index54 alt2\">55<\/div>\n<div class=\"line number56 index55 alt1\">56<\/div>\n<div class=\"line number57 index56 alt2\">57<\/div>\n<div class=\"line number58 index57 alt1\">58<\/div>\n<div class=\"line number59 index58 alt2\">59<\/div>\n<div class=\"line number60 index59 alt1\">60<\/div>\n<div class=\"line number61 index60 alt2\">61<\/div>\n<div class=\"line number62 index61 alt1\">62<\/div>\n<div class=\"line number63 index62 alt2\">63<\/div>\n<div class=\"line number64 index63 alt1\">64<\/div>\n<div class=\"line number65 index64 alt2\">65<\/div>\n<div class=\"line number66 index65 alt1\">66<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">---<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">discoveryMetadata: {}<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">metadata:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">labels:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">discovered_by: kubernetesplugin<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">service: petstore<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">sevice: petstore<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">name: <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">-petstore-<\/code><code class=\"java value\">8080<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">namespace: gloo-system<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">status:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">reportedBy: gloo<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">state: Accepted<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">upstreamSpec:<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">kube:<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">selector:<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">app: petstore<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serviceName: petstore<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serviceNamespace: <\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">servicePort: <\/code><code class=\"java value\">8080<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serviceSpec:<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">rest:<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">swaggerInfo:<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">url: http:<\/code><code class=\"java comments\">\/\/petstore.default.svc.cluster.local:8080\/swagger.json<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">transformations:<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">addPet:<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">body:<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: '{<\/code><code class=\"java string\">\"id\"<\/code><code class=\"java plain\">: {{ <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">(id, <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">) }},<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">: <\/code><code class=\"java string\">\"{{ default(name, \"<\/code><code class=\"java string\">\")}}\"<\/code><code class=\"java plain\">,<\/code><code class=\"java string\">\"tag\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"{{ default(tag, \"<\/code><code class=\"java string\">\")}}\"<\/code><code class=\"java plain\">}'<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">headers:<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:method:<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: POST<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:path:<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: \/api\/pets<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-type:<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: application\/json<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">deletePet:<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">headers:<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:method:<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: DELETE<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:path:<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: \/api\/pets\/{{ <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">(id, <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">) }}<\/code><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-type:<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: application\/json<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">findPetById:<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">body: {}<\/code><\/div>\n<div class=\"line number46 index45 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">headers:<\/code><\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:method:<\/code><\/div>\n<div class=\"line number48 index47 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: GET<\/code><\/div>\n<div class=\"line number49 index48 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:path:<\/code><\/div>\n<div class=\"line number50 index49 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: \/api\/pets\/{{ <\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">(id, <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">) }}<\/code><\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-length:<\/code><\/div>\n<div class=\"line number52 index51 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: <\/code><code class=\"java string\">\"0\"<\/code><\/div>\n<div class=\"line number53 index52 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-type: {}<\/code><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">transfer-encoding: {}<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">findPets:<\/code><\/div>\n<div class=\"line number56 index55 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">body: {}<\/code><\/div>\n<div class=\"line number57 index56 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">headers:<\/code><\/div>\n<div class=\"line number58 index57 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:method:<\/code><\/div>\n<div class=\"line number59 index58 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: GET<\/code><\/div>\n<div class=\"line number60 index59 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:path:<\/code><\/div>\n<div class=\"line number61 index60 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: \/api\/pets?tags={{<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">(tags, <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">)}}&amp;limit={{<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">(limit,<\/code><\/div>\n<div class=\"line number62 index61 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">)}}<\/code><\/div>\n<div class=\"line number63 index62 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-length:<\/code><\/div>\n<div class=\"line number64 index63 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: <\/code><code class=\"java string\">\"0\"<\/code><\/div>\n<div class=\"line number65 index64 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">content-type: {}<\/code><\/div>\n<div class=\"line number66 index65 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">transfer-encoding: {}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Notice, we have more fidelity in terms of what functions are exposed by this upstream. In this case, the upstream happens to be a REST service exposing an <a href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\">Open API Spec\/Swagger<\/a> document. Gloo automatically discovered this information and enriched this Upstream object with that information that can then be used in the Proxy object.<\/p>\n<p>If you refer back to the components in the Gloo control plane, you\u2019ll see a <code>discovery<\/code> component that augments Envoy\u2019s discovery APIs by adding a \u201cUpstream Discovery Service\u201d (UDS), and a \u201cFunction Discovery Service\u201d (FDS). The upstream discovery service uses a set of plugins (see next section) to automatically discover upstreams. The simplest example is when running in Kubernetes, we can automatically discover the <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/\">Kubernetes Services<\/a>. Gloo can also discover upstreams from Consul, AWS <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/plugins.proto.sk\/#a-name-upstreamspec-upstreamspec-a\">and others<\/a>.<\/p>\n<p>The <code>discovery<\/code> component in the Gloo control plane just uses its UDS and FDS services to discover and write Upstream objects into Kuberentes CRDs. From there, a user can create routing rules from specific API paths on the Envoy proxy to a specific function on an upstream. The Envoy proxies do not interact with this control-plane component directly (recall, Envoy only consumes the xDS API exposed by the <code>gloo<\/code> component). Instead, the <code>discovery<\/code> component <em>facilitates<\/em> the creation of Upstreams that can then be used by the Proxy object. This is a good example of using supporting microservices (the <code>discovery<\/code> service in this example) to contribute to the overall functionality of the control plane.<\/p>\n<p>Proxy and Upstream are the lower-level domain-specific configuration objects as mentioned in the previous section. What\u2019s more interesting is how we can layer a set of configuration objects on top of this to satisfy user-specific use cases with a more opinionated workflow.<\/p>\n<h2 class=\"wp-block-heading\">Extending a domain specific configuration layer<\/h2>\n<p>In Gloo\u2019s control plane, there is also another component called the <code>gateway<\/code> component. This component implements the higher-level domain-specific configuration that users will end up interacting with (either directly through YAML files or indirectly through the <code>glooctl<\/code> CLI tool). The <code>gateway<\/code> component knows about two domain specific objects:<\/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>These objects allow a decoupling from the <code>Proxy<\/code> object. When users create new <code>Gateway<\/code> or <code>VirtualService<\/code> objects using the more ergonomical or opinionated API, Gloo\u2019s <code>gateway<\/code> component takes those objects (CRDs in Kubernetes, config entries in Consul) and updates the underlying <code>Proxy<\/code> object. This is a common pattern for extending Gloo: prefer composability of control plane components. This allows us to build more specialized controllers for more opinionated domain-specific objects to support different usage. For example, the <a href=\"https:\/\/solo.io\">Solo.io<\/a> team also built an open-source controller for Gloo called <a href=\"https:\/\/sqoop.solo.io\/\">Sqoop<\/a> which follows this same pattern and externds the Gloo API for declaring routing rules that build on a <a href=\"https:\/\/graphql.org\">GraphQL Engine<\/a> with GraphQL Schemas. In Sqoop, we introduce <a href=\"https:\/\/sqoop.solo.io\/introduction\/concepts\/api_objects\/\">Schemas and ResolverMaps<\/a> objects that ultimately contribute to the Proxy object which then gets translated to Envoy xDS.<\/p>\n<p>Another example of this layering of domain-specific configuration built on the base Gloo objects is our recent contribution to use Gloo proxy in <a href=\"MISSING\">Knative Serving as an alternative to Istio<\/a>. Knative has a specific object for declaring cluster-ingress resources called the <a href=\"https:\/\/github.com\/knative\/serving\/blob\/master\/pkg\/client\/clientset\/versioned\/typed\/networking\/v1alpha1\/clusteringress.go\">ClusterIngress<\/a> object that looks like this:<\/p>\n<div>\n<div id=\"highlighter_125984\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">apiVersion: networking.internal.knative.dev\/v1alpha1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">kind: ClusterIngress<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">metadata:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">labels:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serving.knative.dev\/route: helloworld-go<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serving.knative.dev\/routeNamespace: <\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">name: helloworld-go-txrqt<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">spec:<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">generation: <\/code><code class=\"java value\">2<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">rules:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">- hosts:<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- helloworld-go.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">.example.com<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- helloworld-go.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">.svc.cluster.local<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- helloworld-go.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">.svc<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- helloworld-go.<\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">http:<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">paths:<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- appendHeaders:<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">knative-serving-namespace: <\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">knative-serving-revision: helloworld-go-<\/code><code class=\"java value\">00001<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">retries:<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">attempts: <\/code><code class=\"java value\">3<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">perTryTimeout: 10m0s<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">splits:<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">- percent: <\/code><code class=\"java value\">100<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serviceName: activator-service<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">serviceNamespace: knative-serving<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">servicePort: <\/code><code class=\"java value\">80<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">timeout: 10m0s<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">visibility: ExternalIP<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To support this use case in Gloo, all we did was <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/ac3bddf202423b297fb909eb6eff498745a8c015\/projects\/clusteringress\/pkg\/translator\/translate.go#L19\">build a new controller that watches<\/a> and converts <a href=\"https:\/\/github.com\/knative\/serving\/blob\/master\/pkg\/client\/clientset\/versioned\/typed\/networking\/v1alpha1\/clusteringress.go\">ClusterIngress<\/a> objects into Gloo\u2019s <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/proxy.proto.sk\/\">Proxy<\/a>. Please see <a href=\"MISSING\">this blog for more information on using Gloo within Knative<\/a> to simplify <a href=\"https:\/\/github.com\/knative\/serving\">Knative Serving<\/a> installation to use Gloo as the cluster ingress.<\/p>\n<h2 class=\"wp-block-heading\">Control plane plugins to augment the existing behavior of control plane<\/h2>\n<p>In the previous section we looked at extending the capabilities of the control plane by layering domain-specific configuration objects on top of core objects. Another point of extension is directly in the control-pane core objects itself. In Istio that would be <code>VirtualService<\/code> and <code>DestinationRule<\/code>, in Contour that would be <code>IngressRoute<\/code> and in Gloo that would be the <code>Proxy<\/code> and <code>Upstream<\/code> objects. For example, Gloo\u2019s <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/7a5c3a9a7a060841a7047efce79e5b7b3ed981be\/projects\/gloo\/api\/v1\/proxy.proto#L30\">Proxy object<\/a> contains extension points for <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/7a5c3a9a7a060841a7047efce79e5b7b3ed981be\/projects\/gloo\/api\/v1\/proxy.proto#L90\">Listeners<\/a>, <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/7a5c3a9a7a060841a7047efce79e5b7b3ed981be\/projects\/gloo\/api\/v1\/proxy.proto#L124\">Virtualhosts<\/a> and <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/7a5c3a9a7a060841a7047efce79e5b7b3ed981be\/projects\/gloo\/api\/v1\/proxy.proto#L154\">Routes<\/a>. This means there are well defined spots in the Proxy configuration that we can introduce new functionality to our configuration (ie, if we wish to expose new Envoy functionality or if we write new filters for Envoy for which we\u2019d like to expose configuration, etc). with minimal fuss. For example, we have written a handful of <a href=\"https:\/\/github.com\/solo-io\/gloo\/blob\/a27e1018640c46f7a25e4c1a0dc1f4cadf1773f5\/projects\/gloo\/api\/v1\/plugins.proto#L44\">plugins that enrich the routing and transformation capabilities<\/a> of Envoy. For example, to transform a request coming into Envoy and destined to a service named <code>foo-service<\/code>, we can maninpulate the headers or body with <a href=\"https:\/\/github.com\/pantor\/inja\">Inja templates<\/a>. See the <a href=\"https:\/\/gloo.solo.io\/user_guides\/function_routing\/\">function routing guide in Gloo\u2019s documentation<\/a> for more.<\/p>\n<div>\n<div id=\"highlighter_927526\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">routes:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">- matcher:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">prefix: \/<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">routeAction:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">single:<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">upstream:<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">name: foo-service<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">namespace: <\/code><code class=\"java keyword\">default<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">routePlugins:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">transformations:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">requestTransformation:<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">transformationTemplate:<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">headers:<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">x-canary-foo<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: foo-bar-v2<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:path:<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">text: \/v2\/canary\/feature<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">passthrough: {}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To see the full list of plugins available on the Gloo <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/proxy.proto.sk\/\">Proxy<\/a> and <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/upstream.proto.sk\/\">Upstream<\/a> objects, see <a href=\"https:\/\/gloo.solo.io\/v1\/github.com\/solo-io\/gloo\/projects\/gloo\/api\/v1\/plugins.proto.sk\/\">the documentation here<\/a><\/p>\n<p>Once you\u2019ve added new plugins to your control plane, you can extend your user-facing domain-specific configuration objects to take advantage of these new capabiliites. You can augment your existing controllers to do this or add new ones (following the principle of microservices loosely coordinating with each other). We\u2019ve written <a href=\"https:\/\/gloo.solo.io\/dev\/example-proxy-controller\/\">extensive examples to help you write controllers<\/a> to augment your control-plane functionality or reach out on <a href=\"https:\/\/slack.solo.io\">Slack<\/a> for any more pointers on this.<\/p>\n<h2 class=\"wp-block-heading\">Leverage tools to expedite the previous two bullets<\/h2>\n<p>In the previous sections, we saw how to think about extensibility and flexibility of your control plane. We saw how using a multi-layer domain-specific configuration object allows for extensibility by adding new objects and controllers. At <a href=\"https:\/\/solo.io\">Solo.io<\/a> we\u2019ve created an open-source project called <a href=\"https:\/\/github.com\/solo-io\/solo-kit\">solo-kit<\/a> that expedites building new, declarative, opinionated API objects for your control plane by starting with <a href=\"https:\/\/developers.google.com\/protocol-buffers\/\">protobuf<\/a> objects and code-generating the correct type-safe clients for interacting with these objects on your platform. For example, on Kubernetes, <a href=\"https:\/\/github.com\/solo-io\/solo-kit\">solo-kit<\/a> turns these protos into <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/api-extension\/custom-resources\/\">CustomResourceDefinitions<\/a> and generates Golang Kubernetes clients for watching and interacting with these resources. You can also use Consul, Vault, and many others as the backend storage if you\u2019re not on Kubernetes.<\/p>\n<p>Once you\u2019ve created the resources and generated the type-safe clients, you will want to detect when users create new resources or make changes to existing ones. With <a href=\"https:\/\/github.com\/solo-io\/solo-kit\">solo-kit<\/a> you just specify which resources you wish to watch, or a combination of resources called a \u201csnapshot\u201d, and the client runs an event-loop to process any notifications. In your event loop you can update collaborating objects or core objects. In fact this is the way Gloo\u2019s layered domain-specific configuration objects work. See the <a href=\"https:\/\/gloo.solo.io\/operator_guide\/gloo_declarative_model\/\">Gloo declarative model docs<\/a> for more information.<\/p>\n<h3 class=\"wp-block-heading\">Takeaway<\/h3>\n<p>A control plane can be as simple or as complicated as you need. The Gloo team recommends focusing on a simple core to the control plane and then extend it through plugins and microservices controllers through composability. Gloo\u2019s architecture is built like this and enables <a href=\"https:\/\/github.com\/solo-io\/gloo\/graphs\/contributors\">the Gloo team<\/a> to quickly add any new features to support any platforms, configurations, filters, and more as they come up. That\u2019s why, although Gloo is very Kubernetes-native, it is built to run on any platform on any cloud. The core control plane design allows this.<\/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-build-for-pluggability\/\" target=\"_blank\" rel=\"noopener\">Guidance for Building a Control Plane for Envoy &#8211; Build for Pluggability<\/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>Envoy is a very powerful piece of software and every day new use cases and new contributions are being proposed to the community. Although the core of Envoy is very stable, it\u2019s built on a pluggable filter architecture so folks can write new codecs for different L7 protocols or add new functionality. At the moment, &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-88734","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 - Build for Pluggability - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable\" \/>\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\/control-plane-envoy-pluggability.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 - Build for Pluggability - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.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-22T11:00:32+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=\"19 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\\\/control-plane-envoy-pluggability.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html\"},\"author\":{\"name\":\"Christian Posta\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\"},\"headline\":\"Guidance for Building a Control Plane for Envoy &#8211; Build for Pluggability\",\"datePublished\":\"2019-02-22T11:00:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html\"},\"wordCount\":2021,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.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\\\/control-plane-envoy-pluggability.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html\",\"name\":\"Guidance for Building a Control Plane for Envoy - Build for Pluggability - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-02-22T11:00:32+00:00\",\"description\":\"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/02\\\/control-plane-envoy-pluggability.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\\\/control-plane-envoy-pluggability.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; Build for Pluggability\"}]},{\"@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 - Build for Pluggability - Java Code Geeks","description":"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable","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\/control-plane-envoy-pluggability.html","og_locale":"en_US","og_type":"article","og_title":"Guidance for Building a Control Plane for Envoy - Build for Pluggability - Java Code Geeks","og_description":"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable","og_url":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-02-22T11:00:32+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":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html"},"author":{"name":"Christian Posta","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed"},"headline":"Guidance for Building a Control Plane for Envoy &#8211; Build for Pluggability","datePublished":"2019-02-22T11:00:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html"},"wordCount":2021,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.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\/control-plane-envoy-pluggability.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html","url":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html","name":"Guidance for Building a Control Plane for Envoy - Build for Pluggability - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-02-22T11:00:32+00:00","description":"Interested to learn about Pluggability? Check our article explaining how to build your control plane engine in order to be pluggable","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/02\/control-plane-envoy-pluggability.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\/control-plane-envoy-pluggability.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; Build for Pluggability"}]},{"@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\/88734","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=88734"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/88734\/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=88734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=88734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=88734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}