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

PDF
Programmieren mit Go
PDF
Schneller Einstieg in OpenCL mit C++ Bindings
ODP
Einführung Mercurial
PDF
Docker Entwicklungsumgebung für TYPO3 mit xdebug
PDF
IT-Tage 2021: Java to Go - Google Go für Java-Entwickler
PDF
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
PDF
Skalierbare Anwendungen mit Google Go
Programmieren mit Go
Schneller Einstieg in OpenCL mit C++ Bindings
Einführung Mercurial
Docker Entwicklungsumgebung für TYPO3 mit xdebug
IT-Tage 2021: Java to Go - Google Go für Java-Entwickler
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
Skalierbare Anwendungen mit Google Go

Andere mochten auch (13)

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

Ähnlich wie Web-Services mit Go (6)

PDF
DevOpsCon - Verteilte Entwicklung in Go
PDF
entwickler.de 05/2023: Go über den Wolken
PDF
JAX 2024: Go-über-den-Wolken und in der Cloud
PPTX
Backend-Services mit Rust
PDF
Ein Gopher im Netz
PDF
Go - Googles Sprache für skalierbare Systeme
DevOpsCon - Verteilte Entwicklung in Go
entwickler.de 05/2023: Go über den Wolken
JAX 2024: Go-über-den-Wolken und in der Cloud
Backend-Services mit Rust
Ein Gopher im Netz
Go - Googles Sprache für skalierbare Systeme
Anzeige

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
  • 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