Slides

Propaganda
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.
Download