import golang; struct Microservice Giulio De Donato - Giorgio Cefaro rate our talk! https://joind.in/14104
Giorgio Cefaro Freelance Software Engineer @giorrrgio
Giulio De Donato CTO @ chupamobile @liuggio
Once upon a time ... Monolith
BIG complex problem vs lots of small simple problems
MICROSERVICES: While there is no precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data. -- martin fowler
How small is “micro”?
php ruby nodejs golang scala golang
GOLANG Why we chose it
GOLANG
Go programs are statically compiled Go compiler target multiple platforms and architectures Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Plan 9, and Microsoft Windows OS and i386, amd64, ARM and IBM POWER architectures are currently supported GOLANG - PLATFORMS AND ARCHITECTURES
NO EXTERNAL LIBRARIES NO VIRTUAL MACHINES JUST A STATIC EXECUTABLE NO JIT-COMPILING
Concurrency is easy to implement through GOROUTINES , each goroutine having a SMALL FOOTPRINT of memory and being MULTIPLEXED through OS threads to avoid that blocking routines can block other running goroutines GOLANG - CONCURRENCY
Go supports modern web technologies through a set of bundled packages, ready to import. archive, bufio, builtin, bytes, compress, container, crypto, database, debug, encoding, errors, expvar, flag, fmt, go, hash, html, image, index, io, log, math, mime, net, os, path, reflect, regexp, runtime, sort, strconv, strings, suffixarray, sync, syscall, testing, text, time, unicode, unsafe GOLANG - PACKAGES
// hello_codemotion.go package main import "fmt" func main() { // Create a channel to synchronize goroutines done := make(chan bool) // Execute println in goroutine go func() { fmt.Println("Hello Codemotion") // Tell the main function everything is done. // This channel is visible inside this goroutine because // it is executed in the same address space. done <- true }() fmt.Println("Bye Codemotion") <-done // Wait for the goroutine to finish. what if we // remove it? }
$ go build hello_codemotion.go $ ./hello_codemotion Bye Codemotion Hello Codemotion Even if we run the goroutine that will print the “Hello” as first, its output will be echoed once it is synchronized with main (the “<- done” final line)
Network I/O is supported through the net package, which comes with TCP/IP, UDP, DNS, and Unix domain socket components. Low level support is provided, but you will probably only need Dial, Accept and Listen GOLANG - COMMUNICATION
The net/http package provides http client and server implementations. Building a web server is quite easy! GOLANG - COMMUNICATION
package main import "net/http" import "log" import "fmt" func main() { http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, Codemotion!") }) log.Fatal(http.ListenAndServe(":8080", nil)) }
The encoding package provides interfaces shared by other packages that convert data to and from byte-level and textual representations: encoding/json encoding/xml encoding/gob GOLANG - COMMUNICATION
type Message struct { Name string Body string Time int64 } m := Message{"Codemotion", "Hello", 1294706395881547000} b, err := json.Marshal(m) // b will be // {"Name":"Alice","Body":"Hello","Time":1294706395881547000} encoding/json package provides structures to read and write JSON data
type Foo struct { A, B int64 } func main() { conn, err := net.Dial("tcp", "localhost:8080") if err != nil { log.Fatal("Connection error", err) } encoder := gob.NewEncoder(conn) foo := &Foo{1, 2} encoder.Encode(foo) conn.Close() } encoding/gob package provides native golang RPC with binary transmission of structures
INTERFACE ALL THE THINGS
explicit is always better than implicit
Expose behaviour
Interface all the things
cat access.log | grep “porn” | wc -l
HTTP WINS
WEB FRAMEWORKS HTTP FRAMEWORKS
GOLANG HTTP INTERFACE type Handler interface { ServeHTTP(ResponseWriter, *Request) }
type Handler interface { ServeHTTP(http.ResponseWriter,*http.Request) } // handlerFunc func(http.ResponseWriter,*http.Request) handler := http.HandlerFunc(handlerFunc) handler.ServeHTTP(w, r) Interface func trick
Unit test on handlers
Huge handler
Compositions
Higher-order function
EXECUTE handlerFunc
//0 START //1 START //2 START Controller //2 END //1 END //0 END middleware
● logger request logger with custom format support ● csrf Cross-site request forgery protection ● compress Gzip compression middleware ● basicAuth basic http authentication ● bodyParser extensible request body parser ● json application/json parser ● urlencoded application/x-www-form-urlencoded parser ● multipart multipart/form-data parser ● timeout request timeouts ● cookieParser cookie parser ● session session management support with bundled MemoryStore ● cookieSession cookie-based session support ● methodOverride faux HTTP method support ● responseTime calculates response-time and exposes via X-Response-Time ● staticCache memory cache layer for the static() middleware ● static streaming static file server supporting Range and more ● directory directory listing middleware ● vhost virtual host sub-domain mapping middleware ● favicon efficient favicon server (with default icon) ● limit limit the bytesize of request bodies ● query automatic querystring parser, populating req.query ● errorHandler flexible error handler ● …. many more middleware
middleware
HTTP2 The future is already arrived — it's just not very evenly distributed -- william gibson
Microservices need AUTOMATION
AUTOMATION Build, Deploy, Scale
ARCHITECTURE - DOCKER
ARCHITECTURE - DOCKER Docker is an open-source project that automates the deployment of applications inside software containers. http://en.wikipedia.org/wiki/Docker_(software)
ARCHITECTURE - DOCKER Docker allows independent "containers" to run within a single Linux instance, avoiding the overhead of starting virtual machines. http://en.wikipedia.org/wiki/Docker_(software)
# Dockerfile # golang image where workspace (GOPATH) configured at /go. FROM golang:1.4-onbuild EXPOSE 3000 A container can be configured through a Dockerfile In this basic configuration, we specify that our image is derived FROM the golang image, available through the Docker Hub, and that our container will EXPOSE port 3000 https://docs.docker.com/reference/builder/
$ sudo docker build -t codemotion_container . The golang image is a great solution for go microservices, it is configured to take care of compiling our program and copy it inside the container, ready to go with a single command. Cross compiling is supported too! https://registry.hub.docker.com/_/golang/
Microservices need AUTOMATION
Microservices need ORCHESTRATION
ARCHITECTURE - DOCKER ORCHESTRATION TOOLS http://blog.docker.com/2015/02/orchestrating-docker-with-machine-swarm-and-compose/ ◇ Provision Docker on any infrastructure, from laptop to public cloud instance ◇ Compose an app using both proprietary containers and Docker Hub Official Repos ◇ Manage all containers of an app as a single group ◇ Cluster an application’s containers to optimize resources and provide high-availability
ARCHITECTURE - DOCKER MACHINE http://blog.docker.com/2015/02/announcing-docker-machine-beta/ ◇ Provision Docker Engines across various providers both local and remote, secured with TLS, or not. ◇ Lightweight management of machines: Starting, stopping, removing, etc. ◇ Run remote commands or log in to machines via SSH ◇ Upgrade the Docker Engine when a new version is released
$ docker-machine create -d virtualbox dev [info] Downloading boot2docker... [info] Creating SSH key... [info] Creating VirtualBox VM… [...] $ docker run busybox echo hello world hello world With Machine docker hosts can be spawned and controlled on different computers and virtual machines from you local docker client. Different clouds too! Machine supports Amazon EC2, Microsoft Azure, Microsoft Hyper-V DigitalOcean, Google Compute Engine, OpenStack, Rackspace, SoftLayer, VirtualBox, VMware Fusion, VMware vCloud Air, VMware vSphere and counting!
ARCHITECTURE - DOCKER SWARM http://blog.docker.com/2015/02/scaling-docker-with-swarm/ ◇ Native clustering for Docker ◇ Swarm is a standard Docker image ◇ Run one command to create a cluster. ◇ Run another command to start Swarm. ◇ On each host where the Docker Engine is running, run a command to join said cluster.
$ docker run swarm create 5d9bc2f39ccc00500b36f23d90994f5f # <- cluster_id # swarm master $ docker-machine create -d virtualbox --swarm --swarm-master -- swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my- swarm # swarm nodes $ docker-machine create -d virtualbox --swarm --swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my-swarm-node1 $ docker-machine create -d virtualbox --swarm --swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my-swarm-node3
$ docker run -d --name redis_1 -e ‘affinity:container!=redis_*’ redis $ docker run -d --name redis_2 -e ‘affinity:container!=redis_*’ redis Run two redis servers, but don’t run both on the same machine: Add a constraint on the type of storage, we want a machine that has SSD storage: $ docker run -d -e constraint:storage==ssd mysql
ARCHITECTURE - DOCKER COMPOSE https://blog.docker.com/2015/02/announcing-docker-compose/ ◇ Define your application’s components in a single file ◇ Start, stop, and rebuild services ◇ View the status of running services ◇ Stream the log output of running services ◇ Run a one-off command on a service
# docker-compose.yml cart: build: ./cart links: - redis ports: - "5000:5000" shipment: build: ./shipment links: - mongo ports: - "5000:5000" redis: image: redis mongo: image: mongodb
Microservices need MONITORING
MONITORING - SOUNDCLOUD’S PROMETHEUS http://5pi.de/2015/01/26/monitor-docker-containers-with-prometheus/ ◇ Recently open-sourced by SoundCloud ◇ Written in GO with native client for in- application monitoring ◇ Easy docker container monitoring ◇ Highly dimensional data model ◇ Flexible query language ◇ Powerful metrics types ◇ Alerting on any expression ◇ No fracking dependencies
$ docker run -p 9090:9090 prom/prometheus
CREDITS http://en.wikipedia.org/wiki/List_of_largest_monoliths_in_the_world https://www.flickr.com/photos/robwatling/3411172879 https://www.flickr.com/photos/dsevilla/139656712 FLOWER https://www.flickr.com/photos/nickpiggott/5212359135 BRICKS https://vimeo.com/105751281 PCFMA http://www.youtube.com/watch?v=QY8mL6WARIE HTTP interface is a lie http://martinfowler.com/articles/consumerDrivenContracts.html http://www.infoq.com/news/2014/07/building-deploying-microservices https://talks.golang.org/2014/readability.slide#27 http://www.morewords.com/contains/go/ http://martinfowler.com/articles/microservices.html (come non citarlo :)) https://blog.golang.org/docker (figata che docker ha il suo env golang) https://speakerdeck.com/stilkov/microservices-talk-berlin http://www.infoq.com/articles/microservices-practical-tips http://nginx.com/blog/microservices-at-netflix-architectural-best-practices/ http://www.reddit. com/r/golang/comments/252wjh/are_you_using_golang_for_webapi_development_what/ https://justinas.org/embrace-gos-http-tools/ https://news.ycombinator.com/item?id=6869710 https://crate.io/blog/deploying-crate-with-docker-machine-swarm/ THERE’S NO GOOD TALK WITH NO REFERENCES
JOIN GOLANGIT! http://goo.gl/9am5vO
https://joind.in/14104 Questions? Answers?

Import golang; struct microservice - Codemotion Rome 2015

  • 1.
    import golang; struct Microservice GiulioDe Donato - Giorgio Cefaro rate our talk! https://joind.in/14104
  • 2.
  • 4.
    Giulio De Donato CTO@ chupamobile @liuggio
  • 5.
    Once upon atime ... Monolith
  • 6.
    BIG complex problem vs lotsof small simple problems
  • 7.
    MICROSERVICES: While there isno precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data. -- martin fowler
  • 8.
    How small is“micro”?
  • 10.
  • 11.
  • 12.
  • 13.
    Go programs arestatically compiled Go compiler target multiple platforms and architectures Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Plan 9, and Microsoft Windows OS and i386, amd64, ARM and IBM POWER architectures are currently supported GOLANG - PLATFORMS AND ARCHITECTURES
  • 14.
    NO EXTERNAL LIBRARIES NOVIRTUAL MACHINES JUST A STATIC EXECUTABLE NO JIT-COMPILING
  • 15.
    Concurrency is easyto implement through GOROUTINES , each goroutine having a SMALL FOOTPRINT of memory and being MULTIPLEXED through OS threads to avoid that blocking routines can block other running goroutines GOLANG - CONCURRENCY
  • 16.
    Go supports modernweb technologies through a set of bundled packages, ready to import. archive, bufio, builtin, bytes, compress, container, crypto, database, debug, encoding, errors, expvar, flag, fmt, go, hash, html, image, index, io, log, math, mime, net, os, path, reflect, regexp, runtime, sort, strconv, strings, suffixarray, sync, syscall, testing, text, time, unicode, unsafe GOLANG - PACKAGES
  • 17.
    // hello_codemotion.go package main import"fmt" func main() { // Create a channel to synchronize goroutines done := make(chan bool) // Execute println in goroutine go func() { fmt.Println("Hello Codemotion") // Tell the main function everything is done. // This channel is visible inside this goroutine because // it is executed in the same address space. done <- true }() fmt.Println("Bye Codemotion") <-done // Wait for the goroutine to finish. what if we // remove it? }
  • 18.
    $ go buildhello_codemotion.go $ ./hello_codemotion Bye Codemotion Hello Codemotion Even if we run the goroutine that will print the “Hello” as first, its output will be echoed once it is synchronized with main (the “<- done” final line)
  • 19.
    Network I/O issupported through the net package, which comes with TCP/IP, UDP, DNS, and Unix domain socket components. Low level support is provided, but you will probably only need Dial, Accept and Listen GOLANG - COMMUNICATION
  • 20.
    The net/http packageprovides http client and server implementations. Building a web server is quite easy! GOLANG - COMMUNICATION
  • 21.
    package main import "net/http" import"log" import "fmt" func main() { http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, Codemotion!") }) log.Fatal(http.ListenAndServe(":8080", nil)) }
  • 22.
    The encoding packageprovides interfaces shared by other packages that convert data to and from byte-level and textual representations: encoding/json encoding/xml encoding/gob GOLANG - COMMUNICATION
  • 23.
    type Message struct{ Name string Body string Time int64 } m := Message{"Codemotion", "Hello", 1294706395881547000} b, err := json.Marshal(m) // b will be // {"Name":"Alice","Body":"Hello","Time":1294706395881547000} encoding/json package provides structures to read and write JSON data
  • 24.
    type Foo struct{ A, B int64 } func main() { conn, err := net.Dial("tcp", "localhost:8080") if err != nil { log.Fatal("Connection error", err) } encoder := gob.NewEncoder(conn) foo := &Foo{1, 2} encoder.Encode(foo) conn.Close() } encoding/gob package provides native golang RPC with binary transmission of structures
  • 25.
  • 26.
    explicit is alwaysbetter than implicit
  • 27.
  • 28.
  • 29.
    cat access.log |grep “porn” | wc -l
  • 31.
  • 32.
  • 34.
    GOLANG HTTP INTERFACE type Handlerinterface { ServeHTTP(ResponseWriter, *Request) }
  • 35.
    type Handler interface{ ServeHTTP(http.ResponseWriter,*http.Request) } // handlerFunc func(http.ResponseWriter,*http.Request) handler := http.HandlerFunc(handlerFunc) handler.ServeHTTP(w, r) Interface func trick
  • 36.
    Unit test onhandlers
  • 37.
  • 38.
  • 39.
  • 40.
  • 42.
    //0 START //1 START //2START Controller //2 END //1 END //0 END middleware
  • 43.
    ● logger requestlogger with custom format support ● csrf Cross-site request forgery protection ● compress Gzip compression middleware ● basicAuth basic http authentication ● bodyParser extensible request body parser ● json application/json parser ● urlencoded application/x-www-form-urlencoded parser ● multipart multipart/form-data parser ● timeout request timeouts ● cookieParser cookie parser ● session session management support with bundled MemoryStore ● cookieSession cookie-based session support ● methodOverride faux HTTP method support ● responseTime calculates response-time and exposes via X-Response-Time ● staticCache memory cache layer for the static() middleware ● static streaming static file server supporting Range and more ● directory directory listing middleware ● vhost virtual host sub-domain mapping middleware ● favicon efficient favicon server (with default icon) ● limit limit the bytesize of request bodies ● query automatic querystring parser, populating req.query ● errorHandler flexible error handler ● …. many more middleware
  • 44.
  • 45.
    HTTP2 The future isalready arrived — it's just not very evenly distributed -- william gibson
  • 46.
  • 47.
  • 48.
  • 49.
    ARCHITECTURE - DOCKER Dockeris an open-source project that automates the deployment of applications inside software containers. http://en.wikipedia.org/wiki/Docker_(software)
  • 50.
    ARCHITECTURE - DOCKER Dockerallows independent "containers" to run within a single Linux instance, avoiding the overhead of starting virtual machines. http://en.wikipedia.org/wiki/Docker_(software)
  • 51.
    # Dockerfile # golangimage where workspace (GOPATH) configured at /go. FROM golang:1.4-onbuild EXPOSE 3000 A container can be configured through a Dockerfile In this basic configuration, we specify that our image is derived FROM the golang image, available through the Docker Hub, and that our container will EXPOSE port 3000 https://docs.docker.com/reference/builder/
  • 52.
    $ sudo dockerbuild -t codemotion_container . The golang image is a great solution for go microservices, it is configured to take care of compiling our program and copy it inside the container, ready to go with a single command. Cross compiling is supported too! https://registry.hub.docker.com/_/golang/
  • 54.
  • 55.
  • 56.
    ARCHITECTURE - DOCKERORCHESTRATION TOOLS http://blog.docker.com/2015/02/orchestrating-docker-with-machine-swarm-and-compose/ ◇ Provision Docker on any infrastructure, from laptop to public cloud instance ◇ Compose an app using both proprietary containers and Docker Hub Official Repos ◇ Manage all containers of an app as a single group ◇ Cluster an application’s containers to optimize resources and provide high-availability
  • 57.
    ARCHITECTURE - DOCKERMACHINE http://blog.docker.com/2015/02/announcing-docker-machine-beta/ ◇ Provision Docker Engines across various providers both local and remote, secured with TLS, or not. ◇ Lightweight management of machines: Starting, stopping, removing, etc. ◇ Run remote commands or log in to machines via SSH ◇ Upgrade the Docker Engine when a new version is released
  • 58.
    $ docker-machine create-d virtualbox dev [info] Downloading boot2docker... [info] Creating SSH key... [info] Creating VirtualBox VM… [...] $ docker run busybox echo hello world hello world With Machine docker hosts can be spawned and controlled on different computers and virtual machines from you local docker client. Different clouds too! Machine supports Amazon EC2, Microsoft Azure, Microsoft Hyper-V DigitalOcean, Google Compute Engine, OpenStack, Rackspace, SoftLayer, VirtualBox, VMware Fusion, VMware vCloud Air, VMware vSphere and counting!
  • 59.
    ARCHITECTURE - DOCKERSWARM http://blog.docker.com/2015/02/scaling-docker-with-swarm/ ◇ Native clustering for Docker ◇ Swarm is a standard Docker image ◇ Run one command to create a cluster. ◇ Run another command to start Swarm. ◇ On each host where the Docker Engine is running, run a command to join said cluster.
  • 60.
    $ docker runswarm create 5d9bc2f39ccc00500b36f23d90994f5f # <- cluster_id # swarm master $ docker-machine create -d virtualbox --swarm --swarm-master -- swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my- swarm # swarm nodes $ docker-machine create -d virtualbox --swarm --swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my-swarm-node1 $ docker-machine create -d virtualbox --swarm --swarm-discovery token://5d9bc2f39ccc00500b36f23d90994f5f my-swarm-node3
  • 61.
    $ docker run-d --name redis_1 -e ‘affinity:container!=redis_*’ redis $ docker run -d --name redis_2 -e ‘affinity:container!=redis_*’ redis Run two redis servers, but don’t run both on the same machine: Add a constraint on the type of storage, we want a machine that has SSD storage: $ docker run -d -e constraint:storage==ssd mysql
  • 62.
    ARCHITECTURE - DOCKERCOMPOSE https://blog.docker.com/2015/02/announcing-docker-compose/ ◇ Define your application’s components in a single file ◇ Start, stop, and rebuild services ◇ View the status of running services ◇ Stream the log output of running services ◇ Run a one-off command on a service
  • 63.
    # docker-compose.yml cart: build: ./cart links: -redis ports: - "5000:5000" shipment: build: ./shipment links: - mongo ports: - "5000:5000" redis: image: redis mongo: image: mongodb
  • 64.
  • 66.
    MONITORING - SOUNDCLOUD’SPROMETHEUS http://5pi.de/2015/01/26/monitor-docker-containers-with-prometheus/ ◇ Recently open-sourced by SoundCloud ◇ Written in GO with native client for in- application monitoring ◇ Easy docker container monitoring ◇ Highly dimensional data model ◇ Flexible query language ◇ Powerful metrics types ◇ Alerting on any expression ◇ No fracking dependencies
  • 67.
    $ docker run-p 9090:9090 prom/prometheus
  • 68.
    CREDITS http://en.wikipedia.org/wiki/List_of_largest_monoliths_in_the_world https://www.flickr.com/photos/robwatling/3411172879 https://www.flickr.com/photos/dsevilla/139656712 FLOWER https://www.flickr.com/photos/nickpiggott/5212359135 BRICKS https://vimeo.com/105751281PCFMA http://www.youtube.com/watch?v=QY8mL6WARIE HTTP interface is a lie http://martinfowler.com/articles/consumerDrivenContracts.html http://www.infoq.com/news/2014/07/building-deploying-microservices https://talks.golang.org/2014/readability.slide#27 http://www.morewords.com/contains/go/ http://martinfowler.com/articles/microservices.html (come non citarlo :)) https://blog.golang.org/docker (figata che docker ha il suo env golang) https://speakerdeck.com/stilkov/microservices-talk-berlin http://www.infoq.com/articles/microservices-practical-tips http://nginx.com/blog/microservices-at-netflix-architectural-best-practices/ http://www.reddit. com/r/golang/comments/252wjh/are_you_using_golang_for_webapi_development_what/ https://justinas.org/embrace-gos-http-tools/ https://news.ycombinator.com/item?id=6869710 https://crate.io/blog/deploying-crate-with-docker-machine-swarm/ THERE’S NO GOOD TALK WITH NO REFERENCES
  • 69.
  • 70.