.NET
Cloud Native e Cloud Agnostic
para rodar .NET em qualquer Cloud
ou sem Cloud sempre de forma profissional!
Últimas publicações
Enterprise Application Log – A origem das decisões
Inúmeras vezes eu apresento o Enterprise Application Log e instantaneamente aparece alguém tentando "defender" o Application Insights, como se de alguma forma eu estivesse cometendo uma heresia ao propor qualquer outra coisa. O mais curioso é que essa comparação é superficial e infundada. Hoje...
Docker Definitivo – Inscrições dias 11 e 12 de Novembro
Após um longo inverno, teremos mais uma janela de inscrição para o Docker Definitivo! Esse é o momento em que você poderá se inscrever para fazer parte da nossa tribo! Um dia eu disse que eu acreditava que Docker mudaria a forma como enxergamos a hospedagem de aplicações. Um dia sonhei que talvez...
NHibernate em 2022 – Será que faz sentido?
Se você já me viu falar de persistência, você talvez já saiba do que eu estou falando, mas talvez não entenda os argumentos. A história do NHibernate NHibernate é um full featured ORM que nasceu em 2005 como um port do Hibernate do Java aqui na plataforma .NET. O Hibernate do Java nasceu em 2001,...
RPC sob AMQP seduz enquanto mata… sua implantação de mensageria
Se você viu meu último post e se animou por acreditar que usar RPC sob AMQP seja uma ideia incrível, calma que lá vem um balde de água fria! Com toda certeza eu não vou falar bem da abordagem! E se você resolveu que não vai ler, e ainda vai adotar RPC sob AMQP assim mesmo. Esse post é o que os...
Messaging Patterns: RPC – Remote Procedure Call
RPC pode parecer sofisticado demais, mas que tal Request/Response? Agora "SOA" familiar? Nem só de total assincronismo vive o mundo da mensageria, há momentos em que precisamos de uma resposta. RPC é a forma mais prática de adotar mensageria, mas é preciso entender as consequências dessa...
O que aprendi acompanhando projetos sem arquitetos
Esse é um relato dos meus 20 anos no mercado. Por sorte e até ironia do destino, eu vi o papel do arquiteto desde o dia 1 de minha jornada de trabalho. Isso me possibilitou entender que arquitetos e desenvolvedor possuem interesses diferentes. Aqui vou mostrar o que esses anos vendo e ajudando...
17 ações que você pode fazer hoje, para fracassar seu projeto amanhã
Hoje vamos de dicas para o caos e a destruição. É a atitude pessimista que dá emprego para mais gente no mercado, produz mais trabalho, assim produzimos um ciclo vicioso de projetos ruins, recuperações de projetos, refatorações e posteriormente reconstruções dos mesmos projetos! Essas dicas vão...
Resiliência: Polly vs RabbitMQ
Fato que eu adoro essas comparações inusitadas! A intenção desse post é poder trazer de forma consistente uma visão que ajude a trazer clareza, e me permita também referenciar um conteúdo mais estruturado em vez de ter de construir toda uma argumentação em locais que propositalmente não possuem...
Porque Injeção de Dependência importa?
Algumas coisas são feitas no automático, e se você não entendeu porque o ASP .NET usa Injeção de Dependência by default, você deveria ler esse post. O que vamos entender hoje é porque Injeção de Dependência é importante, e as implicações em não usá-la. Engraçado que esse assunto deveria ser óbvio...
RabbitMQ Streams com TypeScript e NodeJS
Em Julho o RabbitMQ ganhou suporte a Streams. De um lado aproxima o RabbitMQ do Kafka já que possui a mesma estrutura de dados, mas por outra ótica se isola completamente sendo provavelmente o único produto da categoria com suporte a ambos. Mas você sabia que a diferença entre Streams e Queues são...
DESCONTINUADO | 10 domínios para você usar à vontade… só no localhost
Se você quer validar um proxy reverso, hospedar diversas aplicações no IIS para testar, enfim, estou compartilhando com vocês 10 domínios que apontam para 127.0.0.1. NOTA Esses endereços foram descontinuados, por favor utilize o nip.io https://nip.io/ A ideia original Respectivamente:...
Docker Desktop pago? Agora é o fim! Só pode! Será mesmo?
Toda notícia ao redor da Docker Inc gera um transtorno absurdo. A equipe de comunicação e marketing está de parabéns! Com uma gestão imagem que beira o nulo. Na vez passada o não suporte ao dockershim, pela equipe do Kubernetes, respingou sobre a Docker como se o Kubernetes perdesse suporte à...
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
.NET Core – de 2.0.0-preview2 para 2.0.0 – Atualizando projetos e Dockerfiles
Vamos direto ao ponto: A intenção desse post é apresentar como migrar seus projetos do .NET Core 2.0-preview2 pra o .NET Core 2.0 RTM. Sim, esse é um tutorial, e visa apresentar o que é necessário para fazê-lo.
O .NET Core 2 foi anunciado no dia 14 de agosto e para quem estava usando o 2.0-preview2 algumas coisas simplesmente pararam de funcionar do dia para a noite.
docker-gallery/EnterpriseApplicationLog – v3.0
Em outubro no post Docker – de A a Z – 15 – RabbitMQ, LogStash, ElasticSearch e Kibana com Docker Compose eu apresentei um modelo interessante de Log, com uma abordagem diferente. Ficou muito simples para trabalhar com o stack, no entanto a Elastic.co mudou muita coisa no meio do caminho e foi necessário readaptar o projeto às novidades da plataforma. Para alegria dos que gostam do projeto que compilei, aqui está a novidade: Revisitei as configuração e acertei o que era necessário para o stack!
A premissa base que me levou à compilar esse stack é criar a possibilidade de utilização desses 5 elementos, sem dor de cabeça. Conectando os pontos, e criando um pacote pré-moldado, todo o entendimento e gerenciamento da plataforma se torna mais simples, e se você quer um stack funcional em minutos, é uma das poucas alternativas.
Eu já fiz pelo menos 2 setups desse stack sem docker e docker-compose e te garanto: é absurdamente traumático, principalmente se quem for executar a tarefa precisa de um documento formal que diga como fazer tudo, from scratch! São 5 elementos, 5 configurações específicas, cada um em um documento, cada um com seus passos em ordem, enfim, um mini-inferno para ambientes mais burocráticos e inviável para quem só quer estudar. Esses motivos me fizeram criar o projeto, permitir que com 3 linhas de comando e alguns segundos, você tenha tudo isso rodando e colaborando em sua infraestrutura.
Sobre os comandos, continuam os mesmos:
git clone https://github.com/docker-gallery/EnterpriseApplicationLog.git cd ./EnterpriseApplicationLog docker-compose up
Entre a primeira release, em outrubro de 2016, e meados de 2017 muita coisa coisa mudou, a Elastic criou seu repositório próprio para imagens docker e lançou algumas releases de seus produtos, com isso muita coisa parou de funcionar, e o stack ficou quebrado. As últimas releases no docker hub causaram essas quebras, mas serviram de alerta.
Agora o stack está aqui novamente!
A release 3.0 do projeto conta com:
- Adequação à mudança de hub.docker.com para docker.elastic.co.
- Revisão das configurações e adequação para as novas versões dos produtos.
- Update do RabbitMQ indo para a versão baseada em apline.
- Remoção do Xpack (o stack ELK é open source, no entanto o Xpack é um pacote pago).
Se quer conferir, rode as linhas de comando acima, ou visite o repositório que está disponível no GitHub. Esse projeto não possui imagem própria, apenas configura imagens do hub.docker.com e agora do docker.elastic.co.
.NET Core 2.0 e .NET Standard 2.0 Hangout @ Canal.NET
Pessoal, dia 7 de Julho vou participar novamente de um hangout no Canal.NET, desa vez o tema é .NET Core 2.0 e .NET Standard 2.0.
O lançamento do .NET Core 2.0, do ASP.NET Core 2.0 e do .NET Standard 2.0 está previsto para os últimos 4 meses de 2017. Acompanhe este hangout para ficar por dentro das novidades e entender melhor o que está por vir.
Presenças confirmadas:
– Renato Groffe (Microsoft MVP, MTAC)
– Luiz Carlos Faria (MTAC)
Há muito para falar sobre as novidades do .NET Core, suas novas API’s, o que chega e como vamos nos beneficiar disso tudo. Sem deixar de abordar .NET Standard e matar de vez as dúvidas sobre no que consiste o .NET Standard e quais são sua vantagens.
O evento já foi criado no Facebook | https://www.facebook.com/events/284606505335837/, marque presença e receba as notificações sobre as novidades desse tema! Vamos postar diversos posts e material que auxilie no entendimento!
Então fica o convite aqui, dia 7 de julho, sexta-feira 22h, nos encontramos! Ah, a transmissão acontecerá no canal.NET e você assiste direto pelo youtube, podendo comentar, tirar dúvidas, e dialogar conosco, como sempre. Desde já de antemão agradeço ao convite do Renato Groffe!! A propósito, o conteúdo fica disponível no canal.net e você pode assistir a qualquer hora!
https://blogs.msdn.microsoft.com/dotnet/2017/06/28/announcing-net-core-2-0-preview-2/
https://blogs.msdn.microsoft.com/webdev/2017/06/28/introducing-asp-net-core-2-0-preview-2/
https://blogs.msdn.microsoft.com/dotnet/2017/06/28/announcing-ef-core-2-0-preview-2/
Exception Handling
Pessoal, rolou hoje no Software em Contexto um bate papo sobre Exception Handling muito legal. Nesse papo abordamos exceptions quando lançar, quando não lançar, falamos diversas formas de tratar exceptions, apresentamos códigos e refletimos sobre o que é ou não uma exceção. Qual conclusão chegamos? Assiste aê, tire a sua conclusão e retorne com sua opinião.
Live
https://www.youtube.com/watch?v=wN0qexlM8zI
Conteúdo Adicional
Além do tema principal, abordamos Logs e tenho alguns links para falar do assunto! Alguns aqui no site e outros externos:
Monte sua Infraestrutura de Logs Corporativos com RabbitMQ, ElasticSearch, LogStash e Kibana!
Logs, não somente logs. Logs com informações de negócio!
Um excelente framework para auxiliar no tratamento de exceções e criação de políticas de tratamento de exceção.
Contract Package – Uma excelente alternativa ao Service Reference
Falar de WCF em meados de 2017 parece algo sem sentido, no entanto considero relevante tornar públicas soluções e alternativas que muitas vezes só apresentava dentro dos times por onde passei. São soluções, ideias, conceitos que ajudam no desenvolvimento e tornam o dia-a-dia de desenvolvimento mais fácil para quem está ciente dos conceitos ao redor da plataforma. Ignorei a possibilidade de publicar esse tipo de conteúdo para evitar exposição, já que obviamente, os preguiçosos irão reclamar, e muito! De qualquer forma asseguro, se você usa WCF e nunca viu esses conceitos, acredito que ao concluir esse post verá a tecnologia como algo menos místico, e até poderá criar alguma empatia por ela. É ambiciosa a minha proposta, eu sei!
Arquitetura
Proxy Reverso: Pra quê? Por quê?
Você já nos viu falando de Proxy Reverso, em geral usamos NGINX nessa tarefa, mas afinal? Pra quê isso? Por que “isso” é necessário?
ler mais…The Microservices Journey – S1E2
No post passado eu citei alguns elementos que precisam ser levados em conta, e não detalhei muita coisa. Só narrei causa e efeito. Hoje eu vou listar o material que já produzi que tem alguma ligação com o tema. Direta ou indiretamente, são elementos que vão ajudar a esclarecer como essa jornada, e mostrar como tudo começou para mim. Eu me proponho a elucidar alguns pontos que vão ajudar a esclarecer e te ajudar a construir soluções melhores.
ler mais…The Microservices Journey – S1E1
Ainda não estruturei como uma jornada, portanto o começo dessa jornada é um brainstorm. Como toda jornada onde sabemos o destino, mas temos um caminho desconhecido, vamos buscando do horizonte curto para o distante e do horizonte distante para o curto, aproximando e reduzindo a área de incompreensão.
ler mais…Docker – de A a Z – 20 – Volume TMPFS – o poder do file system em memória
Uma das coisas lindas do Linux é a separação volumes e file system. E você não faz ideia do que dá para fazer com file system em memória!!!?
ler mais…Oragon – Princípios de Design – Complexidade Reside na Arquitetura
Alguns poucos lembram, pois alguns poucos estavam lá, mas quando comecei minha carreira profissional. Uma das coisas que me projetou rápido na Petrobras foi a capacidade de identificar padrões e automatizar via abstrações e componentes a escrita de código repetitivo e burocrático.
Ainda no ASP Clássico, em 2002, já havia criado alguns componentes, seja com VBScript para o ASP, ou com JavaScript para UI.
Nunca me dei bem com trabalho repetitivo, principalmente, pois esse tipo de trabalho me faz perder a atenção fácil. E o resultado é sempre o mesmo, faltou um detalhinho aqui, outro detalhinho acolá.
ler mais…Containers
NGINX Automation + WebMin
No post NGINX Automation eu falei sobre como criar uma automação que lhe facilite na gestão do NGINX. Agora vou abordar, em forma de tutorial, como usar essa solução no webmin.
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 – 16 – SQL Server for Linux
Pessoal,
aqui vai mais um vídeo da série, e dessa vez uma demo, super simples e super rápida sobre o SQL Server for Linux.
Vale lembrar que esse SQL Server on Linux é compatível com os providers e ferramentas que conhecemos e usamos no da-a-dia em qualquer aplicação, sua limitação está nos designers do SQL Server Management Studio (SSMS). E por falar nisso, está aqui o link para download do SSMS, o download tem aproximadamente 900mb.
Se você ainda não pensa em uma utilizada real para o SQL Server for Linux, vale lembrar que a estabilidade do Linux já justificaria uma versão de produção do SQL Server no Linux, mas enquanto estamos em CTP (community technology preview), podemos pensar em:
- Ambientes de teste
- Teste integrado para testes de CI e CD
- Teste de implantação
Bom o céu é o limite. Com um pouco de criatividade, dá para se imaginar muitas formas de se utilizar o SQL Server on Linux!
Aqui está o vídeo!
[UPDATE 26/09/2017]
Hoje fazendo novos testes, revalidando o que havia dito aqui no vídeo percebi que o designer de tabelas já está funcionando perfeitamente no Linux, e com Docker!
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.
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.