{"id":2793,"date":"2022-05-13T06:51:52","date_gmt":"2022-05-13T06:51:52","guid":{"rendered":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?p=2793"},"modified":"2022-07-15T12:04:58","modified_gmt":"2022-07-15T12:04:58","slug":"yarp-ein-schneller-und-zuverlaessiger-reverse-proxy","status":"publish","type":"post","link":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/","title":{"rendered":"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">M\u00f6glichkeiten der .NET-basierten Open-Source-L\u00f6sung von Microsoft<\/h2>\n\n\n\n<p>Routing, Load Balancing, Authentifizierung, Autorisierung und Ausfallsicherheit sind wichtige Themen in vielen Webprojekten. Microsoft hat eine gro\u00dfe Anzahl von Teams, welche einen Reverse Proxy f\u00fcr ihre Dienste selbst schreiben oder nach L\u00f6sungen suchen, um die genannten Aufgaben abzubilden. Dies war ein guter Anlass, die unterschiedlichen Anforderungen zusammenzubringen, um an einer gemeinsamen L\u00f6sung zu arbeiten. YARP wurde ins Leben gerufen \u2013 das Microsoft Open-Source-Projekt f\u00fcr einen Reverse Proxy in .NET.<\/p>\n\n\n\n<p>Vor mehr als einem Jahr hat Microsoft die erste Preview ver\u00f6ffentlicht. Seitdem gab es viele Verbesserungen und YARP ist zusammen mit dem neuen .NET 6 am 9. November 2021 in der Version 1.0 erschienen.<\/p>\n\n\n\n<p>In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben, die uns Microsoft an die Hand gibt. Daf\u00fcr schauen wir uns als Erstes an, was ein Reverse Proxy eigentlich ist und wie sich YARP positioniert. Danach betrachten wir die vielf\u00e4ltigen Konfigurationsm\u00f6glichkeiten, um am Ende einen Ausblick zu geben.<\/p>\n\n\n\n<p>YARP ist in C# geschrieben und auf .NET aufgebaut. Es nutzt die Infrastruktur von ASP.NET und .NET. Somit werden .NET Core 3.1 und .NET 5 sowie das schon erw\u00e4hnte .NET 6 unterst\u00fctzt. Bei der Verwendung von .NET Core 3.1 stehen allerdings einige Funktionen nicht zur Verf\u00fcgung, da YARP bei den neueren .NET Versionen auf einige neue Features und Optimierungen zur\u00fcckgreift.<\/p>\n\n\n\n<figure class=\"wp-block-image size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-600x400.jpg\" alt=\"Tastatur mit Open-Source-Taste\" class=\"wp-image-2960\" srcset=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-600x400.jpg 600w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-1024x683.jpg 1024w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-768x512.jpg 768w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-1536x1024.jpg 1536w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-640x427.jpg 640w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-1200x800.jpg 1200w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg 1920w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 600px\" \/><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Was ist ein Reverse Proxy<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>Ein Reverse Proxy ist eine Art Proxy-Server, der typischerweise hinter der Firewall in einem privaten Netzwerk sitzt und Client-Anfragen an Backend Services weiterleitet. Dabei liefert der Reverse Proxy eine zus\u00e4tzliche Abstraktions- und Steuerungsschicht, um den reibungslosen Fluss des Netzwerkverkehrs zwischen den Clients und Servern zu gew\u00e4hrleisten.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Was ist YARP<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>Ein klassischer Reverse Proxy arbeitet meist auf der Transportschicht (4. Ebene \u2013 TCP\/IP) des ISO\/OSI Modells und routet die Anfragen immer weiter. Im Vergleich dazu befindet sich YARP auf der 7. Ebene \u2013 hier http-Level \u2013 und es werden die eingehenden Verbindungen gekappt und neue zum Ziel-Server erstellt. Die eingehenden und ausgehenden Verbindungen sind somit unabh\u00e4ngig. Dadurch ist ein Remapping des URL Space m\u00f6glich, d. h. es gibt einen Unterschied zwischen den URLs, die von au\u00dfen sichtbar sind und denen im Backend.<\/p>\n\n\n\n<p>Eine Entlastung der Backend Server ist durch Aufgabenverschiebung in den Reverse Proxy m\u00f6glich.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Warum YARP?<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>Die Nutzungsm\u00f6glichkeiten von YARP und den vielen anderen (klassischen) Reverse Proxys sind unterschiedlicher Natur. Ein Entwickler im ASP.NET-Umfeld kann leicht die Funktionalit\u00e4t des Reverse Proxys in seiner gewohnten Programmiersprache einrichten, konfigurieren und erweitern. Ebenso kann der Reverse Proxy mit allen Konfigurationen, wie jedes andere Projekt auch, mit der Versionskontrolle versioniert werden. Au\u00dferdem ist es Cross-Plattform-f\u00e4hig, d. h. es l\u00e4uft sowohl unter Windows als auch Linux und eignet sich somit gut zur Containerisierung.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Funktionen von YARP<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>Eine der wichtigsten Anforderungen ist die Erweiterbarkeit sowie Anpassbarkeit von YARP. Zur Konfiguration kann jede Quelle, die das IConfiguration Interface abbildet, angebunden werden. Klassischerweise sind das JSON-Konfigurationsdateien. Die Konfiguration wird bei \u00c4nderungen ohne Neustart automatisch aktualisiert. Es ist aber auch m\u00f6glich, die Konfiguration dynamisch \u00fcber eine API zu steuern oder sogar on demand pro Anfrage.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Anatomie einer Anfrage<\/strong><\/strong><\/h3>\n\n\n\n<p>Um die Funktionen besser zu verstehen, ist es sinnvoll, sich zuerst einen \u00dcberblick \u00fcber die Pipeline-Architektur von YARP zu verschaffen. Als Erstes landet eine eingehende Anfrage in der Standard ASP .NET Middleware (z. B. TLS Termination, Statische Files, Routing, Authentifizierung und Autorisierung). Anschlie\u00dfend folgen verschiedene Phasen in YARP.<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Durchlauf \u00fcber alle Ziel-Server inkl. Health Check<\/li><li>Session Affinity<\/li><li>Load Balancing<\/li><li>Passive Health Checks<\/li><li>Transformation der Anfrage<\/li><li>Weiterleitung der Anfrage durch eine neue Verbindung an den Ziel-Server<\/li><\/ol>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Routen und Cluster<\/strong><\/strong><\/h3>\n\n\n\n<p>Der Reverse Proxy kann sowohl f\u00fcr Routen als auch f\u00fcr Cluster konfiguriert werden. Die Routenkonfiguration ist eine geordnete Liste von Routentreffern mit den dazugeh\u00f6rigen Konfigurationen. Eine Route wird typischerweise durch drei Bestandteile definiert. Das sind die Routen-ID, Cluster-ID und ein Match-Kriterium. Wenn also eine eingehende Verbindung ankommt, wird diese mit dem Match-Kriterium verglichen. Dabei wird die Liste der Routeneintr\u00e4ge nacheinander abgearbeitet. Wird das Match-Kriterium erf\u00fcllt, so wird das Cluster mit der angegebenen ID zur Weiterleitung verwendet. F\u00fcr eine Route k\u00f6nnen aber auch CORS, Transformer, Authentifizierung und Autorisierung konfiguriert werden.<\/p>\n\n\n\n<p>In Abbildung 1 ist eine Beispiel-Konfiguration f\u00fcr Routen und Cluster zu sehen.<\/p>\n\n\n\n<p>Im Gegensatz zum \u201eRoutes<strong>\u201c<\/strong> Abschnitt, enth\u00e4lt der <strong>\u201e<\/strong>Cluster<strong>&#8222;<\/strong> Abschnitt eine ungeordnete Sammlung von benannten Clustern. Ein Cluster enth\u00e4lt in erster Linie eine Sammlung von benannten Zielen und deren Adressen, von denen jedes als f\u00e4hig angesehen wird, Anfragen f\u00fcr eine bestimmte Route zu bearbeiten. Der Proxy verarbeitet die Anfrage entsprechend der Routen- und Cluster-Konfiguration, um ein Ziel auszuw\u00e4hlen.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n    \"ReverseProxy\": {\n        \"Routes\": {\n            \"minimumroute\": {\n                \"ClusterId\": \"minimumcluster\",\n                \"Match\": {\n                    \"Path\": \"{**catch-all}\"\n                }\n            },\n            \"route2\": {\n                \"ClusterId\": \"cluster2\",\n                \"Match\": {\n                    \"Path\": \"\/something\/{*any}\"\n                }\n            }\n        },\n        \"Clusters\": {\n            \"minimumcluster\": {\n                \"Destinations\": {\n                    \"example.com\": {\n                        \"Address\": \"http:\/\/www.example.com\/\"\n                    }\n                }\n            },\n            \"cluster2\": {\n                \"Destinations\": {\n                    \"first_destination\": {\n                        \"Address\": \"https:\/\/contoso.com\"\n                    },\n                    \"another_destination\": {\n                        \"Address\": \"https:\/\/bing.com\"\n                    }\n                },\n                \"LoadBalancingPolicy\": \"PowerOfTwoChoices\"\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p><em>Abbildung 1: Beispiel-Konfiguration mit den grundlegenden Funktionen (Routen, Cluster und Load Balancing)<\/em><\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>TLS Termination<\/strong><\/strong><\/h3>\n\n\n\n<p>Wie schon erw\u00e4hnt werden die eingehenden Verbindungen gekappt und neue zum Ziel-Server hergestellt. Da TLS Verbindungen teuer sind, kann das f\u00fcr kleine Aufrufe die Geschwindigkeit verbessern. Dies kann vor allem dann sinnvoll sein, wenn der Proxy auf Server weiterleitet, die sich alle im internen Netz befinden und keine gesicherte Verbindung mehr notwendig ist. Folgende M\u00f6glichkeiten sind hier vorstellbar:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Routing einer eingehenden HTTPS auf HTTP Verbindung<\/li><li>Routing einer eingehenden HTTPS\/1 auf HTTP\/2 Verbindung<\/li><li>Routing einer eingehenden HTTP auf HTTPS Verbindung<\/li><\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Session Affinity<\/strong><\/strong><\/h3>\n\n\n\n<p>Die Session Affinity ist ein Mechanismus zur Bindung (Affinit\u00e4t) einer zusammenh\u00e4ngenden Anforderungssequenz an das Ziel, das die erste Anforderung bearbeitet hat, wenn die Last auf mehrere Ziele verteilt ist.<\/p>\n\n\n\n<p>Es ist in Szenarien n\u00fctzlich, in denen die meisten Anfragen in einer Sequenz mit denselben Daten arbeiten und die Kosten des Datenzugriffs f\u00fcr verschiedene Ziele, die Anfragen bearbeiten, unterschiedlich sind.<\/p>\n\n\n\n<p>Das h\u00e4ufigste Beispiel ist ein transientes Caching (z. B. In-Memory). Dabei werden w\u00e4hrend der ersten Anfrage Daten aus einem langsameren persistenten Speicher in einen schnellen lokalen Cache geholt. Bei weiteren Anfragen k\u00f6nnen diese mit den Daten aus dem Cache bearbeitet werden, wodurch der Durchsatz erh\u00f6ht wird.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Load Balancing<\/strong><\/strong><\/h3>\n\n\n\n<p>Wenn f\u00fcr eine Route mehrere gesunde Ziele verf\u00fcgbar sind, kann einer der folgenden Load Balancing Algorithmen konfiguriert werden:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Random<\/li><li>Round Robin<\/li><li>Least Requests<\/li><li>Power of Two Choices<\/li><li>First<\/li><\/ul>\n\n\n\n<p>An dieser Stelle kann auch ein selbst entwickelter Algorithmus verwendet werden.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Health Checks<\/strong><\/strong><\/h3>\n\n\n\n<p>Der Reverse Proxy kann den Gesundheitszustand jedes Knotens analysieren und den Client-Verkehr zu ungesunden Knoten stoppen, bis sie sich erholen. YARP implementiert diesen Ansatz in Form von aktiven und passiven Pr\u00fcfungen.<\/p>\n\n\n\n<p><strong>Passiv<\/strong><\/p>\n\n\n\n<p>YARP kann passiv auf Erfolge und Misserfolge beim Weiterleiten von Client-Anfragen achten. Die Antworten auf die Proxy-Anfragen werden von einer dedizierten Middleware zur passiven Gesundheitspr\u00fcfung abgefangen, die sie an eine auf dem Cluster konfigurierte Richtlinie weiterleitet. Die Richtlinie analysiert die Antworten, um festzustellen, ob die Ziele, die sie erzeugt haben, gesund sind oder nicht. Dann berechnet sie neue passive Gesundheitszust\u00e4nde, weist sie den jeweiligen Zielen zu und baut die Sammlung der gesunden Ziele des Clusters neu auf.<\/p>\n\n\n\n<p><strong>Aktiv<\/strong><\/p>\n\n\n\n<p>YARP kann den Zustand der Ziel-Server auch aktiv \u00fcberwachen. Daf\u00fcr werden regelm\u00e4\u00dfig Anfragen an vordefinierte Zustandsendpunkte gesendet. Diese Analyse wird durch eine f\u00fcr einen Cluster festgelegte Richtlinie zur aktiven Gesundheitspr\u00fcfung definiert. Am Ende wird anhand der Richtlinie jedes Ziel als gesund oder ungesund markiert.<\/p>\n\n\n\n<p>Durch die aktiven und passiven Checks werden ungesunde Cluster automatisch geblockt und es k\u00f6nnen Wartungsarbeiten durchgef\u00fchrt werden, ohne dass die Anwendung beeintr\u00e4chtigt wird.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Transformer<\/strong><\/strong><\/h3>\n\n\n\n<p>Mit Hilfe von Transformern kann der Proxy Teile der Anfrage oder Antwort modifizieren. Dies kann notwendig sein, um z. B. definierte Anforderungen des Ziel-Servers zu erf\u00fcllen. Dabei wird das urspr\u00fcngliche Anfrage-Objekt nicht ver\u00e4ndert, sondern nur die Proxy-Anfrage. Es wird keine Auswertung des Anfrage-Bodys durchgef\u00fchrt und es erfolgt keine \u00c4nderung des Anfrage- und Antwort-Bodys. Allerdings kann dies \u00fcber eine zus\u00e4tzliche Middleware erreicht werden \u2013 falls notwendig. An dieser Stelle k\u00f6nnte beispielsweise das ebenfalls auf .NET basierende API-Gateway Ocelot seine St\u00e4rken ausspielen. Dieses kann Konvertierungen wie XML zu JSON vornehmen oder mehrere Antworten zusammenf\u00fchren und richtet sich vor allem an .NET-Anwendungen mit einer Microservice- oder serviceorientierten Architektur.<\/p>\n\n\n\n<p>Es gibt einige Transformer, die standardm\u00e4\u00dfig aktiviert sind. Dazu geh\u00f6ren unter anderem das Protokoll (X-Forwarded-Proto), der angefragte Server (X-Forwarded-Host) und die Ursprungs-IP (X-Forwarded-For).<\/p>\n\n\n\n<p>Der Ursprung der Anfrage ist dementsprechend nach dem Routing des Reverse Proxys im Backend \u00fcber die hinzugef\u00fcgten Headerinfos weiterhin bekannt \u2013 dies ist nicht bei klassischen Reverse Proxys gegeben.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Authentifizierung und Autorisierung<\/strong><\/strong><\/h3>\n\n\n\n<p>Vor der Weiterleitung sind eine Authentifizierung und Autorisierung m\u00f6glich. Dadurch k\u00f6nnen konsistente Richtlinien \u00fcber mehrere Services abgebildet werden und m\u00fcssen somit nicht separat gepflegt werden. Au\u00dferdem f\u00fchrt das zu einer Lastreduzierung bei den Zielsystemen. Die Autorisierungsrichtlinien sind ein ASP.NET Core-Konzept. Es wird eine Richtlinie pro Route festgelegt und der Rest wird von den vorhandenen ASP.NET Core-Authentifizierungs- und Autorisierungskomponenten erledigt.<\/p>\n\n\n\n<p>Folgende Verfahren werden von YARP unterst\u00fctzt:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Cookie, Bearer, API Keys<\/li><li>OAuth2, OpenIdConnect, WsFederation<\/li><li>Client-Zertifikate<\/li><\/ul>\n\n\n\n<p>Nicht unterst\u00fctzt werden hingegen die Windows-, Negotiate-, NTLM- und Kerbereos-Authentifizierung, da diese meist an eine bestimmte Verbindung gebunden sind.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Cross-Origin Resource Sharing \u2013 CORS<\/strong><\/strong><\/h3>\n\n\n\n<p>YARP kann Cross-Origin Requests behandeln, bevor sie an den Ziel-Server geleitet werden. Dies reduziert die Last auf den Ziel-Servern und sorgt f\u00fcr einheitliche Richtlinien.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Direkte Weiterleitung mit IHttpForwarder<\/strong><\/strong><\/h3>\n\n\n\n<p>Wenn die Applikation nicht den vollst\u00e4ndigen Funktionsumfang ben\u00f6tigt, kann anstelle der kompletten Feature-Menge auch nur der IHttpForwarder verwendet werden. Dieser dient als Proxy-Adapter zwischen eingehenden und ausgehenden Verbindungen.<\/p>\n\n\n\n<p>Der Proxy \u00fcbernimmt in diesem Fall die Erstellung einer HttpRequestMessage aus einem HttpContext, das Senden und die Weiterleitung der Antwort.<\/p>\n\n\n\n<p>Der IHttpForwarder unterst\u00fctzt die dynamische Zielauswahl, wobei man selbst das Ziel f\u00fcr jede Anfrage festlegt.<\/p>\n\n\n\n<p>Es k\u00f6nnen Anpassung an Anfrage und Antwort vorgenommen werden, wobei der Body ausgeschlossen ist. Und zu guter Letzt werden die Streaming-Protokolle gRPC und WebSockets sowie Fehlerbehandlungen unterst\u00fctzt.<\/p>\n\n\n\n<p>Diese minimale Variante unterst\u00fctzt kein Routing, Load Balancing, Session Affinity und Retries \u2013 bringt aber einige Performance-Vorteile mit sich.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Ausblick<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>F\u00fcr kommende Releases arbeitet das Team hinter YARP an der Unterst\u00fctzung von HTTP\/3, Service Fabric, einer Integration in Kubernetes sowie weiteren Performance-Verbesserungen.<\/p>\n\n\n\n<p>Zus\u00e4tzlich versucht Microsoft mit LLHTTP (Low Level HTTP) eine Alternative zum aktuellen HttpClient zu entwickeln, um mehr Kontrolle dar\u00fcber zu haben, wie Anfragen gestellt und verarbeitet werden. Es soll insbesondere in Szenarien eingesetzt werden, bei denen die Performance wichtiger ist als eine einfache Verwendung. In YARP soll es f\u00fcr mehr Kontrolle \u00fcber ausgehende Verbindungen und eine effizientere Verarbeitung von Headern eingesetzt werden.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong><strong>Fazit<\/strong><\/strong><\/strong><\/h2>\n\n\n\n<p>In diesem Artikel wurden die Grundlagen von YARP und die umfangreichen Funktionen erl\u00e4utert. Mit Hilfe des gewonnenen Wissens und der Menge an guten Code-Beispielen im YARP-Repository auf GitHub k\u00f6nnen Sie jetzt einsch\u00e4tzen, ob die Funktionalit\u00e4ten f\u00fcr einen gegebenen Anwendungsfall ausreichen und Ihren eigenen Reverse Proxy erstellen.<\/p>\n\n\n\n<p>Da das Toolkit auf dem ASP.NET Core Stack basiert, kann es auf jeder Umgebung ausgef\u00fchrt werden, die Sie bisher f\u00fcr Ihre .NET Core-Projekte verwendet haben.<\/p>\n\n\n\n<p>Microsoft liefert mit YARP einen schnellen und zuverl\u00e4ssigen Reverse Proxy der n\u00e4chsten Generation und wird in vielen Projekten Verwendung finden \u2013 nicht nur in denen von Microsoft.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.<\/p>\n","protected":false},"author":136,"featured_media":2960,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[16],"tags":[337,570,650,651,652,653],"topics":[],"class_list":["post-2793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dot-net","tag-editorschoice","tag-zeiss-digital-innovation","tag-yarp","tag-configuration","tag-reverse-proxy","tag-c-sharp"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>YARP - Ein Schneller und zuverl\u00e4ssiger ... - ZEISS Digital Innovation Blog<\/title>\n<meta name=\"description\" content=\"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy\" \/>\n<meta property=\"og:description\" content=\"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital Innovation Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ZEISSDigitalInnovation\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-13T06:51:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-15T12:04:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Erik Sniegula\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy\" \/>\n<meta name=\"twitter:description\" content=\"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.\" \/>\n<meta name=\"twitter:creator\" content=\"@ZEISS_di\" \/>\n<meta name=\"twitter:site\" content=\"@ZEISS_di\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erik Sniegula\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/\",\"name\":\"YARP - Ein Schneller und zuverl\u00e4ssiger ... - ZEISS Digital Innovation Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg\",\"datePublished\":\"2022-05-13T06:51:52+00:00\",\"dateModified\":\"2022-07-15T12:04:58+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/298aa7b604772ef8d876c07da6aa2658\"},\"description\":\"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.\",\"breadcrumb\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg\",\"width\":1920,\"height\":1280},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/\",\"name\":\"Digital Innovation Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/298aa7b604772ef8d876c07da6aa2658\",\"name\":\"Erik Sniegula\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/01\/sniegula_erik-150x150.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/01\/sniegula_erik-150x150.jpg\",\"caption\":\"Erik Sniegula\"},\"description\":\"Erik Sniegula hat an der Freien Universit\u00e4t Berlin Informatik mit dem Schwerpunkt Algorithmen studiert und ist Senior Consultant bei der ZEISS Digital Innovation. Neben seiner Entwicklert\u00e4tigkeit ist er als Projektcoach t\u00e4tig. Dabei initiiert, organisiert und moderiert er den projekt\u00fcbergreifenden, probleml\u00f6sungsorientierten Austausch im Bereich .NET. Seine Passion liegt im Bereich .NET, insbesondere der Analyse und Optimierung der Performance sowie beim Debugging.\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/eriksniegula\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"YARP - Ein Schneller und zuverl\u00e4ssiger ... - ZEISS Digital Innovation Blog","description":"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.","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:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/","og_locale":"de_DE","og_type":"article","og_title":"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy","og_description":"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.","og_url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/","og_site_name":"Digital Innovation Blog","article_publisher":"https:\/\/www.facebook.com\/ZEISSDigitalInnovation\/","article_published_time":"2022-05-13T06:51:52+00:00","article_modified_time":"2022-07-15T12:04:58+00:00","og_image":[{"width":1920,"height":1280,"url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg","type":"image\/jpeg"}],"author":"Erik Sniegula","twitter_card":"summary_large_image","twitter_title":"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy","twitter_description":"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.","twitter_creator":"@ZEISS_di","twitter_site":"@ZEISS_di","twitter_misc":{"Verfasst von":"Erik Sniegula","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/","name":"YARP - Ein Schneller und zuverl\u00e4ssiger ... - ZEISS Digital Innovation Blog","isPartOf":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage"},"image":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg","datePublished":"2022-05-13T06:51:52+00:00","dateModified":"2022-07-15T12:04:58+00:00","author":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/298aa7b604772ef8d876c07da6aa2658"},"description":"In diesem Artikel wollen wir uns YARP etwas genauer anschauen und einen \u00dcberblick \u00fcber die Konfigurationsm\u00f6glichkeiten geben.","breadcrumb":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#primaryimage","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002.jpg","width":1920,"height":1280},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/yarp-ein-schneller-und-zuverlaessiger-reverse-proxy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/"},{"@type":"ListItem","position":2,"name":"YARP \u2013 Ein schneller und zuverl\u00e4ssiger Reverse Proxy"}]},{"@type":"WebSite","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/","name":"Digital Innovation Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/298aa7b604772ef8d876c07da6aa2658","name":"Erik Sniegula","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/image\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/01\/sniegula_erik-150x150.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/01\/sniegula_erik-150x150.jpg","caption":"Erik Sniegula"},"description":"Erik Sniegula hat an der Freien Universit\u00e4t Berlin Informatik mit dem Schwerpunkt Algorithmen studiert und ist Senior Consultant bei der ZEISS Digital Innovation. Neben seiner Entwicklert\u00e4tigkeit ist er als Projektcoach t\u00e4tig. Dabei initiiert, organisiert und moderiert er den projekt\u00fcbergreifenden, probleml\u00f6sungsorientierten Austausch im Bereich .NET. Seine Passion liegt im Bereich .NET, insbesondere der Analyse und Optimierung der Performance sowie beim Debugging.","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/eriksniegula\/"}]}},"author_meta":{"display_name":"Erik Sniegula","author_link":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/eriksniegula\/"},"featured_img":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2022\/05\/Bild_Blog_YARP_1-002-600x400.jpg","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">.NET<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.NET<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">Editor&#039;s Choice<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">ZEISS Digital Innovation<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">YARP<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">Configuration<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">Reverse Proxy<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">C-Sharp<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Editor&#039;s Choice<\/span>","<span class=\"advgb-post-tax-term\">ZEISS Digital Innovation<\/span>","<span class=\"advgb-post-tax-term\">YARP<\/span>","<span class=\"advgb-post-tax-term\">Configuration<\/span>","<span class=\"advgb-post-tax-term\">Reverse Proxy<\/span>","<span class=\"advgb-post-tax-term\">C-Sharp<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 4\u00a0Jahren ago","modified":"Updated 4\u00a0Jahren ago"},"absolute_dates":{"created":"Posted on Mai 13, 2022","modified":"Updated on Juli 15, 2022"},"absolute_dates_time":{"created":"Posted on Mai 13, 2022 6:51 a.m.","modified":"Updated on Juli 15, 2022 12:04 p.m."},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/2793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/users\/136"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/comments?post=2793"}],"version-history":[{"count":14,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/2793\/revisions"}],"predecessor-version":[{"id":3198,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/2793\/revisions\/3198"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/media\/2960"}],"wp:attachment":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/media?parent=2793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/categories?post=2793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/tags?post=2793"},{"taxonomy":"topics","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/topics?post=2793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}