{"id":30782,"date":"2019-10-31T21:37:25","date_gmt":"2019-10-31T18:37:25","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\/"},"modified":"2019-10-31T21:37:25","modified_gmt":"2019-10-31T18:37:25","slug":"razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","title":{"rendered":"Entwicklung von Webservern in Golang \u2014 von einfach bis komplex","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Entwicklung von Webservern in Golang \u2014 von einfach bis komplex\" src=\"\/wp-content\/uploads\/2019\/04\/4ee879ad45f0ed192a15705e20ae00dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVor f\u00fcnf Jahren habe ich begonnen <noindex><a rel=\"nofollow\" href=\"https:\/\/getgophish.com\/\">Gophish zu entwickeln<\/a><\/noindex>, was mir die M\u00f6glichkeit gab, Golang zu lernen. Ich erkannte, dass Go eine leistungsstarke Sprache ist, deren M\u00f6glichkeiten durch eine Vielzahl von Bibliotheken erweitert werden. Go ist vielseitig: insbesondere kann man damit problemlos serverseitige Anwendungen entwickeln.<\/p>\n<p>Dieser Artikel ist dem Schreiben eines Servers in Go gewidmet. Lassen Sie uns mit einfachen Dingen wie \u201eHello World!\u201c beginnen und enden mit einer Anwendung, die folgende Funktionen bietet:<\/p>\n<p>\u2014 Verwendung von Let\u2019s Encrypt f\u00fcr HTTPS.<br \/>\n\u2014 Funktion als API-Router.<br \/>\n\u2014 Arbeiten mit Middleware.<br \/>\n\u2014 Verarbeitung statischer Dateien.<br \/>\n\u2014 Ordentliches Herunterfahren.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox empfiehlt:<\/b> Praktischer Kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/python\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PTNDEV&amp;utm_content=articles&amp;utm_term=gowebserver\">\u201ePython-Entwickler von Grund auf\u201e<\/a><\/noindex>.<\/p>\n<p><b>Wir erinnern daran:<\/b> <i>alle Leser von \u201eHabr\u201c erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode \u201eHabr\u201c.<\/i>\n<\/p><\/blockquote>\n<h3>Hallo, Welt!<\/h3>\n<p>\nEs ist sehr einfach, einen Webserver in Go zu erstellen. Hier ist ein Beispiel, das einen Handler verwendet, der das oben versprochene \u201eHallo, Welt!\u201c zur\u00fcckgibt.<\/p>\n<pre><code class=\"go\">package main\n \nimport (\n\"fmt\"\n\"net\/http\"\n)\n \nfunc main() {\nhttp.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) {\nfmt.Fprintf(w, \"Hallo Welt!\")\n})\nhttp.ListenAndServe(\":80\", nil)\n}<\/code><\/pre>\n<p>\nNachdem Sie dies getan haben, starten Sie die Anwendung und \u00f6ffnen die Seite <noindex>localhost<\/noindex>, werden Sie sofort den Text \u201eHallo, Welt!\u201c sehen (vorausgesetzt, alles funktioniert richtig).<\/p>\n<p>Im Folgenden werden wir den Handler mehrfach verwenden, aber lassen Sie uns zun\u00e4chst verstehen, wie alles funktioniert.<\/p>\n<h4>net\/http<\/h4>\n<p>\nIm Beispiel wurde das Paket <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/pkg\/net\/http\/\"><code>net\/http<\/code><\/a><\/noindex>, welches das Hauptwerkzeug in Go f\u00fcr die Entwicklung sowohl von Servern als auch von HTTP-Clients ist, verwendet. Um den Code zu verstehen, lassen Sie uns die Bedeutung von drei wichtigen Elementen kl\u00e4ren: http.Handler, http.ServeMux und http.Server.<\/p>\n<h4>HTTP-Handler<\/h4>\n<p>\nWenn wir eine Anfrage erhalten, analysiert der Handler sie und formt die Antwort. Handler in Go sind wie folgt implementiert:<\/p>\n<pre><code class=\"go\">type Handler interface {\n        ServeHTTP(ResponseWriter, *Request)\n}<\/code><\/pre>\n<p>\nIm ersten Beispiel wird die Hilfsfunktion http.HandleFunc verwendet. Sie umschlie\u00dft eine andere Funktion, die wiederum http.ResponseWriter und http.Request in ServeHTTP akzeptiert.<\/p>\n<p>Anders ausgedr\u00fcckt, sind die Handler in Golang durch ein einheitliches Interface dargestellt, was den Programmierern viele M\u00f6glichkeiten bietet. So wird beispielsweise Middleware durch einen Handler realisiert, bei dem ServeHTTP zun\u00e4chst etwas macht und dann die Methode ServeHTTP eines anderen Handlers aufruft.<\/p>\n<p>Wie bereits erw\u00e4hnt, formt der Handler einfach die Antworten auf die Anfragen. Aber welchen Handler sollten wir zu einem bestimmten Zeitpunkt verwenden?<\/p>\n<h4>Routing von Anfragen<\/h4>\n<p>\nUm eine fundierte Entscheidung zu treffen, nutzen Sie den HTTP-Multiplexer. In einigen Bibliotheken wird er als muxer oder Router bezeichnet, aber das ist alles dasselbe. Die Funktion des Multiplexers besteht darin, den Pfad der Anfrage zu analysieren und den entsprechenden Handler auszuw\u00e4hlen.<\/p>\n<p>Wenn jedoch Unterst\u00fctzung f\u00fcr komplexe Routen erforderlich ist, ist es besser, auf externe Bibliotheken zur\u00fcckzugreifen. Einige der fortschrittlichsten sind <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>, diese Bibliotheken erm\u00f6glichen eine problemlose Implementierung von Middleware. Mit ihrer Hilfe kann Wildcard-Routing konfiguriert und eine Reihe anderer Aufgaben erledigt werden. Ihr Vorteil ist die Kompatibilit\u00e4t mit den Standard-HTTP-Handlern. So k\u00f6nnen Sie einfachen Code schreiben, den Sie in Zukunft modifizieren k\u00f6nnen.<\/p>\n<p>Die Arbeit mit komplexen Frameworks erfordert in der Regel nicht ganz standardisierte L\u00f6sungen, was die Verwendung von Standard-Handlern erheblich kompliziert. F\u00fcr die meisten Anwendungen reicht die Kombination aus der Standardbibliothek und einem einfachen Router aus.<\/p>\n<h4>Anfragenverarbeitung<\/h4>\n<p>\nZudem ben\u00f6tigen wir eine Komponente, die eingehende Verbindungen \"\u00fcberwacht\" und alle Anfragen an den richtigen Handler weiterleitet. Diese Aufgabe kann problemlos von http.Server \u00fcbernommen werden.<\/p>\n<p>Unten sehen Sie, dass der Server f\u00fcr alle Aufgaben verantwortlich ist, die mit der Verarbeitung von Verbindungen zu tun haben. Dazu geh\u00f6rt beispielsweise die Arbeit mit dem TLS-Protokoll. F\u00fcr den Aufruf von http.ListenAndServer wird der Standard-HTTP-Server verwendet.<\/p>\n<p>Jetzt schauen wir uns komplexere Beispiele an.<\/p>\n<h3>Hinzuf\u00fcgen von Let\u2019s Encrypt<\/h3>\n<p>\nStandardm\u00e4\u00dfig l\u00e4uft unsere Anwendung \u00fcber das HTTP-Protokoll, es wird jedoch empfohlen, das HTTPS-Protokoll zu verwenden. In Go kann dies problemlos umgesetzt werden. Wenn Sie ein Zertifikat und einen privaten Schl\u00fcssel erhalten haben, reicht es aus, ListenAndServeTLS mit den richtigen Zertifikat- und Schl\u00fcsseldateien zu verwenden.<\/p>\n<pre><code class=\"go\">http.ListenAndServeTLS(\":443\", \"cert.pem\", \"key.pem\", nil)<\/code><\/pre>\n<p>\nEs gibt immer Raum f\u00fcr Verbesserungen.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/letsencrypt.org\/\">Let\u2019s Encrypt<\/a><\/noindex> bietet kostenlose Zertifikate mit automatischer Verl\u00e4ngerung. Um den Dienst zu nutzen, ben\u00f6tigen Sie das Paket <code>autocert<\/code>.<\/p>\n<p>Die einfachste M\u00f6glichkeit, es einzurichten, besteht darin, die Methode autocert.NewListener in Kombination mit http.Serve zu verwenden. Die Methode erm\u00f6glicht es, TLS-Zertifikate zu erhalten und zu aktualisieren, w\u00e4hrend der HTTP-Server die Anfragen verarbeitet:<\/p>\n<pre><code class=\"go\">http.Serve(autocert.NewListener(\"example.com\"), nil)<\/code><\/pre>\n<p>\nWenn wir es im Browser \u00f6ffnen <noindex><a rel=\"nofollow\" href=\"https:\/\/example.com\">example.com<\/a><\/noindex>, dann erhalten wir eine HTTPS-Antwort \u201eHallo, Welt!\u201c.<\/p>\n<p>Wenn eine genauere Konfiguration erforderlich ist, sollten Sie den Manager autocert.Manager verwenden. Dann erstellen wir unsere eigene Instanz von http.Server (bis jetzt haben wir die Standardinstanz verwendet) und f\u00fcgen den Manager zum Server TLSConfig hinzu:<\/p>\n<pre><code class=\"go\">m := &amp;autocert.Manager{\nCache: autocert.DirCache(\"golang-autocert\"),\nPrompt: autocert.AcceptTOS,\nHostPolicy: autocert.HostWhitelist(\"example.org\", \"www.example.org\"),\n}\nserver := &amp;http.Server{\n    Addr: \":443\",\n    TLSConfig: m.TLSConfig(),\n}\nserver.ListenAndServeTLS(\"\", \"\")<\/code><\/pre>\n<p>\nDies ist eine einfache M\u00f6glichkeit, vollst\u00e4ndige Unterst\u00fctzung f\u00fcr HTTPS mit automatischer Zertifikatserneuerung zu implementieren.<\/p>\n<h3>Hinzuf\u00fcgen von benutzerdefinierten Routen<\/h3>\n<p>\nDer Standard-Router, der in die Standardbibliothek integriert ist, ist zwar gut, aber er ist sehr einfach. In den meisten Anwendungen wird eine komplexere Routing-L\u00f6sung ben\u00f6tigt, einschlie\u00dflich verschachtelter und Wildcard-Routen oder einer Methode zur Festlegung von Mustern und Routenparametern.<\/p>\n<p>In diesem Fall sollten Sie die Pakete verwenden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>. Mit dem Letzten werden wir arbeiten lernen \u2014 ein Beispiel ist unten dargestellt.<\/p>\n<p>Gegeben ist eine Datei api\/v1\/api.go, die die Routen f\u00fcr unsere API enth\u00e4lt:<\/p>\n<pre><code class=\"go\">\/ HelloResponse is the JSON representation for a customized message\ntype HelloResponse struct {\nMessage string `json:\"message\"`\n}\n \n\/\/ HelloName returns a personalized JSON message\nfunc HelloName(w http.ResponseWriter, r *http.Request) {\nname := chi.URLParam(r, \"name\")\nresponse := HelloResponse{\nMessage: fmt.Sprintf(\"Hello %s!\", name),\n}\njsonResponse(w, response, http.StatusOK)\n}\n \n\/\/ NewRouter returns an HTTP handler that implements the routes for the API\nfunc NewRouter() http.Handler {\nr := chi.NewRouter()\nr.Get(\"\/{name}\", HelloName)\nreturn r\n}<\/code><\/pre>\n<p>\nWir setzen den Routen-Prefix api\/vq in der Hauptdatei fest.<\/p>\n<p>Dann k\u00f6nnen wir dies in unseren Haupt-Router unter dem Prefix api\/v1\/ in unserer Hauptanwendung einf\u00fcgen:<\/p>\n<pre><code class=\"go\">\/\/ NewRouter returns a new HTTP handler that implements the main server routes\nfunc NewRouter() http.Handler {\nrouter := chi.NewRouter()\n    router.Mount(\"\/api\/v1\/\", v1.NewRouter())\n    return router\n}\nhttp.Serve(autocert.NewListener(\"example.com\"), NewRouter())<\/code><\/pre>\n<p>\nDie einfache Handhabung komplexer Routen in Go erm\u00f6glicht es, die Strukturierung der Wartung gro\u00dfer komplexer Anwendungen zu vereinfachen.<\/p>\n<h3>Arbeiten mit Middleware<\/h3>\n<p>\nIm Fall der Middleware wird ein HTTP-Handler in einen anderen gewickelt, was schnelle Authentifizierung, Kompression, Protokollierung und einige andere Funktionen erm\u00f6glicht.<\/p>\n<p>Als Beispiel betrachten wir das Interface http.Handler, mit dem wir einen Handler f\u00fcr die Benutzer-Authentifizierung des Dienstes schreiben werden.<\/p>\n<pre><code class=\"go\">func RequireAuthentication(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        if !isAuthenticated(r) {\n            http.Redirect(w, r, \"\/login\", http.StatusTemporaryRedirect)\n            return\n        }\n        \/\/ Angenommen, die Authentifizierung war erfolgreich, f\u00fchre den urspr\u00fcnglichen Handler aus\n        next.ServeHTTP(w, r)\n    })\n}<\/code><\/pre>\n<p>\nEs gibt externe Router wie chi, die die Funktionalit\u00e4t der Middleware erweitern.<\/p>\n<h3>Arbeiten mit statischen Dateien<\/h3>\n<p>\nDie Standardbibliothek von Go enth\u00e4lt Funktionen zur Arbeit mit statischen Inhalten, einschlie\u00dflich Bildern sowie JavaScript- und CSS-Dateien. Der Zugriff erfolgt \u00fcber die Funktion http.FileServer. Diese gibt einen Handler zur\u00fcck, der Dateien aus einem bestimmten Verzeichnis ausliefert.<\/p>\n<pre><code class=\"go\">func NewRouter() http.Handler {\n    router := chi.NewRouter()\n    r.Get(\"\/{name}\", HelloName)\n \n\/\/ Konfiguration der Bereitstellung statischer Dateien\nstaticPath, _ := filepath.Abs(\"..\/..\/static\/\")\nfs := http.FileServer(http.Dir(staticPath))\n    router.Handle(\"\/*\", fs)\n    \n    return r<\/code><\/pre>\n<p>\nEs ist wichtig zu beachten, dass http.Dir den Inhalt eines Verzeichnisses nur anzeigt, wenn darin keine index.html-Datei vorhanden ist. In diesem Fall sollte das Paket verwendet werden, um eine Kompromittierung des Verzeichnisses zu vermeiden. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jordan-wright\/unindexed\"><code>nicht indiziert<\/code><\/a><\/noindex>.<\/p>\n<h3>Sanftes Herunterfahren<\/h3>\n<p>\nIn Go gibt es auch eine Funktion zum sanften Herunterfahren des HTTP-Servers. Dies kann mit der Methode Shutdown() erfolgen. Der Server wird in einer Goroutine gestartet, und dann wird ein Kanal abgeh\u00f6rt, um ein Unterbrechungssignal zu empfangen. Sobald das Signal empfangen wird, wird der Server abgeschaltet, jedoch nicht sofort, sondern nach einigen Sekunden.<\/p>\n<pre><code class=\"go\">handler := server.NewRouter()\nsrv := &amp;http.Server{\n    Handler: handler,\n}\n \ngo func() {\nsrv.Serve(autocert.NewListener(domains...))\n}()\n \n\/\/ Auf ein Interrupt warten\nc := make(chan os.Signal, 1)\nsignal.Notify(c, os.Interrupt)\n&lt;-c\n \n\/\/ Versuch eines sanften Herunterfahrens\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\nsrv.Shutdown(ctx)<\/code><\/pre>\n<p><\/p>\n<h3>Als Fazit<\/h3>\n<p>\nGo ist eine leistungsstarke Sprache mit einer nahezu universellen Standardbibliothek. Ihre Standardfunktionen sind sehr umfassend, und man kann sie durch Schnittstellen erweitern, was die Entwicklung wirklich zuverl\u00e4ssiger HTTP-Server erm\u00f6glicht.<\/p>\n<blockquote><p><b>Skillbox empfiehlt:<\/b><\/p>\n<ul>\n<li>Zweij\u00e4hriger praktischer Kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/\">\u201eIch bin ein Webentwickler PRO\u201c<\/a><\/noindex>.<\/li>\n<li>Online-Kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/\">\u201eBeruf Java-Entwickler\u201c<\/a><\/noindex>.<\/li>\n<li>Praktischer Jahreskurs <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/\">\u201ePHP-Entwickler von 0 bis PRO\u201c<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/446454\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Gophish, \u044d\u0442\u043e \u0434\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u0443\u0447\u0438\u0442\u044c Golang. \u042f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e Go \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. Go \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u0435\u043d: \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Go. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0432\u0440\u043e\u0434\u0435 \u00abHello world!\u00bb, \u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22767,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-30782","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043d\u0430 Golang \u2014 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:37:25+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:37:25+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Entwicklung von Webservern auf Golang \u2014 von einfach zu komplex | ProHoster","description":"Vor f\u00fcnf Jahren habe ich angefangen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043d\u0430 Golang \u2014 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 | ProHoster","og:description":"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.","og:url":"https:\/\/prohoster.info\/de\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:37:25+00:00","article:modified_time":"2019-10-31T18:37:25+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30782","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 02:59:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:29:56","updated":"2026-01-21 02:59:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=30782"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30782\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/22767"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=30782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=30782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=30782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}