qconsp 2016 go em produÇÃo para apis e … · fornece informações de usuários para cada time...
TRANSCRIPT
APRESENTAÇÃO
VINICIUS FEITOSA PACHECO
▸ Analista na globo.com
▸ Instrutor na Caelum
▸ Teólogo de formação
▸ github.com/viniciusfeitosa
▸ @ViniciusPach
▸ viniciusfeitosa.com.br
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
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 API DE CADASTRO
MONOLÍTICO API (JAVA, SPRING)
MONOLÍTICO CORE (JAVA)
BANCO DE DADOS (ORACLE)
FRONT-END (SCALA, PLAY, ANGULAR)
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
MICRO SERVIÇO NÃO ESTÁ LIGADO AO TAMANHO DA APLICAÇÃO, MAS AO TAMANHO DO NEGÓCIO.
Mario Fusco
O QUE É MICRO SERVIÇO
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
UNDERTOWpublic 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
GOpackage main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “Hello, World")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
func TestHandler(t *testing.T) { req, err := http.NewRequest("GET", "/", nil) if err != nil { log.Fatal(err) } w := httptest.NewRecorder()
handler(w, req) if w.Code != http.StatusOK { t.Error("Erro ao retornar o code") }
if w.Body.String() != "Hello, World\n" { t.Error("Erro ao retornar o body") } }
PROGRAMAÇÃO CONCORRENTE
GOfunc main() { jobs := make(chan int, 100) results := make(chan int, 100)
for w := 1; w <= 3; w++ { go worker(w, jobs, results) }
for j := 1; j <= 9; j++ { jobs <- j } close(jobs)
for a := 1; a <= 9; a++ { <-results } }
func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "processing job", j) time.Sleep(time.Second) results <- j * 2 } }
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
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
ECOSSISTEMA GLIVE E O LEGADO
MONOLÍTICO API (JAVA, SPRING)
MONOLÍTICO CORE (JAVA)
BANCO DE DADOS (ORACLE)
FRONT-END (SCALA, PLAY, ANGULAR)
GLIVE
CONSUMER E
SYNC