<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blogs · Caique Oliveira Blog</title><link>https://caiquejh.com.br/blog/</link><description>Últimas publicações · Caique Oliveira Blog</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><copyright>© 2026 Caique Oliveira</copyright><lastBuildDate>Sat, 11 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://caiquejh.com.br/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Múltiplos Deployments com Kubernetes e Consul Service Mesh</title><link>https://caiquejh.com.br/blog/kubernetes-consul-service-mesh-multiplos-deployments/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>Caique Oliveira</author><guid>https://caiquejh.com.br/blog/kubernetes-consul-service-mesh-multiplos-deployments/</guid><description>&lt;p&gt;Rodar mais de uma versão da mesma aplicação em produção, ao mesmo tempo, é uma prática cada vez mais comum em times que buscam reduzir o risco de releases e tomar decisões orientadas a dados. Neste artigo veremos por que isso é útil, os conceitos de &lt;em&gt;canary deployment&lt;/em&gt; e teste A/B, e como implementar controle fino de tráfego entre múltiplos deployments usando &lt;strong&gt;Kubernetes&lt;/strong&gt;, &lt;strong&gt;Consul Service Mesh&lt;/strong&gt; e &lt;strong&gt;Helm&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="conteúdo"&gt;Conteúdo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#motivacao"&gt;Motivação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#canary-vs-ab"&gt;Canary Deployment vs Teste A/B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#consul-service-mesh"&gt;Consul Service Mesh: visão geral&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#service-router"&gt;Service Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#service-splitter"&gt;Service Splitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#service-resolver"&gt;Service Resolver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#como-funciona-junto"&gt;Como as três peças trabalham juntas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#exemplo-pratico"&gt;Exemplo prático com Kubernetes, Consul e Helm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#consideracoes-finais"&gt;Considerações finais&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="motivação"&gt;&lt;a name="motivacao"&gt;Motivação&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Por que uma equipe manteria duas versões do mesmo serviço rodando simultaneamente em produção, em vez de simplesmente substituir a versão antiga pela nova? Alguns motivos práticos:&lt;/p&gt;</description></item><item><title>Operadores bit a bit em Java</title><link>https://caiquejh.com.br/blog/operadores-bit-a-bit/</link><pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate><author>Caique Oliveira</author><guid>https://caiquejh.com.br/blog/operadores-bit-a-bit/</guid><description>&lt;p&gt;Na carreira de desenvolvedor, seja back-end ou front-end, não é muito comum a utilização de operadores bit a bit. Porém, conhecê-los é parte importante para a resolução de muitos problemas. Neste artigo conheceremos o conceito e avaliaremos uma aplicação prática.&lt;/p&gt;
&lt;p&gt;Os operadores bit a bit (&lt;em&gt;bitwise&lt;/em&gt;) são utilizados para a manipulação individual dos bits de um número inteiro (&lt;code&gt;byte&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; e &lt;code&gt;long&lt;/code&gt;). Vamos analisá-los para entender como cada um funciona.&lt;/p&gt;</description></item><item><title>Java 8</title><link>https://caiquejh.com.br/blog/java-8/</link><pubDate>Sun, 19 Jul 2015 00:00:00 +0000</pubDate><author>Caique Oliveira</author><guid>https://caiquejh.com.br/blog/java-8/</guid><description>&lt;p&gt;O Java 8, lançado em março de 2014, trouxe diversas melhorias no design da linguagem e novas APIs, como &lt;em&gt;Streams&lt;/em&gt; e &lt;em&gt;Java Time&lt;/em&gt;. Neste artigo analisaremos as principais mudanças no design da linguagem que prometem deixar o código mais conciso, reduzindo grande parte do &lt;em&gt;boilerplate&lt;/em&gt; e abraçando conceitos oriundos do paradigma de programação funcional.&lt;/p&gt;
&lt;h2 id="conteúdo"&gt;Conteúdo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#expressoes-lambdas"&gt;Expressões Lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#interfaces-funcionais"&gt;Interfaces funcionais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#default-methods"&gt;Default Methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#method-references"&gt;Method References&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusao"&gt;Conclusão&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="expressões-lambda"&gt;&lt;a name="expressoes-lambdas"&gt;Expressões Lambda&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Uma das principais características implementadas na linguagem foi a expressão lambda. Com ela podemos implementar o método abstrato de uma interface de maneira muito mais concisa do que com classes anônimas. Vejamos uma nova forma de iterar sobre coleções:&lt;/p&gt;</description></item></channel></rss>