Jekyll2023-10-23T10:41:07+00:00http://rafabene.com/feed.xmlRafael Benevides’ BlogRafael Benevidesrafabene@gmail.comBack to Red Hat, Opensource, Java and to other technical stuff2023-10-16T00:00:00+00:002023-10-16T00:00:00+00:00http://rafabene.com/2023/10/16/back-to-redhat<p>(Don’t force the rounded peg in the square hole)</p>
<p><img src="/assets/images/squareholetoy.jpg" alt="Shape & Sort it out toy" /></p>
<p>Now that the dust is settling down, I finally had a little bit of extra time during the <a href="https://nationaltoday.com/lady-of-aparecida/">last holiday in Brazil</a> to write this blog post. This year I decided to make some adjustments in my career, and I’ll give you more details as I think they might help other professionals who face the same dilemma.</p>
<p>First of all, choosing your career path is not as simple as it seems. Today, the enterprise IT industry (where I have worked for several years) allows you to grow in several areas: services, training, sales, support, people management, project management, engineering, technical marketing, etc. You can become a (Software or Support) Engineer, a (Product or Project) Manager, a SRE, a Tester, a (Solutions or Consulting) Architect, etc. Even if you decide to become a Software engineer, you must choose what kind of Software you will produce (Mobile, Game, or Desktop. Frontend or Backend, etc), and the suitable technology stack for it. See!?</p>
<p>Personally, in a <em>Y career path</em>, I always had the tendency to choose the “<em>technical path</em>” instead of the “<em>executive path</em>”. In other words, I prefer to work as an individual contributor, instead of management. Today I prefer to seek and become an architect or engineer than become a (people or project) manager. Even roles that require similar skills it’s ok to have your own preference. For example, I prefer to work as a product manager close to developer’s communities instead of becoming an account manager. And that ‘s ok! In a world full of opportunities, having a clear direction on where do you want to go helps you a lot!</p>
<p>My career has been focused (even before joining Red Hat) on <a href="https://rafabene.com/2007/07/09/from-beryl-to-compiz-fusion/">opensource software</a>, <a href="https://rafabene.com/2007/03/20/dicas-para-iniciantes-java/">Java</a>, and <a href="https://rafabene.com/2007/09/30/matando-um-alien-devorador-de/">software development</a>. That background (Java/Opensource/Software development) led me to Red Hat in 2009 where <a href="https://rafabene.com/2019/07/12/I-joined-oracle/">I stayed for 10 years</a>. At Oracle I worked with <a href="https://blogs.oracle.com/developers/post/lifting-a-java-ee-application-to-verrazzano">Java</a>, Opensource (<a href="https://blogs.oracle.com/linux/post/announcing-oracle-linux-cloud-native-environment-release-13">Linux, Kubernetes</a>, <a href="https://blogs.oracle.com/developers/post/how-to-install-a-verrazzano-cluster">Verrazzano</a>, etc) and <a href="https://videohub.oracle.com/media/Oracle+WebinarA+Melhorando+o+design+do+seu+c%C3%B3digo+Java/1_6lmi4rai">Developer’s communities</a>.</p>
<p>As a Java tech lead, community driven, and opensource oriented professional, I had the expectation to continue my career path as I mentioned in <a href="https://rafabene.com/2022/05/16/I-joined-microsoft/">this blog post</a> where I even named myself <strong>“a Java/Linux guy “</strong>. However, after a whole year, I was feeling <a href="https://www.linkedin.com/pulse/10-things-why-jobs-frustrating-sajid-hasan-sifat/">frustrated</a> and unhappy with the role. This feeling is more common that you think. Believe me!</p>
<p>But let me tell you a redepmption story: One day my therapist gave me a shape sorting cube and made me try to put a round peg into a square hole. Through that toy, he led me to understand that my previous role and I were not aligned. The issue was not the rounded peg nor the square hole by themselves. The issue was trying to force them to fit. So, I decided to quit in June, and go back to my roots to work as a <strong>Java tech-lead focusing on architecture and design, development productivity and best-practices, containers, Cloud Computing, DevOps, and other related technologies</strong>.</p>
<p>I can consider myself lucky for two reasons:</p>
<p><strong>First</strong>: I’ve been taught that we should never work exchanging time for money. Instead I work to satisfy myself and customers by delivering what I know best (because I love what I do).</p>
<p><strong>Second</strong>: In August <strong>I returned to Red Hat as a Senior Middleware Architect to work with the following technologies: Openshift, Keycloak, Kafka, Quarkus, Wildfly/EAP, 3Scale, Camel, Tekton, ArgoCD and much more</strong>. Red Hat lives in my heart, and I call it “home” for having the same culture, technologies and the kind of products that I admire: <em>Enterprise opensource software</em> . Furthermore, Red Hat supports and encourages all employees to do community contributions like conferences and opensource code. For those who know me better: Doesn’t this sound totally aligned with my career objetives? I definitely think so!</p>
<blockquote>
<p>“The only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle.” —Steve Jobs</p>
</blockquote>Rafael Benevidesrafabene@gmail.com(Don’t force the rounded peg in the square hole)Como utilizo o Macbook para desenvolver Software2023-07-11T00:00:00+00:002023-07-11T00:00:00+00:00http://rafabene.com/2023/07/11/macbook-desenvolvimento-software<p>Estes dias resolvi formater meu notebook, um “velho” Macbook Pro 2019, que trouxe de mudança dos EUA. Não vou entrar no mérito do preço proibitivo dos Macbooks no Brasil, mas sem dúvidas alguma, o conjunto Hardware + Sistema Operacaional (MacOS) de um Macbook Pro, é na minha opinião um casamento perfeito para desenvolvedores.</p>
<p>Para quem gostaria de saber o motivo de eu utilizar o Mac, aqui vão algumas das minhas justificativas: O Sistema Operacional é estável, com suporte a grande maioria dos softwares, e com o Shell baseado em Posix. Para mim, é a garantia perfeita de produtividade! Tudo simplesmente funciona!</p>
<p>E para quem já é usuário Mac, e gostaria de saber o que eu utilizo, resolvi fazer aqui uma lista do que considero ser os primeiros passos para ter um Macbook funcional para começar a produzir.</p>
<p>Vamos lá:</p>
<h3 id="--instalação-do-microsoft-edge">- Instalação do <a href="https://www.microsoft.com/pt-br/edge">Microsoft Edge</a></h3>
<p>Sinceramente, não gosto muito do Safari. Prefiro o Google Chrome, ou o Microsoft Edge. Venho utilizando o Microsoft Edge há algum tempo, e este se tornou meu navegador favorito por ter um consumo de memória levemente menor que o o Google Chrome.</p>
<p><em>Extensões</em>: <a href="https://lastpass.com/">LastPass</a> - É o único que para mim é primordial, pois realmente não sei sequer uma senha minha. Tudo é gerenciado pelo LastPass, então para começar a trabalhar</p>
<h3 id="--remoção-dos-items-não-usados-do-dock">- Remoção dos items não usados do Dock</h3>
<p>O Dock do Mac vem por padrão com tanto aplicativo, que na minha opinião, só fazem atrapalhar. Gosto de deixar no Dock apenas item que uso TODAS AS HORAS.</p>
<p><em>O que eu deixo</em>: Finder e Launchpad, MS Edge, Terminal, Calendário, App Store, e Configurações.</p>
<h3 id="--instalação-do-iterm2">- Instalação do <a href="https://iterm2.com/">iTerm2</a></h3>
<p>O iTerm2 é um excelente substituto do Terminal que vem no MacOS. Com várias funcinalidades que realmente são bem interessantes. Você pode ver quais são estas funcionalidades aqui: <a href="https://iterm2.com/features.html">https://iterm2.com/features.html</a></p>
<h3 id="--instalação-do-magnet">- Instalação do <a href="https://apps.apple.com/br/app/magnet/id441258766">Magnet</a></h3>
<p>O Magnet é excelente para posicionar as janelas no seu ambiente. Como faço bastantes demonstrações para clientes, às vezes é necessário posicionar diversas janelas de uma forma que o cliente veja tudo que está acontecendo. O Magnet é perfeito para isto.</p>
<h3 id="--instalação-do-scroll-reverser">- Instalação do <a href="https://pilotmoon.com/scrollreverser/">Scroll Reverser</a></h3>
<p>Scroll Reverser é uma aplicação gratuita que reverte a direção de rolagem do mouse, independente dos ajustes do trackpad e do mouse (incluindo o Magic Mouse).</p>
<p>Gosto de deixar configurado para quando eu rolar ou mouse para baixo, a rolagem da página seja para baixo também.</p>
<h3 id="--instalação-do-homebrew">- Instalação do <a href="https://brew.sh/">Homebrew</a></h3>
<p>O Homebrew é um gerenciador de pacotes para o MacOS. Pense no Homebrew como um apt-get ou Yum no Linux, ou o Chocolatey para o Windows. <a href="https://formulae.brew.sh/formula/">Diversas ferramentas</a> podem ser instaladas com o Homebrew. Portanto é um item de primeira necessidade.</p>
<p><em>Pacotes que geralmente instalo primeiro</em>: <code class="language-plaintext highlighter-rouge">ansible, stats, e terminal-notifier.</code></p>
<p>Aliás, o <a href="https://github.com/exelban/stats">Stats</a> é excelente para poder monitorar os recursos (CPU, Memória, Rede, Disco, etc) do seu MacOS rapidamente.</p>
<h3 id="--instalação-do-oh-my-zsh">- Instalação do <a href="https://ohmyz.sh/">“Oh my ZSH”</a></h3>
<p>O “Oh my ZSH” permite a customização (via temas e plugins) do zsh (Z Shell) de forma que sua produtividade será consideravelmente aumentada.</p>
<p>São mais de <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins">300 plugins disponíveis</a>, além de uma série de <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes">temas</a>.</p>
<p>O tema que eu utilizo é o <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster">“agnoster”</a> que requer a instalação de algumas <a href="https://github.com/powerline/fonts">fontes do Powerline</a>.</p>
<h3 id="--instalação-do-obs-open-broadcaster-software">- Instalação do <a href="https://obsproject.com/pt-br">OBS (Open Broadcaster Software)</a></h3>
<p>O OBS é bastante conhecido no meio das pessoas que criam vídeos para o Youtube. É uma ferramenta opensource que permite a criação de cenários que contenham cameras, disposição de elementos e outras funcionalidades que simplesmente não dá para ficar sim.</p>
<p>No meu caso, é a ferramenta que utilizo para gravar vídeos. Já deu uma olhada no canal <a href="http://youtube.com/rafabene">DevX Time</a>?</p>
<h3 id="--instalação-do-google-drive-e-do-dropbox">- Instalação do <a href="https://drive.google.com/">Google Drive</a> e do <a href="https://www.dropbox.com/">Dropbox</a></h3>
<p>Tanto o Google Drive quando o Dropbox possuem aplicativos que quando instalados, permitem a integração deles com o <code class="language-plaintext highlighter-rouge">Finder</code>. Esta integração é interessante pois permite eu acessar (ou armazenar) facilmente os arquivos na nuvem, diretamente do meu desktop.</p>
<h3 id="--instalação-do-parallels-com-windows-11">- Instalação do <a href="https://www.parallels.com/br/">Parallels</a> com Windows 11</h3>
<p>O Parallels não só permite a execução do Windows em uma máquina virtual, mas também permite a integração entre os dois ambientes de uma forma que eu não vi em outros hipervisors.</p>
<p>Você deve estar se perguntando o por quê de ter uma máquina virtual Windows sendo que enauteci tanto o poder do MacOS e sua infinidade de softwares. Bem o fato é que também sou intusiasta de calibração de motores usando injeções programáveis como a <a href="https://fueltech.com.br/">Fueltech</a>. Infelizmente o software para gerenciamento da minha FT450 (<a href="https://fueltech.com.br/pages/software">FTManager</a>)só é disponibilizado para Windows.</p>
<h3 id="--instalação-do-visual-studio-code">- Instalação do <a href="https://code.visualstudio.com/Download">Visual Studio Code</a></h3>
<p>Aqui a coisa começa a ficar já bem mais interessante para desenvolvedores. Se você é um desenvolvedor, nem preciso me extender muito aqui para falar que hoje, o Visual Studio Code é o editor de código preferido da grande maioria de Devs.</p>
<p>Não vou conseguir aqui falar de todos os plugins que utilizo, mas já fica aqui a idéia para um novo post só para falar disto.</p>
<h3 id="--instalação-do-podman">- Instalação do <a href="https://podman-desktop.io/">Podman</a></h3>
<p>Como um desenvolvedor que utiliza, divulga e defende a utilização de cointainers; além de ser usuário do Docker por vários anos, um ambiente que permite a execução de containers localmente, é imprescindível para mim.</p>
<p>Para usuários Mac, o Docker Desktop era uma solução factível (antes eu usava o docker-machine) para criar VMs que permitem a execução de containers Linux. Mas desde que o <a href="https://gago.io/blog/docker-desktop-pago/">Docker Desktop começou a ser pago</a>, e considerando que sou defensor e usuário também de Software Livre, fiquei maravilhado com o <a href="https://podman.io/">Podman</a>, e passei a adota-lo.</p>
<h3 id="--instalação-de-ambiente-java-usando-o-sdkman">- Instalação de ambiente Java usando o <a href="https://sdkman.io/">SDKMan</a></h3>
<p>O SDKMan é uma espécia de gerenciador de Kits de desenvolvimento como o próprio nome diz (Software Development Kit Manager). O legal do SDKMan (especialmente para desenvolvedores Java) é a possibilidade ter ter várias versões diferentes do JDK, Maven, etc e utilizar versões específicas por projetos.</p>
<p>O SDKMan possui várias versões de diversas <a href="https://sdkman.io/jdks">distribuições de JDK</a> (Correto, Oracle, OpenJDK, Zulu, etc). E também possui <a href="https://sdkman.io/sdks">diversas ferramentas</a> (ant, maven, jmeter, visualvm, etc) que podem ser instaladas pelo SDKMan.</p>
<p><em>Geralmente eu instalo</em>: <code class="language-plaintext highlighter-rouge">visualvm, quarkus, springboot, java, e maven</code></p>
<h3 id="--configuração-de-uma-chave-ssh">- Configuração de uma chave SSH</h3>
<p>Por fim, se eu não tiver feito backup das minhas chaves privadas, é a hora de gerar um par de chaves públicas e privadas usando o comando <code class="language-plaintext highlighter-rouge">ssh-keygen</code></p>
<p>Se você não tinha um par de chaves previamente gerados, agora é a hora de fazer o upload da sua chave pública para os sites que a utilizam. Um exemplo é o próprio <a href="https://github.com/settings/keys">Github</a></p>
<h2 id="conclusão">Conclusão</h2>
<p>Esta lista de softwares está longe de atender 100% dos desenvolvedores, mas é a lista do que eu fiz para ter um Macbook funcional para o meu dia-a-dia.</p>
<p>E você? Usa viu algum software que você também usa no seu ambiente? Ou complementaria com algum outro? Deixe seu comentário.</p>
<p>Aproveite, e não deixe de dar uma olhada nas redes sociais:</p>
<p><a href="https://twitter.com/rafabene" itemprop="sameAs" rel="nofollow noopener noreferrer me">
<i class="fab fa-fw fa-twitter-square" aria-hidden="true"></i><span class="label">rafabene</span>
</a></p>
<p><a href="https://instagram.com/rafabene.devx" itemprop="sameAs" rel="nofollow noopener noreferrer me">
<i class="fab fa-fw fa-instagram" aria-hidden="true"></i><span class="label">rafabene.devx</span>
</a></p>
<p>Abraços!</p>Rafael Benevidesrafabene@gmail.comEstes dias resolvi formater meu notebook, um “velho” Macbook Pro 2019, que trouxe de mudança dos EUA. Não vou entrar no mérito do preço proibitivo dos Macbooks no Brasil, mas sem dúvidas alguma, o conjunto Hardware + Sistema Operacaional (MacOS) de um Macbook Pro, é na minha opinião um casamento perfeito para desenvolvedores.I joined Microsoft to fly in the Azure Cloud2022-05-16T00:00:00+00:002022-05-16T00:00:00+00:00http://rafabene.com/2022/05/16/I-joined-microsoft<p>Last week I started a new AMAZING journey that keeps me a passionate professional on technologies, and how they are helping the world to evolve at a fast pace.</p>
<p>Yes. I joined <a href="https://www.microsoft.com/">Microsoft</a> (later I’ll tell you why Microsoft). For now, let me share with you why working in the Azure team makes me really excited!</p>
<p><img src="/assets/images/Microsoft-Azure-Logo.png" alt="" /></p>
<p>Since Cloud computing became a reality, we have seen companies releasing their products faster, and also growing faster because they can scale using someone else’s infrastructure. I still remember when I released my first Android app in 2009, and I didn’t want to have my own infrastructure to host the REST services. Fortunately, Cloud computing saved me, and I was able to keep this app running for almost 6 years until I finally decided to retire it due to my lack of time to maintain and update it to newer Android APIs.</p>
<p><em>A little bit more background</em>: Before becoming a <em>“Software professional”</em>, I was an <em>“infrastructure guy”</em> who helped a lot of companies to create their own infrastructure in the early ages of the internet. I gained my infrastructure skills because I was lucky to work in an Internet provider where I learned about <a href="/about/#the-linux-days">Linux server and services, and TCP/IP networking</a>. But at that time (1996), everything was hard and expensive.</p>
<p>Because I worked in an era where <em>“hard and expensive”</em> was the reality, you can imagine how I became fascinated with the ease of creating your own infrastructure to grow your company in a Cloud environment. Due to Cloud computing, my Android app (which was just a hobby) growed fast. If Cloud computing helped me (an alone developer on a hobby application), I could foresee what would be the impact on thousands of companies around the globe. And that expectation became reality. <strong>“The “cloud” is a vital online technology that is used all over the world.”</strong> . And from 2020, Cloud computing is growing even faster. <strong>“Since the COVID-19 crisis, the cloud computing market has been on a rapid upward trajectory when it comes to cloud adoption, infrastructure, spending and development.”</strong> Check this article for <a href="https://www.cloudwards.net/cloud-computing-statistics/">26 Cloud Computing Statistics, Facts & Trends for 2022</a>.</p>
<p>Later, when I worked at <a href="https://developers.redhat.com/">Red Hat</a>, I was also lucky to give another step in the Cloud computing world: The advent of Linux containers (aka Docker) and how orchestrating them with <a href="https://kubernetes.io/">Kubernetes</a>, and also some other technologies and practices (lightweight <a href="https://spring.io/">Java</a> frameworks, DevOps practices, Microservices architecture, etc) created “the perfect storm” for what we call today <a href="/2020/04/02/starting-cloud-native-applications/">Cloud Native Applications</a>. At the same moment, Red Hat was releasing Openshift 3, totally based on Kubernetes, to be cloud agnostic. It was a moment where <strong>I used professionally the major cloud providers</strong> to make Openshift run on them.</p>
<p>In 2019, <a href="/2019/07/12/I-joined-oracle/">I moved to Oracle</a> to help customers to adopt Oracle’s Cloud Native solutions through (Linux and Java) software products like OCNE, Helidon, Verrazzano, and Weblogic running on Oracle’s Cloud infrastructure (where I got certified as <a href="https://www.credly.com/badges/f56cb9cf-d61e-4567-ad31-6fde39d08403">Infrastructure Developer</a> and <a href="https://www.credly.com/badges/e1e109ff-0d53-4f07-9485-e578673bae3a">Architect Associate</a>). My last blog post at Oracle blogs shows how to do <a href="https://blogs.oracle.com/developers/post/multiclustering-between-oci-and-azure-with-verrazzano">multi-clustering between OCI and Azure</a>.</p>
<p><strong>But let’s talk about Microsoft and Azure! You all might be wondering why and what a Java/Linux guy is doing at Microsoft</strong>.</p>
<p>First of all, I would be <em>frivolous</em> if I say that Microsoft is a “software” company. Microsoft is MUCH MORE than that. Microsoft’s <a href="https://www.microsoft.com/en-us/about">mission</a> is <strong>“…to empower every person and every organization on the planet to achieve more”</strong>. And Microsoft does that by providing solutions for individuals, and companies of all sizes.</p>
<p><img src="/assets/images/microsoft-solution-areas.png" alt="" /></p>
<p>If you are a developer and use <a href="https://github.com/rafabene">Github</a> to host your solution, you are using a Microsoft solution. The same is true if you are using <a href="https://code.visualstudio.com/">VSCode</a> to write your source code.
If you use <a href="https://www.linkedin.com/in/rafabene/">LinkedIn</a> to better position yourself in the job market, you are using a Microsoft solution.</p>
<p>What about Linux and Open Source development? “<a href="https://en.wikipedia.org/wiki/Microsoft_and_open_source#:~:text=Since%202017%2C%20Microsoft%20is%20one,source%20code%20in%20the%20world.">Since 2017, Microsoft is one of the biggest open source contributors in the world, measured by the number of employees actively contributing to open source projects on GitHub, the largest host of source code in the world</a>”. Microsoft has over 15,000 contributors on GitHub and over 6,000 employees contribute to Open Source projects, and have released over 3,000 Open Source projects. Microsoft’s Open Source programs office tracks nearly 10,000 Open Source components.</p>
<p><img src="/assets/images/github-contributions-2017.png" alt="" /></p>
<p>The data from the picture above can be found at <a href="https://datastudio.google.com/u/0/reporting/0ByGAKP3QmCjLU1JzUGtJdTlNOG8/page/Q3DM">The top contributors to GitHub (2017)</a>.</p>
<p>By the way, before I forget, if you are a <a href="https://www.xbox.com">Xbox</a> (another Microsoft product) gamer, you can add my gamer tag <a href="https://live.xbox.com/en-US/Profile?Gamertag=RafaelBenevides">RafaelBenevides</a> so we can play together ;).</p>
<p>In the cloud space, Microsoft <a href="https://azure.microsoft.com/">Azure</a> is one of the top Cloud providers of the world, <a href="https://azure.microsoft.com/en-us/overview/what-is-azure/">having 95% of Fortune 500 companies trusting their business on Azure</a>.</p>
<p>You all know that I’m essentially a Java developer, and <a href="https://azure.microsoft.com/en-us/develop/java/">Java is also a first class citizen on Azure</a>. You will always find people like <a href="https://twitter.com/mkheck/">Mark Heckler</a> and <a href="https://twitter.com/bbenz">Brian Benz</a> in a conference near you talking about Azure. I also suggest you to follow <a href="https://twitter.com/brunoborges">Bruno Borges</a>, <a href="https://twitter.com/reza_rahman">Reza Rahman</a>, <a href="https://twitter.com/RockClimberT">Theresa Nguyen</a>, <a href="https://twitter.com/edburns">Ed Burns</a>, <a href="https://twitter.com/agoncal">Antonio Goncalves</a>, <a href="https://twitter.com/JavaAtMicrosoft">Java at Microsoft</a>, and <a href="aka.ms/azureadvocates">Azure Dev Advocates</a> twitter profiles to know more about it.</p>
<p>Having said that, I’m thrilled to share that I have become part of this <em>“digital transformation”</em> by joining the Azure team as a Cloud Solution Architect focused in <a href="https://azure.microsoft.com/en-us/solutions/application-and-database-modernization/">Application Modernization</a> to help customers to accelerate time to market, deliver innovative experiences, and improve security with Azure application and data modernization.</p>
<p>If you want to check why Azure is so popular, you can start with an Azure free account, 12 months of popular services free, and a $200 credit. Just check the following link: <a href="https://azure.microsoft.com/en-us/free/">Create Your Azure Free Account Today</a>.</p>
<p>And finally, If you want to keep in touch with me, I invite you to follow me on Twitter by clicking on the following button:</p>
<p><a href="https://twitter.com/rafabene?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @rafabene</a><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Let’s chat about Cloud Native applications, DevOps practices, and Cloud computing.</p>
<p>Cya!</p>Rafael Benevidesrafabene@gmail.comLast week I started a new AMAZING journey that keeps me a passionate professional on technologies, and how they are helping the world to evolve at a fast pace.Moved by Java2020-05-26T00:00:00+00:002020-05-26T00:00:00+00:00http://rafabene.com/2020/05/26/moved-by-java<p>On May 23rd 2020, <a href="https://www.oracle.com/java/technologies/">Java</a> completed 25 years as one of the most popular and powerful platforms of all times.</p>
<p>A <a href="https://www.oracle.com/java/moved-by-java/">serie of events</a> is happening throughout this year to celebrate this great milestone. By the way, don’t miss <a href="https://t.co/HtjyIEKrNh?amp=1">the event tomorrow</a> where I and my friends <a href="https://twitter.com/otaviojava">Otávio Santana</a>, <a href="https://twitter.com/kvarel4">Karina Varela</a> and <a href="https://twitter.com/pasimoes">Paulo Simões</a> will be discussing the next 25 years of Java.</p>
<p>Another great way to celebrate this aniversary is having Java developers worldwide sharing their memories using the hashtag <a href="https://twitter.com/hashtag/MovedByJava?src=hashtag_click">#MovedByJava</a>. I even <a href="https://twitter.com/rafabene/status/1263874302262345728">posted mine</a>, just to realise that Twitter’s current limit of 280 characters is not enough for so many memories. Then I decided to write my memories of Java in this blog post. Here they are:</p>
<ul>
<li>2002 - Felt in love with Java 1.3/1.4.</li>
<li>2002 - <a href="https://twitter.com/rafabene/status/785177372496695296">J2EE training</a> with <a href="https://twitter.com/vsenger">Vinicius Senger</a>.</li>
<li>2003 - Got my Java Programmer certification.</li>
<li>2003 - First job as a Java developer.</li>
<li>2005 - Event Café Brazil - Where I watched <a href="https://twitter.com/brjavaman">Bruno Souza</a> and <a href="https://twitter.com/errcraft">James Gosling</a> live.</li>
<li>2005 - First <a href="https://www.slideshare.net/RafaelBenevides1/reunio-soujava-bsb-2005-java-a-favor-do-consumidor-brasileiro">presentation</a> at a <a href="https://soujava.org.br/">SouJava</a> meeting.</li>
<li>2006 - Published my first article in <a href="https://www.devmedia.com.br/revista-java-magazine-edicao-30/8752">Brazilian Java Magazine</a> with <a href="https://www.linkedin.com/in/gabriel-viragine-42469944/?originalSubdomain=br">Gabriel Viragine</a>.</li>
<li>2007 - Started this blog where I wrote (among other topics) <a href="/2008/03/10/java-hoje-e-principalmente-amanha/">about Java</a>.</li>
<li>2007 - Worked at <a href="https://summa.com.br/historia/">Summa</a> that had the best Brazilian Java professionals like <a href="https://twitter.com/mr__m?lang=en">Michael Nascimento</a> (aka Mr. M), <a href="http://claudius.com.br/">Cláudio Miranda</a>, <a href="https://netbeans.org/community/articles/interviews/dreamprofile-silva.html">Edgar Silva</a>, <a href="https://twitter.com/marceloancelmo?lang=en">Marcelo Ancelmo</a>, <a href="https://paulojeronimo.github.io/">Paulo Jerônimo</a>, <a href="https://twitter.com/renatochamber">Renato Câmara</a>, <a href="https://twitter.com/brunoborges">Bruno Borges</a> (aka Miojo), and many others.</li>
<li>2008 - Watched <a href="/2008/08/05/jboss-road-show/">Burr Sutter live in Brasília</a>.</li>
<li>2008 - Released my first opensource Java project: <a href="https://github.com/rafabene/XSeam2">XSeam</a>.</li>
<li>2009 - Joined <a href="https://www.jboss.org/">JBoss/Red Hat</a> to work in the Java Middleware team.</li>
<li>2012 - First lecture at <a href="https://thedevconf.com/tdc/2012/goiania/trilha-ladob-sabado#programacao">TDC</a></li>
<li>2014 - Started to contribute with <a href="http://deltaspike.apache.org/news.html">Apache DetalSpike</a>, a Duke’s choice Award winner.</li>
<li>2015 - Became part of PMC of Apache DetalSpike.</li>
<li>2015 - Moved abroad to work with Java.</li>
<li>2015 - My first time at JavaOne as a speaker and an attendee at the same time</li>
<li>2016 - Started <a href="/talks/#past-conferences">traveling the world</a> to talk at Java conferences.</li>
<li>2019 - Published <a href="/books/2ndmicroservices-book/">my first Java book</a>.</li>
<li>2020 - After joining <a href="http://developers.oracle.com/">Oracle</a> a year ago, I’m back to Brazil, and <a href="https://t.co/HtjyIEKrNh?amp=1">celebrating 25 year of Java</a>.</li>
</ul>
<p>What a journey!!! Yeah. Definitely I am <a href="https://twitter.com/hashtag/MovedByJava?src=hashtag_click">#MovedByJava</a>!</p>
<p><img src="/assets/images/img_0020.jpg" alt="" /></p>Rafael Benevidesrafabene@gmail.comOn May 23rd 2020, Java completed 25 years as one of the most popular and powerful platforms of all times.Oracle Cloud Infrastructure Foundations certified2020-04-23T00:00:00+00:002020-04-23T00:00:00+00:00http://rafabene.com/2020/04/23/oci-foundations-certified<p>Yesterday I had the chance to take the exam <strong>1Z0-1085-20 - Oracle Cloud Infrastructure Foundations 2020 Associate</strong>.</p>
<div data-iframe-width="150" data-iframe-height="270" data-share-badge-id="06a2e71a-4e33-4091-a17e-d2af68935f0c" data-share-badge-host="https://www.youracclaim.com"></div>
<script type="text/javascript" async="" src="//cdn.youracclaim.com/assets/utilities/embed.js"></script>
<p>This exam covers:</p>
<ul>
<li>General cloud concepts</li>
<li>Architecture (regions, availability domains, fault domains, compartments)</li>
<li>Core services (Networking, Compute, Storage, Database, Identity)</li>
<li>Security</li>
<li>Pricing and billing</li>
</ul>
<p>Because it’s a <em>foundation</em> exam, it is helpping me to give the base for other OCI certifications that I’m planning to take (Architect and Developer).</p>
<p>If you want to prepare yourself for this certification, look at the following <a href="https://learn.oracle.com/ols/learning-path/understand-oci-foundations/35644/75258">learning path</a>.</p>
<p>Also, use the opportunity to take this (and other OCI certifications) <a href="https://www.oracle.com/corporate/blog/free-certifications-oracle-oci-autonomous-033020.html">for FREE until May 15th 2020</a>.</p>
<p><strong>My tips for this exam are</strong>: Watch carefully (twice at least) the available training online, and take notes about each slide/topic. Understant the differences for each service offering (what is include and what is not included). Make sure to understand OCI architecture, and how it helps availability and reliability.
SLA is not covered in the online training, so read it in the <a href="https://www.oracle.com/cloud/iaas/sla.html">documentation</a>.</p>
<p>See you!</p>Rafael Benevidesrafabene@gmail.comYesterday I had the chance to take the exam 1Z0-1085-20 - Oracle Cloud Infrastructure Foundations 2020 Associate.Starting with Cloud-Native applications2020-04-02T00:00:00+00:002020-04-02T00:00:00+00:00http://rafabene.com/2020/04/02/starting-cloud-native-applications<p>Four years ago I wrote a <a href="/2015/12/15/docker-learning-path-wildfly/">“Docker learning path”</a> so people could easily learn how to take <a href="https://dictionary.cambridge.org/us/dictionary/english/baby-step">baby steps</a> toward Kubernetes. Essentially the steps are: 1 - learn docker, 2 - learn docker-compose , 3 - learn Docker Swarm <em>(Today I would suggest skipping this step)</em>, and 4 - learn Kubernetes.</p>
<p>While that <a href="(/2015/12/15/docker-learning-path-wildfly/)">post</a> had focused on suggesting a learning path for people to adopt containers, this blog post is focused on suggesting a learning path for developers to produce cloud native applications.</p>
<p>In the last years, backend developers are interested in producing cloud-native applications, but still many of them don’t know where to start. Because I’ve been <a href="/talks/">talking in conferences</a>, <a href="https://www.youtube.com/user/rafabene">recording videos</a>, <a href="https://www.oreilly.com/library/view/microservices-for-java/9781492038290/">writing a book</a> about microservices and cloud-native applications, people come to me asking <strong>“Where should I start?”</strong>. So I decided to write this blog post to help those developers. Here is my suggestion of baby steps, no matter what language you are using.</p>
<h2 id="baby-steps-toward-cloud-native-applications">Baby steps toward Cloud Native applications</h2>
<p>These steps assume two applications (two microservices) that will communicate with each other, and handle the most common scenarios in a cloud native environment. The expected result will be a microservice A calling a microservice B. You’re encouraged to implement the uses cases bellow to gain the expertise needed to create cloud-native applications.</p>
<ul>
<li>
<p>Use your favorite language to create a <strong>microservice B</strong> with some <a href="https://restfulapi.net/">REST endpoints</a> to perform <a href="https://www.codecademy.com/articles/what-is-crud">CRUD operations</a>.</p>
<p>Suggested read: <a href="https://www.codecademy.com/articles/what-is-crud">CRUD and REST</a></p>
</li>
<li>
<p>Document your REST endpoints with <a href="https://swagger.io/docs/specification/about/">OpenAPI or Swagger</a>.</p>
<p>Suggested read for Java Developers: <a href="https://www.phillip-kruger.com/post/microprofile_openapi_swaggerui/">Swagger UI on MicroProfile OpenAPI</a></p>
</li>
<li>
<p>Create a <strong>microservice A</strong> to consume some REST endpoints from the <strong>microservice B</strong> that you’ve created. You can start simple by consuming the GET operation from the <strong>microservice B</strong>.</p>
</li>
<li>
<p>Externalize the configuration of your <strong>microservice A</strong> by allowing an environment variable to inform the URL of the <strong>microservice B</strong>.</p>
<p>Suggested video: <a href="https://www.youtube.com/watch?v=PKAaYyDxJbA">MicroProfile Config API in 5 minutes</a></p>
</li>
<li>
<p>Stop <strong>microservice B</strong> and make <strong>microservice A</strong> fault tolerant with <a href="https://badia-kharroubi.gitbooks.io/microservices-architecture/patterns/communication-patterns/fallback-pattern.html">Fallback</a>.</p>
</li>
<li>
<p>Make <strong>microservice A</strong> take 1 minute to reply and make <strong>microservice B</strong> <a href="https://stackoverflow.com/questions/49704708/what-is-a-connection-timeout-during-a-http-request">timeout</a> within 10 seconds.</p>
</li>
<li>
<p>Make <strong>microservice A</strong> responds randomly with a HTTP error, and makes <strong>microservice B</strong> retries the connection in case of an error. <strong>microservice A</strong> should always get a valid reply or a fallback at this point.</p>
<p>Recommended read for Java developers: <a href="https://quarkus.io/guides/microprofile-fault-tolerance">Quarkus and MicroProfile Fault Tolerance</a></p>
</li>
<li>
<p>Implement a distributed tracing with <a href="https://opentracing.io/">Opentracing</a> between <strong>microservices A and B</strong>. Tip: You will need to forward the HTTP headers from A to B.</p>
<p>Suggested example project: <a href="https://github.com/rafabene/tracing-demo">https://github.com/rafabene/tracing-demo</a></p>
</li>
<li>
<p>Implement Authentication in a REST endpoint of the <strong>microservice B</strong> and make <strong>microservice A</strong> propagate the credentials to <strong>microservice B</strong>. Use <a href="https://jwt.io/">JWT</a> - JSON Web Tokens.</p>
<p>Suggested read to for Java developers: <a href="https://developer.okta.com/blog/2019/07/10/java-microprofile-jwt-auth">Build a REST API Using Java, MicroProfile, and JWT Authentication</a></p>
</li>
</ul>
<h2 id="move-to-the-cloud">Move to the cloud</h2>
<ul>
<li>
<p>Package your <strong>microservices A and B</strong> in a container. Each one on one container. Publish them in a public container registry like <a href="https://hub.docker.com/">Docker hub</a> or <a href="https://quay.io/">Quay.io</a>.</p>
</li>
<li>
<p>Run your <strong>microservices A and B</strong> in a Kubernetes Cluster. For rapid and local startup you can use <a href="https://kubernetes.io/docs/setup/learning-environment/minikube/">minikube</a>. For on-premises production usage, you can rely on <a href="https://docs.oracle.com/en/operating-systems/olcne/">Oracle Linux Cloud Native Environment</a>. If you want to try OLCNE locally, you can use <a href="https://github.com/oracle/vagrant-boxes/tree/master/OLCNE">this Vagrant file</a> for it.</p>
</li>
<li>
<p>Create a CI/CD Pipeline to take your source code to production. There are many solutions in the market. I’ve demoed <a href="https://jenkins.io/">Jenkins</a> and Kubernetes in the video <a href="https://www.youtube.com/watch?v=T2lVK8iU5XU">CI/CD Deployment pipeline using Jenkins on Kubernetes to deploy a Quarkus Cloud-native application</a></p>
</li>
<li>
<p>Implement <a href="https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-setting-up-health-checks-with-readiness-and-liveness-probes">Kubernetes Liveness probe and Readiness probe</a>. The Readiness probe should mark your application as <em>“ready”</em> only when <strong>microservice A</strong> can communicate with <strong>microservice A</strong>.</p>
</li>
<li>
<p>Install a Service Mesh solution like <a href="https://istio.io/">Istio</a> on your Kubernetes Cluster and perform some uses cases like the ones found in this <a href="/istio-tutorial/">Istio tutorial</a></p>
<p>Suggested read to for Portguese readers: <a href="/2020/01/09/10-videos-cloud-native/">10 Vídeos para aprender sobre desenvolvimento Cloud-Native</a></p>
</li>
</ul>
<h2 id="next-steps">Next Steps</h2>
<p>These are my recommendations to learn how to taker your CRUD application to a next level using different cloud native technologies. Of course, sky’s the limit as you can see at <a href="https://landscape.cncf.io/zoom=250">CNCF Cloud Native Interactive Landscape</a>. There are other challenges that might appear and it will cause you to learn patterns like <a href="https://microservices.io/patterns/data/event-driven-architecture.html">“EDA - Event-driven architecture”</a>, <a href="https://microservices.io/patterns/data/cqrs.html">CQRS</a>, <a href="https://microservices.io/patterns/data/saga.html">Sagas</a>, <a href="https://fnproject.io/">Serverless</a>, etc. But I don’t want to scare you. Like every pattern, you will only use any of them when you need it.</p>
<p>Furthermore, if you are a Java developer, please, subscribe to my youtube channel at <a href="https://youtube.com/rafabene">https://youtube.com/rafabene</a>. I’m starting a series of videos about the <a href="https://microprofile.io/">MicroProfile</a> APIs. You can also help me by following me on Twitter (<a href="https://twitter.com/rafabene">@rafabene</a>), and you can also help other developers by sharing this content.</p>
<p>If you want to know more about a specific topic, just drop me a comment below.</p>Rafael Benevidesrafabene@gmail.comFour years ago I wrote a “Docker learning path” so people could easily learn how to take baby steps toward Kubernetes. Essentially the steps are: 1 - learn docker, 2 - learn docker-compose , 3 - learn Docker Swarm (Today I would suggest skipping this step), and 4 - learn Kubernetes.10 Vídeos para aprender sobre desenvolvimento Cloud-Native2020-01-09T00:00:00+00:002020-01-09T00:00:00+00:00http://rafabene.com/2020/01/09/10-videos-cloud-native<p>Olá a todos! Este post é um Português por quê justamente estou focando em produzir conteúdos na nossa língua pátria. Um dos meu objetivos é ajudar você, desenvolvedor de aplicações, a criar aplicações Cloud-Native.</p>
<p>Por minhas “andaças” <a href="/talks/#past-conferences">por ai</a>, trocando idéias com desenvolvedores de vários lugares, encontro desenvolvedores e empresas que sempre me perguntam: “Por quê devo criar aplicações Cloud-Native, e como começar?”</p>
<p>Vou falar rapidamente o porquê você deveria estar produzindo aplicações Cloud-Native. Bem, a única razão é AGILIDADE. Se você precisa estar a frente dos seus concorrentes, lançar novas funcionliadades no decorrer de uma semana (ou quem sabe dias ou horas), poder fazer deploy a qualquer hora do dia, estar preparado para as falhas, escalar facilmente, então você deve sim produzir aplicações preparadas para tais finalidades. Você deveria sim produzir aplicações Cloud-Native.</p>
<p>Entretanto, saiba que mesmo eu advogando em favor de aplicações Cloud-Native, eu não quero te iludir. Aplicações Cloud-Native são mais complexas em vários sentidos. Elas são mais difíceis de desenvolver, testar, implantar, e gerenciar. Ou seja, se você não precisa ser tão ágil. Talvez uma aplicação monolítica que utiliza técnicas como Contêineres, Integração e deploy contínuos (CI/CD), e algumas outras práticas de DevOps, seja mais adequado para a você. Existe até um padrão para isto caso queira saber mais: Trata-se do <a href="https://www.google.com/search?q=majestic+monolith&oq=magestic+monolith">“Majestic Monolith”</a></p>
<p>Agora, se você quiser produzir aplicações Cloud-Native, deixe-me ajuda-lo. Eu considero (e já disse isto no meu post <a href="/2019/03/15/kubernetes-servidor-aplicacao/">“Kubernetes é o novo servidor de aplicações”</a>) que o Kubernetes se tornou o a plataforma “de facto” para aplicaçoes Cloud-Native! Com isto, se você dominar o Kubernetes, você já terá dado um grande passo para implantar e gerenciar as suas aplicações Cloud-Native. Lógico que pelo fato do Kubernetes ser também um “orquestrador” de contêineres, conhecer contêineres Linux (aka Docker) é um requisito.</p>
<p>Uma vez dominado o Kubernetes, é interessante conhecer sobre os conceitos de <em>Microservices</em>, bem como <a href="https://12factor.net/">12-Factor</a> e muito mais. Para ajuda-lo, resolvi, desde o ano passado, a criar uma série de vídeos que cobrem estes assuntos. Esta semana foi lançado o 10º vídeo e abaixo deixo a lista deles para que você ainda consiga acompanhar este jornada.</p>
<ul>
<li><a href="https://youtu.be/N_jfTUXazGU">DevX Time #1: Aprenda Docker em 30 minutos</a></li>
<li><a href="https://youtu.be/hGoT467L9NY">DevX Time #2: Como criar imagens no Docker</a></li>
<li><a href="https://youtu.be/3jXFVz_smUI">DevX Time #3: Java com Banco de dados no Docker</a></li>
<li><a href="https://youtu.be/0xquXwV_BgQ">DevX Time #4: Docker: 10 coisas para se evitar e tamanho das imagens</a></li>
<li><a href="https://youtu.be/ctzmOK7Vqj8">DevX Time #5: Como não FALHAR usando Java no Docker</a></li>
<li><a href="https://youtu.be/ylnotB4DD5Q">DevX Time #6: Aprenda Kubernetes em 30 minutos</a></li>
<li><a href="https://youtu.be/3wMs2TKFULU">DevX Time #7: Expondo serviços no Kubernetes para o mundo externo</a></li>
<li><a href="https://youtu.be/LPdWSwsFrlo">DevX Time #8: Kubernetes Volumes - Não perca dados dentro do cluster</a></li>
<li><a href="https://youtu.be/PkdOQgZr3cw">DevX Time: #9: CI/CD com S2i e rotas no OpenShift/Kubernetes</a></li>
<li><a href="https://youtu.be/DE_uLCxwxfo">DevX Time: #10 12-Factor app - Como ter sucesso nas aplicações cloud-native</a></li>
</ul>
<p>Apesar desta lista de 10 vídeos, os assuntos sequer estão pertos de esgotar. Estou com um enumerado de assuntos surpresas que você só não irá perder se escrever no canal. Sugiro que faça-o agora, é só clicar no link abaixo</p>
<script src="https://apis.google.com/js/platform.js"></script>
<div class="g-ytsubscribe" data-channel="rafabene" data-layout="full" data-count="hidden"></div>
<p>Por fim, deixo alguns vídeos EXTRAS como as seguintes transmissões ao vivo:</p>
<ul>
<li><a href="https://youtu.be/Sp19F0CBTow">DevX Live #2 - Kurso de Kubernetes AO VIVO</a></li>
<li><a href="https://youtu.be/sSXjyn6Tc-c">DevX Live #3 - Introdução a microservices AO VIVO</a></li>
</ul>
<p>Se você tiver algum assunto que te interesse, deixe nos comentários deste post, ou então mande sua mensagem pelo Twitter.</p>
<p><a href="https://twitter.com/rafabene?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @rafabene</a><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Vejo vocês no próximo vídeo, ou em alguma conferência por ai ;) Abraços!</p>Rafael Benevidesrafabene@gmail.comOlá a todos! Este post é um Português por quê justamente estou focando em produzir conteúdos na nossa língua pátria. Um dos meu objetivos é ajudar você, desenvolvedor de aplicações, a criar aplicações Cloud-Native.I have a new home at Oracle2019-07-12T00:00:00+00:002019-07-12T00:00:00+00:00http://rafabene.com/2019/07/12/I-joined-oracle<pre>
A long time ago
in a galaxy far,
far away....
Ops...
10 years ago
in Brasília
Brazil....
</pre>
<p>… I joined <a href="https://www.redhat.com/en">Red Hat (now IBM)</a>.</p>
<p>Yeap! 10 years ago, in this same city of <a href="https://www.google.com/maps/place/Bras%C3%ADlia+-+Brasilia,+Federal+District/">Brasília, at the heart of Brazil</a> I started an era at Red Hat.</p>
<p>The last years were amazing! <a href="/talks/#past-conferences">I visited 17+ countries, spoke at several conferences and developer groups</a>, <a href="https://www.oreilly.com/library/view/microservices-for-java/9781492038290/">published a book</a>, <a href="http://www.youtube.com/rafabene">released a Youtube channel</a>, and made uncountable friends worldwide.</p>
<p class="center"><img src="/assets/images/badges.png" alt="" /></p>
<p />
<p>However, at the end of this decade, I’m changing my home in every possible sense.</p>
<p>First, I moved from <a href="https://www.google.com/maps/place/Orlando-FL">Orlando-FL</a>, where I lived since 2017 (I lived in <a href="https://www.google.com/maps/place/Raleigh-NC">Raleigh-NC</a> since 2015) to live again in Brasília-DF.</p>
<p>Second, today I joined <a href="http://www.oracle.com">Oracle</a> as a Cloud-Native Developer Advocate in LAD (Latin America Division). Here I have the mission to help customers to adopt open-source solutions (Yes!) using Oracle’s Cloud-Native Linux solutions portfolio.</p>
<p>But the end of the last decade doesn’t mean the end of my relationship with Developers and the Development industry. Instead of that, I’ll continue working with Developers that are seeking to produce high-quality Cloud-Native applications. I’ll continue sharing knowledge about open-source technologies and solutions at <a href="/talks/#next">conferences</a>. The Youtube channel <a href="http://youtube.com/rafabene">DevX Time</a> will continue with a serie of videos (in Portuguese) talking about Cloud-Native applications and CNCF projects so don’t forget to subscribe to it.</p>
<div class="g-ytsubscribe" data-channel="rafabene" data-layout="full" data-count="hidden"></div>
<p />
<p>Talking about CNCF (Cloud Native Computing Foundation), subscribe also to <a href="https://www.meetup.com/Cloud-Native-Computing-Talks-Brazil/">Cloud Native Computing Talks Brazil</a> to keep in touch with great content brought to you by amazing speakers.</p>
<p>And finally, If you want to keep in touch with me more frequently, I invite you to follow me on <a href="https://twitter.com/rafabene">Twitter</a> by clicking on the following button:</p>
<p><a href="https://twitter.com/rafabene?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @rafabene</a><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>See you soon on any of these social medias, in a developers event, or even on your site!</p>
<p>Cya!</p>
<script src="https://apis.google.com/js/platform.js"></script>Rafael Benevidesrafabene@gmail.comA long time ago in a galaxy far, far away....10 coisas para se evitar em contêineres docker2019-04-02T00:00:00+00:002019-04-02T00:00:00+00:00http://rafabene.com/2019/04/02/10-coisas-evitar-docker<p>This post was originally posted on <a href="https://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/">Red Hat Developers</a> and this version is a translation to Portuguease.</p>
<p>Então finalmente você se rendeu a utilização de contêineres e descobriu que eles resolvem vários problemas e possui uma série de vantagens:</p>
<p><strong>Primeiro: Contêineres são imutáveis</strong> - O Sistema Operacional, bibliotecas, versões, configurações, pastas, e aplicação são todos empacotados dentro de um contêiner. Você tem a garantia que a mesma imagem que foi testada no ambiente de “QA” irá ser implantada e executada em produção com o mesmo comportamento.</p>
<p><strong>Segundo: Contêineres são leves</strong> - A utilização de memória de um contêiner é pequena. Ao invés de dezenas ou centas de megabytes, o contêiner irá somente alocar memória para o processo principal.</p>
<p><strong>Terceiro: Contêineres são rápidos</strong> - Você pode inicializar um contêiner tão rapidamente como um processo típico do Linux. Ao invés de minutos, você pode inicializar um contêiner em alguns segundos.</p>
<p>Entretanto, muitos usuários ainda tratam contêineres como uma “máquina virtual” e esquecem que contêiner tem uma característica muito importante: <strong>Contêineres são descartáveis</strong>.</p>
<p class="text-center">O grande “mantra” de contêineres é:</p>
<p class="text-center"><strong><em>“Contêineres são efêmeros”</em></strong>.</p>
<p class="text-center"><img src="/assets/images/rh_icon_container_with_app_flat.png" alt="" /></p>
<p>Esta característica força os usuários a terem uma percepção diferente sobre a forma de como eles deveriam utilizar e gerenciar contêineres; e eu vou explicar o que você <strong>NÃO</strong> deve fazer para continuar extraindo os melhores benefícios de um contêiner.</p>
<ul>
<li>
<p>1) <strong>Não armazene dados dentro de um contêiner</strong> - Uma aplicação executando a versão 1.0 deve ser facilmente substituída pela versão 1.1 sem algum impacto or perda de dados. Por este motivo, se você precisar armazenar dados, faça-o em um volume. Neste caso, você também deve ter o cuidado caso mais de um contêiner escreva dados no mesmo volume já que isto poderia corromper os arquivos. Tenha a certeza que suas aplicações foram projetadas para escrever dados um sistema de arquivos compartilhado.</p>
</li>
<li>
<p>2) <strong>Não distribua sua aplicação em duas partes</strong> - Como algumas pessoas enxergam contêineres como “máquinas virtuais”, a maioria deles têm a tendência de pensar que eles deveriam implantar suas aplicações em contêineres que estejam previamente sendo executados. Isto até pode ser verdade durante a fase de desenvolvimento onde você precisa fazer o deploy e o debug dentro do container; mas para um pipeline de continuous delivery (CD) para o “QA” e para a produção, a sua aplicação já deve fazer da imagem. Lembre-se: Contêineres são imutáveis.</p>
</li>
<li>
<p>3) <strong>Não crie imagens grandes</strong> - Uma imagem grande será mais difícil de distribuir. Tenha a certeza que você tem apenas os arquivos e bibliotecas necessárias para executar sua aplicação/processo. Não instale pacotes desnecessários, ou execute “updates” (yum update) que faça o download de vários arquivos uma uma nova camada da imagem.</p>
</li>
<li>
<p>4) <strong>Não use uma imagem com uma única camada</strong> - Para um uso efetivo do sistema de arquivos em camada, sempre crie a sua própria imagem com o Sistema Operacional, outra camada para a definição do usuário, outra camada para instalação do runtime, outra camada para a configuração, e finalmente outra camada para a sua aplicação. Isto fará com que seja mais fácil recriar, gerenciar e distribuir a sua image.</p>
</li>
<li>
<p>5) <strong>Não crie imagens à partir de contêineres em execução</strong> - Em outras palavras, não use “docker commit” para criar uma imagem. Este método de criar imagens não é “reproduzível” e deve ser completamente evitado. Use sempre um arquivo <em>Dockerfile</em> ou qualquer outro método, como o S2I (source-to-image) que é totalmente reproduzível, e você pode ainda acompanhar as mudanças no arquivo <em>Dockerfile</em> se você armazena-lo em um repositório de controle de versões (git).</p>
</li>
<li>
<p>6) <strong>Não use apenas a tag “latest”</strong> - A tag “latest” está para o docker, assim como a versão “SNAPSHOT” está para usuários Maven. O uso de tags é encorajado por causa da natureza do sistema de arquivos em camadas dos contêineres. Você não quer ter surpresas quando você constrói uma imagem, e alguns meses mais tarde você descobre que sua aplicação não consegue executar por quê a imagem “base” (FROM no Dockerfile) foi substituída por uma nova versão que não é compatível, ou por quê a versão “latest” foi obtida do “build cache”. A tag “latest” deve também ser evitada quando for executar contêineres em produção pois isto evitaria saber qual a versão da imagem que está sendo executada.</p>
</li>
<li>
<p>7) <strong>Não execute mais de um único processo em um único contêiner</strong> - Contêineres são perfeitos para executar um único processo (daemon http, servidor de aplicações, banco de dados, fat jars, etc), mas se você tem mais de um único processo, você terá mais problemas em gerência-los, obter os logs, atualiza-los , etc; se estiverem em um único contêiner.</p>
</li>
<li>
<p>8) <strong>Não armazene credenciais na imagem.</strong> - Você não quer informações sensíveis como nome do usuário e senha armazenados dentro da sua imagem. Use variáveis de ambiente ou “secrets” para obter esta informação de fora do contêiner. Para mais detalhes leia o artigo <a href="https://medium.com/lucjuggery/from-env-variables-to-docker-secrets-bc8802cacdfd">From env variables to Docker secrets</a></p>
</li>
<li>
<p>9) <strong>Não execute processos com o usuário root”</strong> - <em>“Por padrão, contêineres docker são executados como root . (…) À medida que o docker amadurece, outras opções de segurança padrão podem se tornar disponíveis. Atualmente, execuções como root é perigoso e pode não estar disponível em todos os ambientes. Suas imagens deve usar a instrução USER para especificar um usuário não root para a execução do contêiner.”</em> (Tirado do <a href="http://www.projectatomic.io/docs/docker-image-author-guidance/">Guidance for Docker Image Authors</a>)</p>
</li>
<li>
<p>10) <strong>Não depende de endereços IP</strong> - Cada contêiner possui seu próprio endereço IP interno e este será alterado a cada execução, ou até mesmo se você reinicilizar o contêiner. Se sua aplicação ou microserviço precisa comunicar com outro contêiner, use varíaveis de ambiente para passar o <strong>nome</strong> do host e <strong>porta</strong> de um contêiner para o outro.</p>
</li>
</ul>
<p>Espero que tenha gostado destas dicas. Aproveito a oportunidade para divulgar o canal que criei chamado <a href="https://www.youtube.com/user/rafabene">“DevX Time”</a>. Este canal foca no desenvolvimento de aplicações cloud-native em Java utilizando contêineres.</p>
<p>Se quiser aprender sobre Docker, não perca o primeiro vídeo da série:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/N_jfTUXazGU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Os demais vídeos da <a href="https://www.youtube.com/watch?v=N_jfTUXazGU&list=PLYGlbS_vYmdYLf-T71JVD-5kDL1onU202">“playlist”</a> aprofundam no assunto. Subscreva no canal para ficar à par dos próximos vídeos que focarão em Kubernetes, práticas DevOps, OpenShift, Microserviços.</p>
<p>Siga-me também no twitter para ficar à par das últimas novidades no mundo Java: <a href="https://twitter.com/rafabene">https://twitter.com/rafabene</a></p>
<p>Um abraço a todos!</p>Rafael Benevidesrafabene@gmail.comThis post was originally posted on Red Hat Developers and this version is a translation to Portuguease.Kubernetes é o novo servidor de aplicações2019-03-15T00:00:00+00:002019-03-15T00:00:00+00:00http://rafabene.com/2019/03/15/kubernetes-servidor-aplicacao<p>This post was originally posted on <a href="https://developers.redhat.com/blog/2018/06/28/why-kubernetes-is-the-new-application-server/">Red Hat Developers</a> and this version is a translation to Portuguease.</p>
<p>Você já se perguntou o por quê estamos fazendo o deploy de aplicações multi-plataforma usando contêineres? É somente uma questão de seguir alguma “modinha”? Neste artigo, eu vou fazer algumas perguntas provocativas para justificar o porque Kubernetes é o novo servidor de aplicações.</p>
<p>Você pode ter notado que a maioria das linguagens são interpretadas e usam “runtimes” para executar o código fonte. Em teoria, a maioria dos códigos Node.js, Python, e Ruby podem ser facilmente portados de uma plataforma (Windows, Mac, Linux) para outra plataforma. Aplicações Java vão ainda mais longe por possuírem sua classe Java transformadas em um bytecode capaz de ser executado em qualquer lugar que tenha uma JVM (Java Virtual Machine).</p>
<p>O ecossistema Java fornece um formato padrão para distribuir todas as classes Java que são parte da mesma aplicação. Você pode empacotar estas classes como um JAR (Java Archive), WAR (Web Archive), e EAR (Enterprise Archive) que contém o frontend, backend, e todas as demais bibliotecas embutidas. Então eu lhe pergunto: Por quê você utiliza contêineres para distribuir sua aplicação Java já que supostamente este deveria ser facilmente portável entre os ambientes?</p>
<p>Responder esta pergunta à partir da perspectiva de um desenvolvedor nem sempre é óbvio. Mas pense por um segundo sobre seu ambiente de desenvolvimento e algumas dos possíveis problemas causados pela diferença com o ambiente de produção:</p>
<ul>
<li>Você usa Mac, Windows, ou Linux? Você já enfrentou problemas relacionados a <code class="language-plaintext highlighter-rouge">\</code> versus <code class="language-plaintext highlighter-rouge">/</code> como separador arquivos?</li>
<li>Qual versão da JDK você usa? Você usa Java 10 no ambiente de desenvolvimento, mas a produção usa a JRE 8? Você já enfrentou algum bug introduzido pelas diferenças da JVM?</li>
<li>Qual versão do servidor de aplicações você usa? O ambiente de produção usa a mesma configuração, patches de segurança, e versão da biblioteca?</li>
<li>Durante o deploy em produção, você já encontrou algum problema com o driver JDBC que você não encontrou no ambiente de desenvolvimento devido a versões diferentes do driver ou do banco de dados?</li>
<li>Você já teve que solicitar ao admin do servidor de aplicações para criar um <code class="language-plaintext highlighter-rouge">datasource</code> ou uma fila JMS e esta foi criada faltando uma letra?</li>
</ul>
<p>Todos os problemas acima são causados por fatores externos a sua aplicação, e uma das grandes vantagens sobre contêineres é que você pode fazer o deploy de tudo (por exemplo, uma distribuição Linux, a JVM, o servidor de aplicações, bibliotecas, arquivos de configuração, e finalmente, sua aplicação) dentro de um contêiner previamente construído. Além do mais, executar um simples contêiner que tem tudo embutido é incrivelmente mais fácil do que levar seu código para a produção e tentar resolver os problemas quando alguma coisa falhar. Uma vez que é fácil executar, também é fácil escalar a mesma imagem do contêiner para múltiplas réplicas.</p>
<h2 id="empoderando-a-sua-aplicação">Empoderando a sua aplicação</h2>
<p>Antes de contêineres se tornarem bastante popular, vários <a href="https://pt.wikipedia.org/wiki/Requisito_n%C3%A3o_funcional">RNF (Requisitos não funcionais)</a> como segurança, isolamento, tolerância a falhas, gerenciamento de configuração, e outros, eram fornecidos pelos servidores de aplicação. Em uma analogia, os servidores de aplicação foram planejados para serem para a aplicação o quê os “CD Players” são para os CDs.</p>
<p>Como desenvolvedor, você seria responsável em seguir um padrão pré-definido e distribuir sua aplicação em um formato específico, enquanto, do outro lado, o servidor de aplicações executaria sua aplicação, dando-a funcionalidades adicionais que variam de acordo com o servidor. Nota: No mundo Java, o padrão para estas funcionalidades fornecidas por um servidor de aplicações foi recentemente movida para a Fundação Eclipse. O trabalho do Eclipse Enterprise for Java (<a href="https://projects.eclipse.org/projects/ee4j">EE4J</a>), resultou no <a href="https://jakarta.ee/">Jakarta EE</a>. (Para mais informações, leia o artigo <a href="https://developers.redhat.com/blog/2018/04/24/jakarta-ee-is-officially-out/">Jakarta EE is officially out</a> ou veja o vídeo do DevNation live: <a href="https://developers.redhat.com/videos/youtube/f2EwhTUmeOI/">Jakarta EE: The Future of Java EE</a> )</p>
<p>Seguindo a mesma analogia do “CD Player”, com a ascensão dos contêineres, a <a href="https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/">imagem do contêiner</a> se tornou o novo formato do “CD”. De fato, a imagem do contêiner não é nada mais que um formato para distribuir seus contêineres. (Se você precisar de um melhor entendimento do que sejam imagens dos contêineres e como elas são distribuídas, veja <a href="https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/">A Practical Introduction to Container Terminology</a>)</p>
<p>Os reais benefícios da utilização de contêineres acontece quando você precisa adicionar funcionalidades “enterprise” na sua aplicação. E a melhor maneira de fornecer estas funcionalidades para uma aplicação “contêinerizada” é através da utilização do Kubernetes como uma plataforma para tais aplicações. Adicionalmente, o Kubernetes fornece uma excelente fundação para outros projetos como o <a href="https://www.openshift.com/">Red Hat OpenShift</a>, <a href="https://istio.io/">Istio</a>, e o <a href="https://openwhisk.apache.org/">Apache OpenWhisk</a> de forma a produzir aplicações robustas e de qualidade.</p>
<p>Vamos explorar nove destas funcionalidades:</p>
<p class="center"><img src="/assets/images/msaproperties.png" alt="" /></p>
<h2 id="1--service-discovery">1 – Service Discovery</h2>
<p><code class="language-plaintext highlighter-rouge">Service discovery</code> é o processo de descobrir como se conectar a um serviço. Para obter muito dos benefícios de aplicações cloud-native e contêineres, você precisa remover a configuração de dentro das imagens do contêiner de maneira que você possa usar a mesma imagem em todos os ambientes. Externalizar a configuração da sua aplicação é um dos princípios chave de uma <a href="https://developers.redhat.com/blog/2017/06/22/12-factors-to-cloud-success/">aplicação 12-factor</a>.
O <code class="language-plaintext highlighter-rouge">Service discovery</code> é uma das formas de obter a informação de configuração o ambiente ao invés de estar “hardcoded” na aplicação. O Kubernetes fornece um mecanismo de <code class="language-plaintext highlighter-rouge">Service Discovery</code> embutido. O Kubernetes também fornece <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/">ConfigMaps</a> e <a href="https://kubernetes.io/docs/concepts/configuration/secret/">Secrets</a> que removem a configuração de dentro da aplicação “contêinerizada”. <code class="language-plaintext highlighter-rouge">Secrets</code> resolve alguns dos desafios de se armazenar credenciais para se conectar a serviços como um banco de dados.</p>
<p>Com o Kubernetes, não existe a necessidade de usar um servidor externo ou um framework. Apesar você poder gerenciar as configurações do ambiente usando os arquivos YAML do Kubernetes, o OpenShift fornece uma GUI em um CLI que facilitam o gerenciamento para times DevOps.</p>
<h2 id="2---basic-invocation">2 - Basic invocation</h2>
<p>Aplicações executando dentro de contêineres podem ser acessados através do <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Ingress</a> - em outras palavras, rotas do “mundo externo” ao serviço que você está expondo. O OpenShift fornece o <a href="https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html">objeto route</a> usando HAProxy, que possui diversas funcionalidades e estratégias de <code class="language-plaintext highlighter-rouge">load-balancing</code>. Você pode usar as funcionalidades de roteamento para fazer <code class="language-plaintext highlighter-rouge">rolling deployments</code>. Isto pode ser usado para o básico de estratégias mais sofisticadas de CI/CD. Veja “6 – Build and Deployment Pipelines” abaixo.</p>
<p>E se você precisar executar um <code class="language-plaintext highlighter-rouge">job</code> como um processo <code class="language-plaintext highlighter-rouge">batch</code>, ou simplesmente utilizar todo o cluster para computar um resultado (como calcular o Pi, por exemplo)? O Kubernetes fornece <a href="https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/">objetos job</a> para este caso de uso. Também existe <a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/">cron jobs</a> para estes <code class="language-plaintext highlighter-rouge">jobs</code> que são baseados em agendamento.</p>
<h2 id="3--elasticity">3 – Elasticity</h2>
<p>Elasticidade no Kubernetes é resolvido através da utilização de <a href="https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/">ReplicaSets</a> (que eram antigamente chamados de Replication Controllers). Assim como a maioria das configurações no Kubernetes, o ReplicaSet é uma maneira de reconciliar um estado desejado: Você diz ao Kubernetes qual o estado desejado que o sistema deve possuir e o Kubernetes descobre como tornar este estado uma realidade. Um ReplicaSet controla o número de réplicas ou o número de cópias que uma aplicação deve possuir a todo momento.</p>
<p>Mas o que acontece quando você constrói um serviço que é mais popular do que você planejou e você precisa de mais poder computacional? Você pode usar o <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#what-is-the-horizontal-pod-autoscaler">Horizontal Pod Autoscaler</a> do Kubernetes que escala o número de <code class="language-plaintext highlighter-rouge">pods</code> baseado na utilização da CPU (ou, com <a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md">métricas customizadas</a>, ou com qualquer outra métrica fornecida pela aplicação).</p>
<h2 id="4--logging">4 – Logging</h2>
<p>Uma vez que seu cluster Kubernetes pode e irá executar diversas réplicas da sua aplicação contêinerizada, é importante que você agregue estes logs de forma que eles sejam visualizadas em um único lugar. Também, de forma a utilizar os benefícios de autoscaling (ou qualquer outra funcionalidade cloud-native), seus contêineres precisam ser imutáveis. Para isto, você precisa armazenar seus <code class="language-plaintext highlighter-rouge">logs</code> fora do contêiner, para que sejam persistente através de múltiplas execuções. O OpenShift permite você fazer deploy da <code class="language-plaintext highlighter-rouge">stack EFK</code> para agregar os <code class="language-plaintext highlighter-rouge">logs</code> dos hosts e das aplicações, não importando se os <code class="language-plaintext highlighter-rouge">logs</code> venham de múltiplos contêineres ou até mesmo de <code class="language-plaintext highlighter-rouge">pods</code> deletados.</p>
<p>A <code class="language-plaintext highlighter-rouge">stack EFK</code> é composta de:</p>
<ul>
<li><a href="https://www.elastic.co/products/elasticsearch">Elasticsearch</a> (ES), um objeto para armazenar todos os <code class="language-plaintext highlighter-rouge">logs</code>.</li>
<li><a href="https://www.fluentd.org/architecture">Fluentd</a>, que coleta os <code class="language-plaintext highlighter-rouge">logs</code> e alimenta-os no Elasticsearch.</li>
<li><a href="https://www.elastic.co/guide/en/kibana/current/introduction.html">Kibana</a>, uma console web para o Elasticsearch.</li>
</ul>
<h2 id="5--monitoring">5 – Monitoring</h2>
<p>Apesar de parecer que <code class="language-plaintext highlighter-rouge">logging</code> e <code class="language-plaintext highlighter-rouge">monitoring</code> solucionam o mesmo problema, eles são diferentes um do outro. <code class="language-plaintext highlighter-rouge">Monitoring</code> é a observação, e algumas vezes alerta, bem como o registro de informações. <code class="language-plaintext highlighter-rouge">Logging</code> é apenas o registro de informações</p>
<p>O <a href="https://prometheus.io/">Prometheus</a> é um projeto open-source de monitoramento que pode ser usado para armazenar e consultar métricas, alertas e visualizações de sua aplicação. O Prometheus é talvez uma das escolhas mais populares de monitoramento de clusters Kubernetes. No <a href="https://developers.redhat.com/blog/">blog do Red Hat Developers</a>, existem diversos artigos cobrindo monitoramento usando o <a href="https://developers.redhat.com/blog/tag/prometheus/">Prometheus</a>. Você também pode achar artigos sobre o Prometheus no <a href="https://blog.openshift.com/tag/prometheus/">blog do OpenShift</a>.</p>
<p>Você também pode ver o Prometheus em ação junto com o Istio em <a href="https://learn.openshift.com/servicemesh/3-monitoring-tracing">https://learn.openshift.com/servicemesh/3-monitoring-tracing</a>.</p>
<h2 id="6--build-and-deployment-pipelines">6- Build and Deployment Pipelines</h2>
<p>Pipelines de CI/CD (Continuous Integration/Continuous Delivery) não são estritamente um requisito obrigatório para suas aplicações. De qualquer maneira, CI/CD são frequentemente citados como pilares de sucesso do desenvolvimento de software e práticas <a href="https://devops.com/optimizing-effective-cicd-pipeline/">DevOps</a>. Nenhum software deveria ser implantado em produção sem um pipeline CI/CD. O livro <a href="https://www.amazon.com/dp/0321601912?tag=contindelive-20">Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation, do Jez Humble and David Farley</a>, diz sobre CD: “Continuous Delivery é a habilidade de pegar as mudanças de todos os tipos, incluindo novas funcionalidades, mudanças de configuração, bug fixes, e experimentos, e leva-las à produção, ou até a mão dos usuários, de forma segura, rápida e de sustentável”.</p>
<p>O OpenShift fornece pipelines CI/CD embutidos como uma <a href="https://docs.openshift.com/container-platform/3.11/dev_guide/builds/build_strategies.html#pipeline-strategy-options">“estratégia de build”</a>. Veja <a href="https://www.youtube.com/watch?v=N8R3-eNVoEc">este vídeo em inglês</a> que eu graver há dois anos atrás, no qual um exemplo de pipeline CI/CD usando Jenkins faz o deploy de um novo microserviço.</p>
<h2 id="7--resilience">7 – Resilience</h2>
<p>Enquanto o Kubernetes fornece várias opções de resiliência para o <a href="https://docs.openshift.com/container-platform/3.11/admin_guide/high_availability.html">cluster propriamente dito</a>, ele também pode ajudar a sua aplicação a ser resiliente através de <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/">PersistentVolumes</a> que suportam volumes replicados. Os <a href="https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/">ReplicationControllers</a>/deployments do Kubernetes garantem que um número específico de replicas do pod estejam consitentemente executando no cluster, que automaticamente trata qualquer possível falha em um <a href="https://kubernetes.io/docs/concepts/architecture/nodes/#what-is-a-node">nó</a>.</p>
<p>Junto com resiliência, a tolerância a falha funciona como um meio efetivo de endereçar os problemas de confiabilidade e disponibilidade da aplicação. Tolerância a falhas também pode ser fornecida para a aplicação executando no Kubernetes, pelo do <a href="https://istio.io/">Istio</a> através das regras de <code class="language-plaintext highlighter-rouge">retry</code>, <code class="language-plaintext highlighter-rouge">circuit breakers</code> e <code class="language-plaintext highlighter-rouge">pool ejection</code>. Você quer ver por você mesmo? Experimente o tutorial de <code class="language-plaintext highlighter-rouge">Circuit Breaker</code> em <a href="https://learn.openshift.com/servicemesh/7-circuit-breaker">https://learn.openshift.com/servicemesh/7-circuit-breaker</a>.</p>
<h2 id="8--authentication">8 – Authentication</h2>
<p>A autenticação no Kubernetes também pode ser fornecida pelo Istio através do <code class="language-plaintext highlighter-rouge">mutual TLS authentication</code>, que visa aumentar a segurança dos microserviços e de sua comunicação sem que haja qualquer mudança no código. O Istio é responsável por:</p>
<ul>
<li>Fornecer uma identidade para serviço de forma que possa representar seu papel de forma inter-operável entre clusters e a núvem.</li>
<li>Fazer a segurança à comunicação serviço-a-serviço.</li>
<li>Fornecer um gerencimento de chaves (keystore) para automatizar a geração de certificados digitais, distribuição, rotação e revogação.</li>
</ul>
<p>Adicionalmente, vale a pena mencionar que você também pode executar o <a href="https://www.keycloak.org/">Keycloak</a> dentro do cluster Kubernetes/OpenShift para fornecer autenticação e autorização. O Keycloack é o projeto upstream para o Red Hat Single Sign-on. Para mais informações, leia <a href="https://developers.redhat.com/blog/2018/03/19/sso-made-easy-keycloak-rhsso/">Single-Sign On Made Easy with Keycloak</a>. Se você está usando o Spring Boot, assista ao vídeo do DevNation:
<a href="https://developers.redhat.com/videos/youtube/Bdg_DjuoX0A/">Secure Spring Boot microserviços with Keycloak</a> ou leia <a href="https://developers.redhat.com/blog/tag/keycloak/">artigos do Keycloack</a>.</p>
<h2 id="9--tracing">9 – Tracing</h2>
<p>Aplicações que usam o Istio podem ser configuradas para coletar <code class="language-plaintext highlighter-rouge">trace spans</code> usando o <a href="https://zipkin.io/">Zipkin</a> ou o <a href="https://www.jaegertracing.io/docs/">Jaeger</a>. Independente da linguagem, framework, ou plataforma que você usa para construir a sua aplicação, o Istio pode habilitar o tracing distribuido. Veja em <a href="https://learn.openshift.com/servicemesh/3-monitoring-tracing">https://learn.openshift.com/servicemesh/3-monitoring-tracing</a>. Também veja <a href="https://developers.redhat.com/blog/2018/05/08/getting-started-with-istio-and-jaeger-on-your-laptop/">Getting Started with Istio and Jaeger on your laptop</a> e o vídeo recente do DevNation: <a href="https://developers.redhat.com/blog/2018/06/20/next-devnation-live-advanced-microserviços-tracing-with-jaeger-june-21st-12pm-edt/">Advanced microserviços tracing with Jaeger</a>.</p>
<h2 id="os-servidores-de-aplicação-estão-mortos">Os servidores de aplicação estão mortos?</h2>
<p>Vendo estas funcionalidades, você pode facilmente perceber como o Kubernetes + OpenShift + Istio podem realmente empoderar sua aplicação e fornecer funcionalidades que costumavam ser de responsabilidade do servidor de aplicações ou de um framework como o <a href="https://netflix.github.io/">Netflix OSS</a>. Isto significa que os servidores de aplicação estão mortos?</p>
<p>Neste novo mundo de aplicações conteinerizadas, os servidores de aplicação estão mudando para se tornar mais como frameworks. É natural que a evolução do desenvolvimento de software tenha causado também a evolução dos servidores de aplicação. Um grande exemplo desta evolução é a especificação <a href="https://microprofile.io/">Eclipse Microprofile</a> que tem o <a href="https://thorntail.io/">Thorntail</a> como servidor de aplicações, que fornece ao desenvolvedor funcionalidades como tolerância a falhas, configuração, <code class="language-plaintext highlighter-rouge">tracing</code>, REST (cliente e servidor), e assim por diante. De qualquer maneira, o Thorntail e a especificação Microprofile foram desenhados para serem bem leves. O Thorntail não possui a vasta gama de componentes requeridos por um servidor de aplicações Java completo. Ao invés disto, ele foca apenas em microserviços e no mínimo necessário de um servidor de aplicações para construir e executar suas aplicações como um aquivo .jar. Você pode ler mais sobre o Microprofile no <a href="https://developers.redhat.com/blog/tag/microprofile/">blog do Red Hat Developers</a> (em inglês).</p>
<p>Além do mais, aplicações Java podem ser funcionalidades como uma <code class="language-plaintext highlighter-rouge">engine</code> de Servlets, <code class="language-plaintext highlighter-rouge">pool</code> de conexões, injeção de dependências, transações, mensageria e assim por diante. Claro, frameworks podem fornecer estas funcionalidades, mas um servidor de aplicações também possui tudo que você precisa para construir, executar, implantar e gerenciar aplicações <code class="language-plaintext highlighter-rouge">enterprise</code> em qualquer ambiente indenpendente de estarem ou não dentro de um contêiner. De fato, servidores de aplicação podem ser executados em qualquer lugar, por exemplo, em <code class="language-plaintext highlighter-rouge">bare metal</code>, em plataformas de virtualização como o <a href="https://www.redhat.com/en/technologies/virtualization/enterprise-virtualization">Red Hat Virtualization</a>, em núvem privada como o <a href="https://www.openstack.org/">Red Hat OpenStack Platform</a>, e também em núvem pública como o <a href="https://azure.microsoft.com/">Microsoft Azure</a> ou <a href="https://aws.amazon.com/">Amazon Web Services</a>.</p>
<p>Um bom servidor de aplicação garante a consistência entre as APIs que ele fornece e suas implementações. Desenvolvedores podem ter a certeza que fazendo o deploy de sua lógica de negócio, que requer certas funcionalidades, irá sempre funcionar por quê os desenvolvedores destes servidores (e seus padrões) garantem que estes componentes funcionam e evoluam juntos. Além do mais, um bom servidor de aplicação também é responsável por maximizar o <code class="language-plaintext highlighter-rouge">throughput</code> e a escalabilidade, uma vez que é responsável por gerenciar todas as requisições dos usuários. Ter uma latência reduzida e melhorando o tempo inicial de resposta, ajuda no <a href="https://12factor.net/disposability">provisionamento</a> da aplicação. Ser leve, com um uso reduzido de memória minimiza o consumo de hardware. E finalmente, ser seguro o suficiente para evitar qualquer brecha de segurança. Para desenvolvedores Java, a Red Hat fornece o <a href="https://www.redhat.com/en/technologies/jboss-middleware/application-platform">Red Hat JBoss Enterprise Application Platform</a>, que preenche todos os requisitos de um servidor de aplicações moderno e modular.</p>
<h2 id="conclusão">Conclusão</h2>
<p>As imagens do contêiner se tornaram o formato padrão para distribuir e empacotar aplicações cloud-native. Enquanto contêineres por si não fornecem nenhuma vantagem real para o negócio propriamente dito, o Kubernetes e seus projetos relacionados como o OpenShift e o Istio, fornecem os requisitos não funcionais que, até então, eram parte de um servidor de aplicações.</p>
<p>A maioria destes requisitos não funcionais que os desenvolvedores tinham o costume de usar em um servidor de aplicações ou de uma biblioteca como o <a href="https://netflix.github.io/">Netflix OSS</a> eram presas a um única linguagem como o Java. De outro lado, quando desenvolvedores escolhem usar estes requisitos não funcionais utilizando Kubernetes + OpenShift + Istio, eles não ficam presos a nenhuma linguagem específica, o que lhes permite usar a melhor tecnologia/linguagem para cada caso de uso.</p>
<p>Finalmente, servidores de aplicação ainda possuem seu lugar no desenvolvimento de software. De qualquer forma, estes tem se tornado mais como frameworks de uma linguagem específica, fornecendo um atalho para o desenvolvimento de aplicações uma vez que contém várias funcionalidades prontas e testadas.</p>
<p>Uma das melhores coisas a respeito da utilização de contêineres, Kubernetes e microserviços é que você não precisa escolher um único servidor de aplicações, framework, arquitetura, ou até mesmo linguagem para a sua aplicação. Você pode facilmente fazer o deploy de um contêiner com o o JBoss EAP executando sua aplicação Java EE junto com outros contêineres que utilizem novos microserviços usando Thorntail, ou o Eclipse Vert.x para programação reativa. Estes contêineres podem ser gerenciados pelo Kubernetes. Para ver este conceito em ação, dê uma olhada no <a href="https://developers.redhat.com/products/rhoar/overview/">Red Hat OpenShift Application Runtimes</a>. Use o serviço de <a href="https://developers.redhat.com/launch/">Launch</a> para construir de fazer o deploy de uma aplicação de exemplo usando o Thorntail, Vert.x, Spring Boot, ou Node.js.</p>
<p>Você pode dizer que <a href="https://www.linkedin.com/pulse/openshift-new-enterprise-linux-daniel-riek/">Kubernetes/OpenShift é o novo Linux</a> ou até mesmo que o “Kubernetes é o novo servidor de aplicações”. Mas o fato é que um servidor de aplicações + OpenShift/Kubernetes + Istio se tornou o a plataforma “de facto” para aplicaçoes cloud-native!</p>Rafael Benevidesrafabene@gmail.comThis post was originally posted on Red Hat Developers and this version is a translation to Portuguease.