.NET
Cloud Native e Cloud Agnostic
para rodar .NET em qualquer Cloud
ou sem Cloud sempre de forma profissional!
Últimas publicações
Abstrações duplicadas, quem nunca?
Quando uma abstração está exercendo seu papel, seu código tende a cada vez parecer mais simples. Ao olhar desatento pode parecer até simplista. O problema é que essa simplicidade ao mesmo tempo que aumenta a produtividade, produz ansiedade e afeta quem depende de complexidade para programar. No...
Abstrações e seu ciclo evolutivo
Uma das ideias que tenho amadurecido ao longo dos últimos anos está ligado às implementações de mecanismos arquiteturais e abstrações. Em Abstrações – Tradeoffs e co-responsabilidade eu falei sobre o que são abstrações boas, abstrações ruins, ponderei sobre quando criá-las e o que ela tem de ter...
Be Welcome .NET 5
É incrível ver que mesmo diante do dilema de uma mudança abrupta de rotina, o calendário de Releases do .NET 5 se manteve intacto. Temos uma mudança incrível na plataforma e enfim chegou o .NET 5! O Release Candidate 2 do .NET 5 já é SUPORTADO EM PRODUÇÃO pela Microsoft. Daniel Roth, Principal...
Register/Resolver e suas implicações para a modelagem e reaproveitamento
Você já notou que desde a chegada do .NET Core, consistentemente reaproveitamos menos nossas classes, principalmente de infraestrutura. Escrevemos mais classes e cada vez reaproveitamos menos nosso código? Bom se você não notou isso, então ao invés de 1 problema, temos 2! Quando você desenha uma...
Como perder mensagens com RabbitMQ
É comum falarmos sobre receitas de sucesso e como resolver problemas, mas será que você está fazendo essas coisas, está perdendo mensagens e vai culpar o RabbitMQ por isso? Se liga nessas dicas, pois se você está perdendo mensagens com RabbitMQ, a culpa é totalmente sua! E vou mostrar como você...
Enterprise Application Log + Access Log NGINX
Embora esse tutorial trate detalhadamente de configurações do NGINX e LogStash, no lugar do NGINX você pode usar qualquer aplicação que produza log em textos e que seja possível manipular o formato dos logs. Passo 1 - Escrever o log em formato JSON Nesse passo vamos editar o arquivo de...
Ring Buffer – Antecipe, otimize e evite custos excessivos
Ring Buffer, também chamado de Circular Buffer é uma estrutura de dados muito poderosa. Seu nome já traz o spoiler e entrega o ouro, afinal não deixa de ser um buffer, só que trabalhando em formato de anel/circular. Se você não faz ideia do que seja, vem comigo nessa viagem pois vamos dissecar o...
MVP | Developer Technologies | 2020-2021
Em Outubro de 2018 eu recebi o primeiro prêmio Microsoft Most Valuable Professional! Como faltava pouco para a renovação (maio, com resultado em 1° de julho) minha renovação havia sido marcada para 2020. E agora estou aqui para contar um pouco sobre o programa e essa a renovação. A primeira coisa...
Azure Functions + Containers (Parte 2/2)
No post passado o foco estava nos Agnostic Services e no uso de containers. Agora é hora de olharmos outra questão mais braçal. Rodar Azure Functions 3 com Containers, uma tarefa que deveria ser trivial, mas não é. Nossa jornada começa com o tutorial Criar uma função no Linux usando um contêiner...
Azure Functions + Containers (Parte 1/2)
Certa vez rolou uma discussão sobre Function as a Service (FaaS) e Containers questionando se um suplantaria o outro, ou se seríamos capazes de ignorar um em função do outro. Minha resposta curta e objetiva é: Não! Functions e Containers se complementam. Sempre que olharmos para Function as a...
Dockerfiles: Entrypoint vs CMD?
Você viu Entrypoint e CMD em algum lugar, seja em um dockerfile ou em um docker run, mas não faz a ideia do que seja? Vem comigo, é mais simples do que você imagina. Esse é o típico cenário em que a resposta é mais idiota do que você possa imaginar. É algo que não é nem sofisticado, nem complexo,...
Docker no WSL² – Walkthrough
No post anterior eu contei um pouco da história do projeto, mas agora é hora de olharmos para ele de fato. Que tal um passeio no parque com o WSL2? Enfim Generally Available do WSL2 que chega ao Windows 10 na versão 2004 Esse texto era parte do post anterior Enfim Generally Available do WSL2 que...
Projetos Open Source
projetos ativos e projetos antigos disponíveis para estudo
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Entender | Analisar | Projetar | Desenvolver | Implantar | Manter
A segurança que você busca não está em um tutorialPara entender uma tecnologia é importante entender o que influenciou sua criação, o que ela faz de fato, como ela faz. Para que então se sinta seguro e confiante a respeito das decisões que está prestes a tomar.
De um lado precisamos compreender o que está sendo feito por baixo dos panos para descobrir como extrair o máximo de uma tecnologia ou, ao menos, não atrapalhar o bom funcionamento dela.
O Cloud Native .NET é uma jornada de descoberta sobre tecnologias e patterns que fazem parte da maioria dos softwares que usamos, que somos usuários e que suportam e toleram altas cargas de trabalho, de forma eficaz, eficiente e sustentável.
É primeiro entendendo o que eles fazem, que podemos descobrir oportunidades e evoluir no que fazemos…
Conheça nosso Podcast
DevShow PodcastEm 2019 resolvemos criar um podcast, o DevShow Podcast, desde lá são mais de 40 episódios com muito assunto legal, sempre com essa pegada pessoal, falando coisas sérias, mas sem o menor compromisso com a formalidade.
.NET
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Arquitetura
(((((NodeJS + TypeScript + TSLint + Restify) + MongoDB) + Docker) + VSCode ) + Yeoman) = Uma experiência de desenvolvimento incrível!
Esse post foi movido para /blog/projetos/yeoman-generator-node-api-docker-1st-class-experience/
NGINX Automation
Se você usa o NGINX em produção, como Reverse Proxy, já se perguntou se seria possível criar algum tipo de automação. Essa é uma demanda pois quanto mais apps passando por ele, mais endereços, mais configurações serão necessárias. Se você usa todo o potencial do NGINX, aí com toda certeza você ficará interessado na automação.
Exemplo de configuração do NGINX:
Para você entender o que estou falando, abaixo tenho um arquivo bem parecido com o que tenho em produção.
#user nobody; worker_processes 1; pid /run/nginx.pid; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; events { worker_connections 4096; } stream { ############################################################# # Stream binds for Container zimbra ############################################################# server { listen 23; proxy_pass zimbra:22; } server { listen 53; proxy_pass zimbra:53; } server { listen 110; proxy_pass zimbra:110; } server { listen 143; proxy_pass zimbra:143; } server { listen 389; proxy_pass zimbra:389; } server { listen 465; proxy_pass zimbra:465; } server { listen 587; proxy_pass zimbra:587; } server { listen 993; proxy_pass zimbra:993; } server { listen 995; proxy_pass zimbra:995; } server { listen 3443; proxy_pass zimbra:3443; } server { listen 9071; proxy_pass zimbra:9071; } server { listen 444; proxy_pass zimbra:443; } ############################################################# # Stream binds for Container MySQL ############################################################# server { listen 3306; proxy_pass MySQL:3306; } ############################################################# # Stream binds for Container Redis ############################################################# server { listen 6379; proxy_pass Redis:6379; } ############################################################# # Stream binds for Container MongoDB ############################################################# server { listen 27017; proxy_pass MongoDB:27017; } ############################################################# # Stream binds for Container RabbitMQ ############################################################# server { listen 4369; proxy_pass RabbitMQ:4369; } server { listen 25672; proxy_pass RabbitMQ:25672; } server { listen 5671; proxy_pass RabbitMQ:5671; } server { listen 5672; proxy_pass RabbitMQ:5672; } server { listen 15672; proxy_pass RabbitMQ:15672; } server { listen 61613; proxy_pass RabbitMQ:61613; } server { listen 61614; proxy_pass RabbitMQ:61614; } server { listen 1883; proxy_pass RabbitMQ:1883; } server { listen 8883; proxy_pass RabbitMQ:8883; } } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; client_max_body_size 50M; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ############################################################# # # HTTP # ############################################################# ############################################################# # HTTP binds for Container LuizCarlosFariaBlog ############################################################# server { listen 80; server_name endereco.com.br www.endereco.com.br docker.endereco.com.br; location / { proxy_pass http://LuizCarlosFariaBlog:80; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } ############################################################# # HTTP binds for Container javaApp ############################################################# server { listen 80; server_name jira.endereco.com.br; location / { proxy_pass http://javaApp:8080; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } ############################################################# # HTTP binds for Container zimbra ############################################################# server { listen 80; server_name mail.*; location / { proxy_pass http://zimbra:80; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } ############################################################# # # HTTPS # ############################################################# ############################################################# # HTTPS binds for Container LuizCarlosFariaBlog ############################################################# server { listen 443 ssl; server_name endereco.com.br www.endereco.com.br docker.endereco.com.br; #ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_certificate_key xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_dhparam xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_prefer_server_ciphers on; #ssl_ciphers xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_timeout xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_cache xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling_verify xxxxxxxxxxxxxxxxxxxxxxxx; #add_header Strict-Transport-Security xxxxxxxxxxxxxxxxxxxxxxxx; location / { proxy_pass http://LuizCarlosFariaBlog:80; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } ############################################################# # HTTPS binds for Container zimbra ############################################################# server { listen 443 ssl; server_name mail.*; #ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_certificate_key xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_dhparam xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_prefer_server_ciphers on; #ssl_ciphers xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_timeout xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_cache xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling_verify xxxxxxxxxxxxxxxxxxxxxxxx; #add_header Strict-Transport-Security xxxxxxxxxxxxxxxxxxxxxxxx; location / { proxy_pass https://zimbra:443; proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } server { listen 7071 ssl; server_name mail.*; #ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_certificate_key xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_dhparam xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_prefer_server_ciphers on; #ssl_ciphers xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_timeout xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_session_cache xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling xxxxxxxxxxxxxxxxxxxxxxxx; #ssl_stapling_verify xxxxxxxxxxxxxxxxxxxxxxxx; #add_header Strict-Transport-Security xxxxxxxxxxxxxxxxxxxxxxxx; location / { proxy_pass https://zimbra:7071; proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Real-IP $remote_addr; #add_header Feedback $host; } } ############################################################# # # DEFAULT # ############################################################# server { listen 80; server_name xxx; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /nginx_status { stub_status; #access_log off; #allow 1.1.1.1; #deny all; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Trabalhando com Metadados:
No dia-a-dia você acaba por não ter de dar manutenção nestes arquivos com freqüência, e por isso você acaba por não lembrar de todos os passos necessários ou todas as features possíveis, assim automatizar gera o conforto e reduz o atrito na hora de fazer uma nova configuração no NGINX, a cada vez que você precise adicionar um novo endereço, ou aplicação no stack.
Embora o arquivo do exemplo 1 seja extenso, no dia-a-dia eu não preciso gerenciá-lo diretamente. Usando um script de automação que criei, eu modifico um arquivo json de metadados, executo um comando e pronto: arquivo de configuração gerado e script de recriação do container pronto para ser executado. Abaixo temos o exemplo de metadados, ele está disponível no repositório do projeto, no github.
{ "NginxContainerName": "EntryPoint", "Workers": { "Count": 1, "Connections" : 4096 }, "Services" :[ { "ContainerName" : "blog", "Enabled" : true, "Binds":[ { "Type": "http", "Port" : 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" }, { "Type": "https", "HostPort" : 443, "ContainerPort": 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" } ] },{ "ContainerName" : "wso2esb", "Enabled" : false, "Binds":[ { "Type": "http", "HostPort" : 80, "ContainerPort": 8020, "HostHeaderPattern": "esb.endereco.com.br api.endereco.com.br", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] } ] },{ "ContainerName" : "javaApp", "Enabled" : true, "Binds":[ { "Type": "http", "HostPort" : 80, "ContainerPort": 8080, "HostHeaderPattern": "jira.endereco.com.br" } ] },{ "ContainerName" : "zimbra", "Enabled" : true, "Binds":[ { "Type": "stream", "HostPort" : 23, "ContainerPort": 22 }, { "Type": "stream", "Port" : 53 }, { "Type": "stream", "Port" : 110 }, { "Type": "stream", "Port" : 143 }, { "Type": "stream", "Port" : 389 }, { "Type": "stream", "Port" : 465 }, { "Type": "stream", "Port" : 587 }, { "Type": "stream", "Port" : 993 }, { "Type": "stream", "Port" : 995 }, { "Type": "stream", "Port" : 3443 }, { "Type": "stream", "Port" : 9071 }, { "Type": "stream", "HostPort" : 444, "ContainerPort": 443 }, { "Type": "http", "Port" : 80, "HostHeaderPattern": "mail.*" }, { "Type": "https", "Port" : 443, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] }, { "Type": "https", "Port" : 7071, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] } ] },{ "ContainerName" : "MySQL", "Enabled" : true, "Binds":[ { "Type": "stream", "Port" : 3306 } ] },{ "ContainerName" : "Redis", "Enabled" : true, "Binds":[ { "Type": "stream", "Port" : 6379 } ] },{ "ContainerName" : "MongoDB", "Enabled" : true, "Binds":[ { "Type": "stream", "Port" : 27017 } ] },{ "ContainerName" : "RabbitMQ", "Enabled" : true, "Binds":[ { "Type": "stream", "Port" : 4369 }, { "Type": "stream", "Port" : 25672 }, { "Type": "stream", "Port" : 5671 }, { "Type": "stream", "Port" : 5672 }, { "Type": "stream", "Port" : 15672 }, { "Type": "stream", "Port" : 61613 }, { "Type": "stream", "Port" : 61614 }, { "Type": "stream", "Port" : 1883 }, { "Type": "stream", "Port" : 8883 } ] } ], "templates": [ { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf" }, { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh" } ] }
Sem sombra de dúvidas, o arquivo JSON, acima, apresenta um modelo mais simples e melhor estruturado, tornando fácil criar novas configurações. Mas o NGINX não reconhece esse formato, para isso um script que transforma esse arquivo em 2 outros, o de configuração e o de recriação do container.
O repositório já conta com um arquivo de configuração parecido com esse que está aqui no post, além disso, o resultado do script é o arquivo de configuração “` ./output/nginx.conf “` e um arquivo sh “` ./output/reebuild-container.generated.sh “` , destinado à recriação do container.
O arquivo de configuração segue o exemplo 1, enquanto o script de recriação do container está abaixo no exemplo 3.
#!/bin/bash docker rm -f EntryPoint docker run -d --name EntryPoint --hostname EntryPoint --network=front -p 80:80 -p 443:80 -p 23:22 -p 53:53 -p 110:110 -p 143:143 -p 389:389 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 3443:3443 -p 9071:9071 -p 444:443 -p 7071:7071 -p 3306:3306 -p 6379:6379 -p 27017:27017 -p 4369:4369 -p 25672:25672 -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 61613:61613 -p 61614:61614 -p 1883:1883 -p 8883:8883 -v /docker/EntryPoint/config:/etc/nginx/ -v /docker/EntryPoint/PageSpeed:/PageSpeed/ -v /docker/EntryPoint/logs:/var/log/nginx/ -v /docker/Certificados/:/cert/ luizcarlosfaria/nginx-pagespeed sleep 2 docker ps -a --filter "name=EntryPoint" docker logs EntryPoint
Este repositório é uma base para você criar sua própria automação. Se você usar a imagem luizcarlosfaria/nginx-pagespeed/ você ganha features como:
- Stream – Possibilidade de usar o NGINX como Reverse Proxy de serviços não HTTP, como Banco de Dados, Redis. Mongo etc. Isso torna mais segura sua infra, na medida que você não precisa criar seus containers com binding para as portas. Habilita somente nos períodos em que precisar.
- ngx_http_substitutions_filter_module – possibilita a substituição do conteúdo HTTP de uma requisição.
- Google Page Speed – uma verdadeira bruxaria! O Google Page Speed realiza otimizações no HTML, Javascript de forma coordenada e unificada, permitindo que você melhore aplicações das quais você não tem controle sobre o desenvolvimento.
- nginx-rtmp-module – NGINX-based Media Streaming Server, desenhado para enconding em realtime.
Os templates de criação estão na pasta ./Templates e devem ser customizados a gosto!
Get Started
Download
Baixe o repositório:
git clone https://github.com/docker-gallery/nginx-pagespeed-automation.git cd ./nginx-pagespeed-automation npm install
Customizando os metadados
No arquivo ./data.json substitua ./output/nginx.conf pelo path real onde deve ficar o arquivo de configuração do NGINX.
"templates": [ { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf" }, { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh" } ]
Customizando script de recriação do container
No arquivo ./templates/nginx-recreate.sh.template.asp fique atento às linhas 8 e 26:
#!/bin/bash docker rm -f <%= data.NginxContainerName %> docker run -d --name <%= data.NginxContainerName %> --hostname <%= data.NginxContainerName %> --network=front <% var portsInUse = []; Enumerable.from(data.Services).where("$.Enabled").toArray().forEach(function(service){ var result = Enumerable.from(service.Binds).select(function(bind){ var bindPort = is.existy(bind.Port)?bind.Port : bind.HostPort; var containerPort = is.existy(bind.Port)?bind.Port : bind.ContainerPort; var returnValue = ""; if(Enumerable.from(portsInUse).any(function(it){ return it == bindPort}) == false) { portsInUse.push(bindPort); return "-p " + bindPort + ":" + containerPort; } return returnValue; }).toArray().join(" "); %> <%= result %> <% }); %> -v /docker/EntryPoint/config:/etc/nginx/ -v /docker/EntryPoint/PageSpeed:/PageSpeed/ -v /docker/EntryPoint/logs:/var/log/nginx/ -v /docker/Certificados/:/cert/ luizcarlosfaria/nginx-pagespeed sleep 2 docker ps -a --filter "name=<%= data.NginxContainerName %>" docker logs <%= data.NginxContainerName %>
Na linha 8 temos a configuração da rede docker usada pelo container, enquanto na linha 26 o bind com o path do volume destinado às configurações do NGINX. Este último precisa ser coerente com path do arquivo gerado.
Executando
Acertando esses pontos para o teu cenário, basta rodar:
node ./index.js
Os arquivos são regerados e você pode executar o script “` ./reebuild-container.generated.sh“` localizado na pasta output. Este script removerá o container chamado EntryPoint, e o recriará, com base nas configurações de portas determinados no seu data.json.
Outras possibilidades
Esse procedimento pode ser automatizado no WebMin, mas isso é um assunto para um segundo post.
Você ainda pode customizar todo o fluxo para gerar outros artefatos, como um docker-compose.yml, por exemplo, e enfim, muito mais.
Forke o projeto no github.
Docker – de A a Z – 15 – RabbitMQ, ElasticSearch , LogStash e Kibana
Durante a série Docker de A a Z, esse foi um dos Stacks entregues para facilitar a compreensão de como docker pode nos ajudar a unir soluções complexas, colaborando para criar stacks com diversos projetos e produtos.
Esse stack serviu para a apresentação, mas também virou projeto e hoje é mantido e atualizado, por mim e por colaborações.
Para simplificar a apresentação desse conteúdo o post foi movido para a página do Stack aqui no site.
Docker Images – Nginx & Google PageSpeed
A internet como vemos hoje exige cada vez mais performance e cada vez melhor usabilidade. Nunca tivemos tanto apreço à experiência do usuário, assim produtos, ferramentas, serviços e frameworks são bem vindos para ajudar a entregar performance. Com o aumento nos recursos de interface, e a facilidade com que conseguimos hardware, chegamos em um momento em que a renderização passa a ser um ponto chave na obtenção de performance, já que do aspecto de processamento do server, nunca vimos tanto hardware (barato), nunca vimos tantos patterns, tantas soluções para facilitar nossa vida.
Mas e quando você não tem controle sobre todo o que foi desenvolvido? Seja ao fazer deploy de um WordPress, Magento, ou soluções maiores, como SiteCore, Evoq, o que fazer quando você precisa melhorar a experiência do seu usuário? Esse problema é comum quando usamos soluções prontas, em que sua customização não necessariamente abrange detalhes tão técnicos. É sobre esse tipo de problema que quero falar e vou aproveitar para apresentar o Google PageSpeed Module for Nginx, falar um pouco sobre Nginx e como ambos podem te ajudar no seu próximo projeto.
[deprecated]Oragon Architecture – estratégia para 2016
[deprecated]
Quem segue esse blog conhece o Oragon Architecture, sabe pelo menos do que se trata e o que ele faz. Então vou encurtar as apresentações, pois já fiz isso em diversos posts.
De fato as mudanças, no desenvolvimento de software em si, nunca foram tão drásticas e disruptivas. Não há nada de ruim nisso, mas é necessário adaptar-se a novos dilemas, propostas e abordagens. Cheguei a cogitar, o abandono do projeto, por completo, acreditando que pudesse contribuir mais talvez em outro momento, com outras coisas menores, já que tudo o que tenho construído e desenhado baseia-se em algo que tende a não ser mais interessante para mim.
Containers
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Mensageria
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Conteúdo e Posicionamento
.NET + Cloud Native + Cloud Agnostic
.NET | DevOps | Microservices | Containers | Continuous Delivery
.NET muito além do .NET
O mínimo de infra que todo dev e/ou arquiteto deveria saber
Aplicações distribuídas e comunicação entre serviços (RabbitMQ / gRPC)
Containers, Docker e Kubernetes
RabbitMQ e Mensageria e comunicação assíncrona entre aplicações e serviços
Arquitetura de Software e Arquitetura de Solução com foco no melhor aproveitamento em projetos .NET
Nossos números
Desde 2002 trabalhando com desenvolvimento de software
Desde 2002 ajudando outros devs
Desde 2010 trabalhando exclusivamente como arquiteto
Contas atingidas no telegram/facebook
Alunos
Microsoft MVP
Conteúdo Gratuito
Tudo que está aqui no gaGO.io é conteúdo gratuito, feito para ajudar desenvolvedores dos mais variados níveis.
Cursos
Tenho também alguns programas de acompanhamento. Esses programas tem a função de ajudar desenvolvedores em áreas específicas ou de forma mais abrangente na jornada do arquiteto.