QCONSP 2016 GO EM PRODUÇÃO PARA APIS E MICROSERVICES APRESENTAÇÃO VINICIUS FEITOSA PACHECO ▸ Analista na globo.com ▸ Instrutor na Caelum ▸ Teólogo de formação ▸ github.com/viniciusfeitosa ▸ @ViniciusPach ▸ viniciusfeitosa.com.br QUER TRABALHAR CONOSCO? HTTPS://TALENTOS.GLOBO.COM MÉTRICAS GLOBO.COM O DESAFIO ▸ Mais de 50 milhões de acesso diários ▸ Votações com mais de 4k/req por segundo ▸ Aplicações que podem gerar 300k/req por segundo ▸ Inclinação para BigData ▸ Captura de informação mais fácil do usuário logado ONDE EU ME ENCAIXO NESSES NÚMEROS? GloboID MINHA ÁREA O GLOBOID ▸ Captação e gerenciamento de todos os usuários da globo.com ▸ Autenticação e autorização de cada usuário ▸ Fornece informações de usuários para cada time da globo.com ▸ Atende a outras empresas do grupo globo ECOSSISTEMA DE CADASTRO DO GLOBOID. Composição de softwares ECOSSISTEMA API DE CADASTRO FRONT-END (SCALA, PLAY, ANGULAR) MONOLÍTICO CORE (JAVA) MONOLÍTICO API (JAVA, SPRING) BANCO DE DADOS (ORACLE) MONOLITOS O que são? COMO VOCÊ ACHA QUE É MONOLITO COMO ELES REALMENTE SÃO (NA MAIORIA DAS VEZES) MONOLITO ECOSSISTEMA API DE CADASTRO STATUS ▸ Cadastra 200 usuários por segundo ▸ 2 grandes sistemas monolíticos ▸ Bibliotecas antigas e difíceis de atualizar ▸ Alto risco no deploy ▸ Merges numerosos e perigosos VAMOS MUDAR PARA UMA NOVA ARQUITETURA. Microservices O QUE É MICRO SERVIÇO MICRO SERVIÇO NÃO ESTÁ LIGADO AO TAMANHO DA APLICAÇÃO, MAS AO TAMANHO DO NEGÓCIO. Mario Fusco COMO DEVERIAM SER MICROSERVICES PROVA DE CONCEITO KRATOS X GOLUN SIMPLICIDADE É ALGO MUITO IMPORTANTE HEY HO LET’S GO NO QUE O GO NOS ATENDE MELHOR ▸ Simplicidade de código ▸ Biblioteca nativa completa ▸ Linguagem mais próximo da máquina (Compilada) ▸ Linguagem de alta performance ▸ Simplicidade para programação concorrente ▸ Muitas libs e ferramentas disponíveis ▸ Ótima documentação SIMPLICIDADE UNDERTOW public class HelloWorldServer { public static void main(final String[] args) { Undertow server = Undertow.builder() .addHttpListener(8080, "localhost") .setHandler(new HttpHandler() { @Override public void handleRequest(final HttpServerExchange exchange) throws Exception { exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); exchange.getResponseSender().send("Hello World"); } }).build(); server.start(); } } SIMPLICIDADE GO package main import ( func TestHandler(t *testing.T) { req, err := http.NewRequest("GET", "/", nil) if err != nil { log.Fatal(err) } w := httptest.NewRecorder() "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { handler(w, req) if w.Code != http.StatusOK { fmt.Fprint(w, “Hello, World") t.Error("Erro ao retornar o code") } } func main() { if w.Body.String() != "Hello, World\n" { t.Error("Erro ao retornar o body") } http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } } PROGRAMAÇÃO CONCORRENTE GO func main() { func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { jobs := make(chan int, 100) fmt.Println("worker", id, "processing job", j) results := make(chan int, 100) time.Sleep(time.Second) for w := 1; w <= 3; w++ { results <- j * 2 go worker(w, jobs, results) } } for j := 1; j <= 9; j++ { jobs <- j } close(jobs) for a := 1; a <= 9; a++ { <-results } } } worker 3 processing job 1 worker 1 processing job 2 worker 2 processing job 3 worker 3 processing job 4 worker 2 processing job 5 worker 1 processing job 6 worker 3 processing job 8 worker 1 processing job 7 worker 2 processing job 9 fonte: https://gobyexample.com/worker-pools GLIVE. PATTERN MICROSERVICE GET POST UPDATE DELETE QUEUE CACHE GOROUTINES DATABASE OUTROS MICROSERVICES ECOSSISTEMA GO O QUE ESTAMOS USANDO ▸ Muxer Pat - https://github.com/bmizerany/pat ▸ Redigo - https://github.com/garyburd/redigo ▸ mgo - https://labix.org/mgo ▸ ampq - https://github.com/streadway/amqp ▸ godep - https://github.com/tools/godep ▸ Testify - https://github.com/stretchr/testify ▸ govalidator - https://github.com/asaskevich/govalidator ▸ gotains - https://github.com/viniciusfeitosa/gotains GLIVE STATUS ▸ Cadastra 19k usuários por segundo ▸ Pool de microservices ▸ Muita biblioteca nativa do Go e libs fáceis de mudar ▸ Deploy fácil e com cache para tempo de intermitência ▸ Merges distribuídos e mais simples E O LEGADO? ECOSSISTEMA GLIVE E O LEGADO FRONT-END (SCALA, PLAY, ANGULAR) MONOLÍTICO CORE (JAVA) MONOLÍTICO API (JAVA, SPRING) GLIVE CONSUMER E SYNC BANCO DE DADOS (ORACLE) NÃO É MENTIRA. 1º DE ABRIL WORKSHOP DE MICROSERVICES EM GO NA QCONSP 2016 DÚVIDAS.