SlideShare ist ein Scribd-Unternehmen logo
Web-Services mit Go
Go-Features an Hand von Beispielen
Sebastian ‘tokkee’ Harl
<sh@tokkee.org>
Überblick
Was ist Go?
Go is an open source programming language that makes it easy to
build simple, reliable, and efficient software.
https://golang.org
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 2
Web-Services mit Go
Web-Services
Quelle: http://martinfowler.com/articles/microservices.html
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 4
Web-Services
• HTTP Frontend
Viele parallele Client-Anfragen
Eine oder mehrere Verbindungen zu Backends
• Backend („Business Logic“)
Viele parallele Anfragen vom Frontend
Eine oder mehrere Datenbank-Verbindungen oder Interaktion mit
anderen Backends
• Datenbank
⇒ skalierbare Micro-Services / lose Kopplung
Auch: Gleiche Prinzipien bei Integration mit anderen Lösungen
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 5
Einschub: Go Standard Bibliothek
https://golang.org/pkg/
• Crypto
• Datenbanken
• Go Parser
• Netzwerk, HTTP, SMTP, etc.
• Datenstrukturen
Mehr? ⇒ https://godoc.org/
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 6
Ein Webserver
1 import ( . . . )
2
3 func main () {
4 http . HandleFunc ( "/ h a l l o " , s a g e H a l l o )
5 log . F a t a l ( http . ListenAndServe ( " :9999 " , n i l ))
6 }
7
8 func s a g e H a l l o (w http . ResponseWriter , r ∗ http . Request ) {
9 fmt . F p r i n t f (w, " Hallo %s " , r . RemoteAddr )
10 }
• https://golang.org/pkg/log/
• https://golang.org/pkg/net/http/
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 7
Ein Webserver – Templates
1 var tmpl = template . Must (
2 template . New( " r e s u l t s " ) . Parse ( ‘
3 <html><head>
4 <t i t l e >{{. T i t l e }}</ t i t l e >
5 </head>
6
7 <body>
8 <h1>Hallo {{.Name}}</h1>
9 </body></html>
10 ‘ ))
• https://golang.org/pkg/html/template/
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 8
Ein Webserver – Templates (2)
1 func s a g e H a l l o ( . . . ) {
2 d := s t r u c t {
3 T i t l e , Name s t r i n g
4 }{ " Hallo Welt " , r . RemoteAddr}
5
6 var buf bytes . B u f f e r
7 i f e r r := tmpl . Execute(&buf , d ) ; e r r != n i l {
8 http . E r r o r (w, e r r . E r r o r ( ) , http . S t a t u s I n t e r n a l S e r v e r E r r o r )
9 return
10 }
11 i o . Copy (w, &buf )
12 }
• https://golang.org/pkg/bytes/
• https://golang.org/pkg/io/
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 9
Einschub: io.Writer
• Warum funktioniert fmt.Printf, tmpl.Execute, http.Error, io.Copy
eigentlich mit dem http.ResponseWriter und bytes.Buffer?
1 package i o
2 type Writer i n t e r f a c e {
3 Write ( p [ ] byte ) ( n int , e r r e r r o r )
4 }
⇒ Sehr einfaches Interface
⇒ http.ResponseWriter und bytes.Buffer implementieren es
Viele andere Beispiele ...
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 10
Viele Backend-Abfragen
1 func Query (∗ Request ) (∗ Response , e r r o r ) { . . . }
2
3 func an frage (w http . ResponseWriter , r ∗ http . Request ) {
4 r e q u e s t s := [ ] ∗ Request { . . . }
5
6 r e s p o n s e s := make ( [ ] ∗ Reponse , len ( r e q u e s t s ))
7 errCh := make( chan e r r o r , len ( r e q u e s t s ))
8
9 f o r i , req := range r e q u e s t s {
10 go func ( req ∗ Request ) {
11 var e r r e r r o r
12 r e s p o n s e s [ i ] , e r r = Query ( req )
13 errCh <− e r r
14 }( req )
15 }
16
17 // . . .
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 11
Viele Backend-Abfragen (2)
1 . . .
2 timeout := time . A f t e r (50∗ time . M i l l i s e c o n d )
3
4 f o r range r e q u e s t s {
5 s e l e c t {
6 case e r r := <−errCh :
7 i f e r r != n i l {
8 http . E r r o r (w, e r r . E r r o r ( ) , http . StatusBadRequest )
9 return
10 }
11 case <−timeout :
12 http . E r r o r (w, " timeout " , http . StatusRequestTimeout )
13 return
14 }
15 }
16 // A l l e E r g e b n i s s e v e r f ü gbar .
• Siehe auch https://golang.org/pkg/sync/#WaitGroup
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 12
Spezielle Fehlerbehandlung
1 go func ( req ∗ Request ) {
2 var e r r e r r o r
3 defer func () {
4 i f e := recover ( ) ; e != n i l {
5 e r r = fmt . E r r o r f ( " e r r o r w h i l e querying backend : %v " , e )
6 }
7 errCh <− e r r
8 }()
9
10 r e s p o n s e s [ i ] , e r r = Query ( req )
11 }( req )
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 13
Backends – gRPC
Beispiel: Backend Kommunikation / API
A high performance, open source, general RPC framework that puts
mobile and HTTP/2 first.
https://grpc.io
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 14
gRPC Überblick
https://github.com/google/protobuf
• gRPC basiert auf Protocol Buffers
• Unterstützung diverser Sprachen
C++, Java, Go, Python, . . .
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 15
gRPC Beispiel
1 syntax " proto3 " ;
2
3 package mein_service ;
4
5 s e r v i c e Backend {
6 rpc Query ( QueryRequest ) return ( QueryResponse ) ;
7
8 // . . .
9 }
10
11 message QueryRequest {
12 s t r i n g query = 1;
13 }
14
15 message QueryResponse {
16 s t r i n g type = 1;
17 int64 n = 2;
18 }
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 16
gRPC mit Go
• Die „protobuf“ Datei muss mittels des Protobuf Compilers und
einer gRPC Compiler-Erweiterung übersetzt werden
• Der Compiler erzeugt Go Code, welcher Interfaces und
generischen Code erzeugt
• Das Interface entspricht im Wesentlichen der service Definition
• Das Interface muss für den Server implementiert werden
• Generischer Client-Code sollte ausreichen
→ API Entwurf!
https://github.com/grpc/grpc-go
https://golang.org/x/net/context
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 17
gRPC mit Go: Server
1 import pb " tokkee . net / mein_service / s e r v i c e _ p r o t o "
2
3 type s e r v e r s t r u c t {}
4
5 func (∗ s e r v e r ) Query ( ctx context . Context ,
6 i n ∗pb . QueryRequest ) (∗ pb . QueryResponse , e r r o r ) {
7
8 n , e r r := runQuery ( i n . Query )
9 i f e r r != n i l {
10 return n i l , e r r
11 }
12 return &pb . QueryResponse {
13 Type : " irgendwas " ,
14 N: n ,
15 } , n i l
16 }
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 18
gRPC mit Go: Server (2)
1 func main () {
2 l , e r r := net . L i s t e n ( " tcp " , port )
3 i f e r r != n i l {
4 log . F a t a l ( e r r )
5 }
6
7 s := grpc . NewServer ()
8 pb . RegisterBackendServer ( s , &s e r v e r {})
9 s . Serve ( l )
10 }
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 19
gRPC mit Go: Client
1 func main () {
2 ctx := context . Background ()
3
4 conn , e r r := grpc . D i a l ( " l o c a l h o s t :50051 " , grpc . WithInsecure ( ) )
5 i f e r r != n i l {
6 log . F a t a l ( e r r )
7 }
8 defer conn . Close ()
9 c := pb . NewBackendClient ( conn )
10
11 res , e r r := c . Query ( ctx , &pb . QueryRequest {
12 Query : " e i n query " ,
13 })
14 i f e r r != n i l {
15 log . F a t a l ( e r r )
16 }
17 fmt . P r i n t f ( " Antwort vom Typ %q : %dn" , r e s . Type , r e s .N)
18 }
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 20
Web-Services mit Go
Danke für die Aufmerksamkeit
Fragen, Kommentare?
https://golang.org — https://github.com/grpc/grpc-go
c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 21

Weitere ähnliche Inhalte

Andere mochten auch

Futuro, profetizados eventos
Futuro, profetizados eventosFuturo, profetizados eventos
Futuro, profetizados eventos
Jean-Jacques PUGIN
 
960 sketch
960 sketch960 sketch
960 sketch
phihiep308
 
PKI MADIUN (Siti Syariastri)
PKI MADIUN (Siti Syariastri)PKI MADIUN (Siti Syariastri)
PKI MADIUN (Siti Syariastri)
REXINCE
 
PKI MADIUN (Desi Rai S)
PKI MADIUN (Desi Rai S)PKI MADIUN (Desi Rai S)
PKI MADIUN (Desi Rai S)
REXINCE
 
UP2gether fiere HAGE Grup in Senegal
UP2gether fiere HAGE Grup in SenegalUP2gether fiere HAGE Grup in Senegal
UP2gether fiere HAGE Grup in Senegal
Barbara de Siena progetto UP2gether
 
Sejarah pki
Sejarah pkiSejarah pki
Sejarah pki
Nicho Denny
 
Jurnal percobaan v kelarutan sebagai fungsi suhu
Jurnal percobaan v kelarutan sebagai fungsi suhuJurnal percobaan v kelarutan sebagai fungsi suhu
Jurnal percobaan v kelarutan sebagai fungsi suhu
Dwi Karyani
 
PKI MADIUN (M. Hanif Hasanain)
PKI MADIUN (M. Hanif Hasanain)PKI MADIUN (M. Hanif Hasanain)
PKI MADIUN (M. Hanif Hasanain)
REXINCE
 
INTEGRASI TIMOR TIMUR
INTEGRASI TIMOR TIMURINTEGRASI TIMOR TIMUR
INTEGRASI TIMOR TIMUR
Dicko Agustian
 
02 23회 오픈업 발표자료 김광현 센터장(디캠프)
02 23회 오픈업 발표자료 김광현 센터장(디캠프) 02 23회 오픈업 발표자료 김광현 센터장(디캠프)
02 23회 오픈업 발표자료 김광현 센터장(디캠프)
VentureSquare
 
Renewable & Non-Renewable Energy Sources
Renewable & Non-Renewable Energy SourcesRenewable & Non-Renewable Energy Sources
Renewable & Non-Renewable Energy Sources
Rahul Jose
 
Presentation kimdas
Presentation kimdasPresentation kimdas
Presentation kimdas
ririnwidi98
 
Demartek Lenovo Storage S3200 i a mixed workload environment_2016-01
Demartek Lenovo Storage S3200  i a mixed workload environment_2016-01Demartek Lenovo Storage S3200  i a mixed workload environment_2016-01
Demartek Lenovo Storage S3200 i a mixed workload environment_2016-01
Lenovo Data Center
 

Andere mochten auch (13)

Futuro, profetizados eventos
Futuro, profetizados eventosFuturo, profetizados eventos
Futuro, profetizados eventos
 
960 sketch
960 sketch960 sketch
960 sketch
 
PKI MADIUN (Siti Syariastri)
PKI MADIUN (Siti Syariastri)PKI MADIUN (Siti Syariastri)
PKI MADIUN (Siti Syariastri)
 
PKI MADIUN (Desi Rai S)
PKI MADIUN (Desi Rai S)PKI MADIUN (Desi Rai S)
PKI MADIUN (Desi Rai S)
 
UP2gether fiere HAGE Grup in Senegal
UP2gether fiere HAGE Grup in SenegalUP2gether fiere HAGE Grup in Senegal
UP2gether fiere HAGE Grup in Senegal
 
Sejarah pki
Sejarah pkiSejarah pki
Sejarah pki
 
Jurnal percobaan v kelarutan sebagai fungsi suhu
Jurnal percobaan v kelarutan sebagai fungsi suhuJurnal percobaan v kelarutan sebagai fungsi suhu
Jurnal percobaan v kelarutan sebagai fungsi suhu
 
PKI MADIUN (M. Hanif Hasanain)
PKI MADIUN (M. Hanif Hasanain)PKI MADIUN (M. Hanif Hasanain)
PKI MADIUN (M. Hanif Hasanain)
 
INTEGRASI TIMOR TIMUR
INTEGRASI TIMOR TIMURINTEGRASI TIMOR TIMUR
INTEGRASI TIMOR TIMUR
 
02 23회 오픈업 발표자료 김광현 센터장(디캠프)
02 23회 오픈업 발표자료 김광현 센터장(디캠프) 02 23회 오픈업 발표자료 김광현 센터장(디캠프)
02 23회 오픈업 발표자료 김광현 센터장(디캠프)
 
Renewable & Non-Renewable Energy Sources
Renewable & Non-Renewable Energy SourcesRenewable & Non-Renewable Energy Sources
Renewable & Non-Renewable Energy Sources
 
Presentation kimdas
Presentation kimdasPresentation kimdas
Presentation kimdas
 
Demartek Lenovo Storage S3200 i a mixed workload environment_2016-01
Demartek Lenovo Storage S3200  i a mixed workload environment_2016-01Demartek Lenovo Storage S3200  i a mixed workload environment_2016-01
Demartek Lenovo Storage S3200 i a mixed workload environment_2016-01
 

Ähnlich wie Web-Services mit Go

JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
Jan Stamer
 
entwickler.de 05/2023: Go über den Wolken
entwickler.de 05/2023: Go über den Wolkenentwickler.de 05/2023: Go über den Wolken
entwickler.de 05/2023: Go über den Wolken
Jan Stamer
 
W-JAX 2023: Go über den Wolken
W-JAX 2023: Go über den WolkenW-JAX 2023: Go über den Wolken
W-JAX 2023: Go über den Wolken
Jan Stamer
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
Mayflower GmbH
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
Jens Siebert
 
JAX 2024: Go-über-den-Wolken und in der Cloud
JAX 2024: Go-über-den-Wolken und in der CloudJAX 2024: Go-über-den-Wolken und in der Cloud
JAX 2024: Go-über-den-Wolken und in der Cloud
Jan Stamer
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
Frank Müller
 
REST Problems
REST ProblemsREST Problems
REST Problems
predic8
 
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
Dr. Herwig Henseler
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere REST
Martin Abraham
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
A. LE
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservices
messeb
 
TypeScript
TypeScriptTypeScript
TypeScript
Jens Siebert
 
TypeScript
TypeScriptTypeScript
TypeScript
Jens Siebert
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
Torsten Fink
 
HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009
Felix Sasaki
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und Webservices
Jakob .
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
Torsten Kleiber
 

Ähnlich wie Web-Services mit Go (20)

JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
 
entwickler.de 05/2023: Go über den Wolken
entwickler.de 05/2023: Go über den Wolkenentwickler.de 05/2023: Go über den Wolken
entwickler.de 05/2023: Go über den Wolken
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
W-JAX 2023: Go über den Wolken
W-JAX 2023: Go über den WolkenW-JAX 2023: Go über den Wolken
W-JAX 2023: Go über den Wolken
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
JAX 2024: Go-über-den-Wolken und in der Cloud
JAX 2024: Go-über-den-Wolken und in der CloudJAX 2024: Go-über-den-Wolken und in der Cloud
JAX 2024: Go-über-den-Wolken und in der Cloud
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
REST Problems
REST ProblemsREST Problems
REST Problems
 
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere REST
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
 
Ruby on Rails SS09 04
Ruby on Rails SS09 04Ruby on Rails SS09 04
Ruby on Rails SS09 04
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservices
 
TypeScript
TypeScriptTypeScript
TypeScript
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und Webservices
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
 

Web-Services mit Go

  • 1. Web-Services mit Go Go-Features an Hand von Beispielen Sebastian ‘tokkee’ Harl <sh@tokkee.org>
  • 2. Überblick Was ist Go? Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. https://golang.org c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 2
  • 4. Web-Services Quelle: http://martinfowler.com/articles/microservices.html c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 4
  • 5. Web-Services • HTTP Frontend Viele parallele Client-Anfragen Eine oder mehrere Verbindungen zu Backends • Backend („Business Logic“) Viele parallele Anfragen vom Frontend Eine oder mehrere Datenbank-Verbindungen oder Interaktion mit anderen Backends • Datenbank ⇒ skalierbare Micro-Services / lose Kopplung Auch: Gleiche Prinzipien bei Integration mit anderen Lösungen c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 5
  • 6. Einschub: Go Standard Bibliothek https://golang.org/pkg/ • Crypto • Datenbanken • Go Parser • Netzwerk, HTTP, SMTP, etc. • Datenstrukturen Mehr? ⇒ https://godoc.org/ c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 6
  • 7. Ein Webserver 1 import ( . . . ) 2 3 func main () { 4 http . HandleFunc ( "/ h a l l o " , s a g e H a l l o ) 5 log . F a t a l ( http . ListenAndServe ( " :9999 " , n i l )) 6 } 7 8 func s a g e H a l l o (w http . ResponseWriter , r ∗ http . Request ) { 9 fmt . F p r i n t f (w, " Hallo %s " , r . RemoteAddr ) 10 } • https://golang.org/pkg/log/ • https://golang.org/pkg/net/http/ c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 7
  • 8. Ein Webserver – Templates 1 var tmpl = template . Must ( 2 template . New( " r e s u l t s " ) . Parse ( ‘ 3 <html><head> 4 <t i t l e >{{. T i t l e }}</ t i t l e > 5 </head> 6 7 <body> 8 <h1>Hallo {{.Name}}</h1> 9 </body></html> 10 ‘ )) • https://golang.org/pkg/html/template/ c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 8
  • 9. Ein Webserver – Templates (2) 1 func s a g e H a l l o ( . . . ) { 2 d := s t r u c t { 3 T i t l e , Name s t r i n g 4 }{ " Hallo Welt " , r . RemoteAddr} 5 6 var buf bytes . B u f f e r 7 i f e r r := tmpl . Execute(&buf , d ) ; e r r != n i l { 8 http . E r r o r (w, e r r . E r r o r ( ) , http . S t a t u s I n t e r n a l S e r v e r E r r o r ) 9 return 10 } 11 i o . Copy (w, &buf ) 12 } • https://golang.org/pkg/bytes/ • https://golang.org/pkg/io/ c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 9
  • 10. Einschub: io.Writer • Warum funktioniert fmt.Printf, tmpl.Execute, http.Error, io.Copy eigentlich mit dem http.ResponseWriter und bytes.Buffer? 1 package i o 2 type Writer i n t e r f a c e { 3 Write ( p [ ] byte ) ( n int , e r r e r r o r ) 4 } ⇒ Sehr einfaches Interface ⇒ http.ResponseWriter und bytes.Buffer implementieren es Viele andere Beispiele ... c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 10
  • 11. Viele Backend-Abfragen 1 func Query (∗ Request ) (∗ Response , e r r o r ) { . . . } 2 3 func an frage (w http . ResponseWriter , r ∗ http . Request ) { 4 r e q u e s t s := [ ] ∗ Request { . . . } 5 6 r e s p o n s e s := make ( [ ] ∗ Reponse , len ( r e q u e s t s )) 7 errCh := make( chan e r r o r , len ( r e q u e s t s )) 8 9 f o r i , req := range r e q u e s t s { 10 go func ( req ∗ Request ) { 11 var e r r e r r o r 12 r e s p o n s e s [ i ] , e r r = Query ( req ) 13 errCh <− e r r 14 }( req ) 15 } 16 17 // . . . c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 11
  • 12. Viele Backend-Abfragen (2) 1 . . . 2 timeout := time . A f t e r (50∗ time . M i l l i s e c o n d ) 3 4 f o r range r e q u e s t s { 5 s e l e c t { 6 case e r r := <−errCh : 7 i f e r r != n i l { 8 http . E r r o r (w, e r r . E r r o r ( ) , http . StatusBadRequest ) 9 return 10 } 11 case <−timeout : 12 http . E r r o r (w, " timeout " , http . StatusRequestTimeout ) 13 return 14 } 15 } 16 // A l l e E r g e b n i s s e v e r f ü gbar . • Siehe auch https://golang.org/pkg/sync/#WaitGroup c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 12
  • 13. Spezielle Fehlerbehandlung 1 go func ( req ∗ Request ) { 2 var e r r e r r o r 3 defer func () { 4 i f e := recover ( ) ; e != n i l { 5 e r r = fmt . E r r o r f ( " e r r o r w h i l e querying backend : %v " , e ) 6 } 7 errCh <− e r r 8 }() 9 10 r e s p o n s e s [ i ] , e r r = Query ( req ) 11 }( req ) c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 13
  • 14. Backends – gRPC Beispiel: Backend Kommunikation / API A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. https://grpc.io c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 14
  • 15. gRPC Überblick https://github.com/google/protobuf • gRPC basiert auf Protocol Buffers • Unterstützung diverser Sprachen C++, Java, Go, Python, . . . c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 15
  • 16. gRPC Beispiel 1 syntax " proto3 " ; 2 3 package mein_service ; 4 5 s e r v i c e Backend { 6 rpc Query ( QueryRequest ) return ( QueryResponse ) ; 7 8 // . . . 9 } 10 11 message QueryRequest { 12 s t r i n g query = 1; 13 } 14 15 message QueryResponse { 16 s t r i n g type = 1; 17 int64 n = 2; 18 } c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 16
  • 17. gRPC mit Go • Die „protobuf“ Datei muss mittels des Protobuf Compilers und einer gRPC Compiler-Erweiterung übersetzt werden • Der Compiler erzeugt Go Code, welcher Interfaces und generischen Code erzeugt • Das Interface entspricht im Wesentlichen der service Definition • Das Interface muss für den Server implementiert werden • Generischer Client-Code sollte ausreichen → API Entwurf! https://github.com/grpc/grpc-go https://golang.org/x/net/context c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 17
  • 18. gRPC mit Go: Server 1 import pb " tokkee . net / mein_service / s e r v i c e _ p r o t o " 2 3 type s e r v e r s t r u c t {} 4 5 func (∗ s e r v e r ) Query ( ctx context . Context , 6 i n ∗pb . QueryRequest ) (∗ pb . QueryResponse , e r r o r ) { 7 8 n , e r r := runQuery ( i n . Query ) 9 i f e r r != n i l { 10 return n i l , e r r 11 } 12 return &pb . QueryResponse { 13 Type : " irgendwas " , 14 N: n , 15 } , n i l 16 } c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 18
  • 19. gRPC mit Go: Server (2) 1 func main () { 2 l , e r r := net . L i s t e n ( " tcp " , port ) 3 i f e r r != n i l { 4 log . F a t a l ( e r r ) 5 } 6 7 s := grpc . NewServer () 8 pb . RegisterBackendServer ( s , &s e r v e r {}) 9 s . Serve ( l ) 10 } c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 19
  • 20. gRPC mit Go: Client 1 func main () { 2 ctx := context . Background () 3 4 conn , e r r := grpc . D i a l ( " l o c a l h o s t :50051 " , grpc . WithInsecure ( ) ) 5 i f e r r != n i l { 6 log . F a t a l ( e r r ) 7 } 8 defer conn . Close () 9 c := pb . NewBackendClient ( conn ) 10 11 res , e r r := c . Query ( ctx , &pb . QueryRequest { 12 Query : " e i n query " , 13 }) 14 i f e r r != n i l { 15 log . F a t a l ( e r r ) 16 } 17 fmt . P r i n t f ( " Antwort vom Typ %q : %dn" , r e s . Type , r e s .N) 18 } c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 20
  • 21. Web-Services mit Go Danke für die Aufmerksamkeit Fragen, Kommentare? https://golang.org — https://github.com/grpc/grpc-go c 2015-2016 Sebastian ‘tokkee’ Harl Web-Services mit Go – Folie 21