Category Archives: DevOps

TestNG

A Comprehensive Guide to TestNG: Mastering Test Automation in Java

In the world of software testing and automation, TestNG has emerged as one of the most powerful and widely adopted testing frameworks for Java. Its versatility, rich features, and simplicity make it a go-to tool for developers and QA engineers alike. Whether you’re just starting out with automated testing or looking to optimize your current workflow, this in-depth post will help you master TestNG and use it effectively in your projects.


What is TestNG?

TestNG (Test Next Generation) is a popular Java testing framework inspired by JUnit but with enhanced functionalities. It was designed to address the shortcomings of older testing frameworks by providing additional features, such as:

  • Test annotations for more flexibility
  • Dependency testing
  • Test grouping
  • Parallel test execution
  • Parameterization of tests

TestNG is well-suited for unit testing, integration testing, functional testing, end-to-end testing, and even large-scale test automation suites.


Why Choose TestNG?

1. Rich Feature Set

TestNG offers a wide range of features, including:

  • Flexible test configuration
  • Annotations to manage tests easily
  • Ability to create test dependencies and priorities
  • Support for data-driven testing with parameters and data providers
  • Parallel execution of tests for improved performance

2. Customizable Reporting

With TestNG, you get built-in test execution reports that can be further customized to fit your needs. Integration with tools like ReportNG or ExtentReports takes reporting to the next level.

3. Scalability

TestNG’s ability to run tests in parallel and its suite-based execution model make it ideal for large-scale testing projects.

4. Integration Support

TestNG works seamlessly with:

  • Build tools like Maven and Gradle
  • CI/CD tools like Jenkins
  • Selenium WebDriver for web automation

Getting Started with TestNG

To begin using TestNG, you need to set up your project with the necessary dependencies and configurations.

Step 1: Add TestNG to Your Project

If you’re using Maven, add the following dependency to your pom.xml file:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.8.0</version> <!-- Use the latest version -->
    <scope>test</scope>
</dependency>

For Gradle, add the dependency in your build.gradle file:

testImplementation 'org.testng:testng:7.8.0'

Step 2: Create Your First TestNG Test

Here is a simple example of a TestNG test class:

import org.testng.annotations.Test;
import org.testng.Assert;

public class ExampleTest {
    
    @Test
    public void testAddition() {
        int result = 5 + 3;
        Assert.assertEquals(result, 8, "Addition result is incorrect");
    }
    
    @Test
    public void testSubtraction() {
        int result = 10 - 5;
        Assert.assertEquals(result, 5, "Subtraction result is incorrect");
    }
}

Step 3: Run the Tests

You can execute your TestNG tests using your IDE (Eclipse, IntelliJ, etc.) or build tools like Maven. TestNG generates a detailed HTML report after the execution.

To run the tests via Maven, use:

mvn test

Key TestNG Annotations

Annotations are the backbone of TestNG. They help manage the lifecycle and execution flow of tests. Below are the most commonly used annotations:

Annotation Description
@Test Marks a method as a test case.
@BeforeMethod Executes before each test method.
@AfterMethod Executes after each test method.
@BeforeClass Executes once before all test methods in a class.
@AfterClass Executes once after all test methods in a class.
@BeforeSuite Executes before the entire test suite runs.
@AfterSuite Executes after the entire test suite completes.
@DataProvider Supplies test data for data-driven testing.
@Parameters Passes parameters to test methods.

Example of @BeforeMethod and @AfterMethod

import org.testng.annotations.*;

public class TestLifecycle {

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("Executing Before Method");
    }

    @Test
    public void testExample() {
        System.out.println("Executing Test Method");
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("Executing After Method");
    }
}

Output:

Executing Before Method
Executing Test Method
Executing After Method

Advanced Features in TestNG

1. Test Prioritization

TestNG allows you to prioritize test methods using the priority attribute in the @Test annotation.

@Test(priority = 1)
public void testLogin() {
    System.out.println("Login Test");
}

@Test(priority = 2)
public void testDashboard() {
    System.out.println("Dashboard Test");
}

2. Data-Driven Testing with @DataProvider

@Test(dataProvider = "loginData")
public void testLogin(String username, String password) {
    System.out.println("Username: " + username + ", Password: " + password);
}

@DataProvider(name = "loginData")
public Object[][] getData() {
    return new Object[][] {
        {"user1", "pass1"},
        {"user2", "pass2"}
    };
}

3. Parallel Execution

Parallel execution improves performance by running tests concurrently. Use the parallel attribute in the TestNG XML configuration file:

<suite name="ParallelSuite" parallel="methods" thread-count="2">
    <test name="Test1">
        <classes>
            <class name="com.example.ParallelTests"/>
        </classes>
    </test>
</suite>

Integrating TestNG with Selenium

TestNG integrates seamlessly with Selenium WebDriver for web automation testing. Here’s an example of running a Selenium test using TestNG:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class SeleniumTest {
    
    @Test
    public void openGoogle() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.google.com");
        System.out.println("Title: " + driver.getTitle());
        driver.quit();
    }
}

Conclusion

TestNG is a powerful and versatile testing framework that simplifies the testing process for Java applications. With its advanced features, annotations, and integration capabilities, it caters to the needs of both small projects and large-scale enterprise solutions. By leveraging TestNG’s full potential, you can write cleaner, more efficient, and maintainable test code.

Estruturas de Dados em Java

Introdução

Neste post, abordaremos as principais classes de mapas disponíveis na linguagem Java, detalhando suas características, vantagens e desvantagens, performance e melhores práticas. As classes discutidas incluem HashMapTreeMapLinkedHashMapHashtableConcurrentHashMap e EnumMap.

1. HashMap

Características

  • Armazena pares de chave-valor.
  • Permite chaves e valores nulos.
  • Não garante a ordem dos elementos.
  • Implementa a interface Map.

Vantagens

  • Desempenho: Operações de inserção, busca e remoção têm complexidade média O(1) devido ao uso de uma tabela hash.
  • Flexibilidade: Aceita qualquer tipo de objeto como chave, desde que implementem hashCode() corretamente

Desvantagens

  • Não sincronizado: Não é seguro para uso em ambientes multithreaded sem sincronização adicional
  • Colisões: O desempenho pode ser afetado por colisões se a função hash não for bem projetada

Performance

  • A capacidade inicial padrão é 16, com um fator de carga padrão de 0.75. Isso significa que o HashMap será redimensionado quando atingir 75% de sua capacidade

Melhores Práticas

  • Defina um tamanho inicial adequado para evitar redimensionamentos frequentes.
  • Utilize uma boa função hash para minimizar colisões.
  • Considere o uso de Collections.synchronizedMap() ou ConcurrentHashMap em ambientes multithreaded.

2. TreeMap

Características

  • Armazena pares de chave-valor.
  • Mantém a ordem dos elementos com base na ordem natural das chaves ou em um comparador fornecido.
  • Implementa a interface NavigableMap.

Vantagens

  • Ordenação: Mantém os elementos ordenados, permitindo operações como firstKey()lastKey(), etc.

Desvantagens

  • Desempenho: As operações têm complexidade O(log⁡n), o que é mais lento que o HashMap para inserções e buscas

Performance

  • Ideal para cenários onde a ordenação dos elementos é necessária.

Melhores Práticas

  • Use TreeMap quando a ordem dos elementos for importante.

3. LinkedHashMap

Características

  • Combina as funcionalidades do HashMap com a manutenção da ordem de inserção.

Vantagens

  • Manutenção da Ordem: Os elementos são iterados na ordem em que foram inseridos, o que pode ser útil em várias aplicações

Desvantagens

  • Desempenho: Um pouco mais lento que o HashMap devido à manutenção da lista duplamente ligada

Performance

  • A complexidade das operações é semelhante ao HashMap, mas com um custo adicional para manter a ordem.

Melhores Práticas

  • Use LinkedHashMap quando precisar de acesso rápido e também desejar manter a ordem de inserção.

4. Hashtable

Características

  • Semelhante ao HashMap, mas é sincronizado e não permite chaves ou valores nulos.

Vantagens

  • Sincronização: Seguro para uso em ambientes multithreaded sem necessidade de sincronização adicional

Desvantagens

  • Desempenho: Geralmente mais lento que o HashMap devido à sobrecarga da sincronização

Performance

  • As operações têm complexidade média O(1), mas a sincronização pode impactar negativamente o desempenho.

Melhores Práticas

  • Utilize Hashtable apenas quando precisar de uma implementação sincronizada e não puder usar ConcurrentHashMap.

5. ConcurrentHashMap

Características

  • Uma versão do HashMap que é segura para uso em ambientes multithreaded.

Vantagens

  • Desempenho em Concorrência: Permite múltiplas operações simultâneas sem bloquear toda a estrutura

Desvantagens

  • Complexidade: A estrutura interna é mais complexa do que um HashMap simples, o que pode aumentar a sobrecarga em algumas situações.

Performance

  • Oferece uma boa performance para operações em ambientes concorrentes, com complexidade média O(1) para operações básicas.

Melhores Práticas

  • Use ConcurrentHashMap quando precisar de uma estrutura segura para acesso concorrente.

6. EnumMap

Características

  • Um mapa cujas chaves são enumeradas (enum).

Vantagens

  • Eficiência: Mais eficiente do que outras implementações de Map quando as chaves são enums, pois utiliza arrays internamente

Desvantagens

  • Limitação: Só pode ser usado com chaves do tipo enum.

Performance

  • Oferece desempenho superior devido à sua implementação baseada em arrays.

Melhores Práticas

  • Utilize EnumMap sempre que suas chaves forem enums para obter melhor desempenho e eficiência.

Conclusão

As diferentes implementações da interface Map em Java oferecem flexibilidade e eficiência na manipulação de dados. A escolha entre elas deve ser baseada nas necessidades específicas da aplicação, considerando fatores como desempenho, segurança em ambientes multithreaded e requisitos de ordenação. Ao seguir as melhores práticas discutidas neste eBook, você poderá otimizar o uso dessas estruturas em seus projetos Java.

Padrões GoF

Padrões de Design do GoF

Categorias Principais

  1. Padrões Criacionais: Focam na criação de objetos
    • Singleton: Garante uma única instância de uma classe
    • Factory Method: Cria objetos sem especificar a classe exata
    • Abstract Factory: Cria famílias de objetos relacionados
    • Builder: Constrói objetos complexos passo a passo
    • Prototype: Cria novos objetos clonando existentes
  2. Padrões Estruturais: Lidam com composição de classes e objetos
    • Adapter: Converte interface de uma classe em outra esperada
    • Bridge: Separa uma abstração de sua implementação
    • Composite: Compõe objetos em estruturas de árvore
    • Decorator: Adiciona responsabilidades a objetos dinamicamente
    • Facade: Fornece interface simplificada para um subsistema
    • Flyweight: Compartilha objetos para economizar memória
    • Proxy: Fornece um substituto para outro objeto
  3. Padrões Comportamentais: Descrevem comunicação entre objetos
    • Chain of Responsibility: Passa uma solicitação ao longo de uma cadeia de handlers
    • Command: Transforma uma solicitação em um objeto independente
    • Interpreter: Implementa uma linguagem especializada
    • Iterator: Acessa elementos de uma coleção sequencialmente
    • Mediator: Reduz dependências diretas entre objetos
    • Memento: Captura e restaura o estado interno de um objeto
    • Observer: Define uma dependência um-para-muitos entre objetos
    • State: Permite que um objeto altere seu comportamento
    • Strategy: Define uma família de algoritmos intercambiáveis
    • Template Method: Define o esqueleto de um algoritmo
    • Visitor: Separa um algoritmo de uma estrutura de objetos

Referência

Livro: “Design Patterns: Elements of Reusable Object-Oriented Software” Autores: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides Publicado em 1994

Princípio Fundamental

Os padrões de design visam tornar o código mais flexível, reutilizável e manutenível, resolvendo problemas recorrentes no desenvolvimento de software orientado a objetos.

Plano Treinamento – Software Developer

Plano de Treinamento em Desenvolvimento de Software

Módulo 1: Princípios SOLID

  • Conteúdo: Estudo dos cinco princípios SOLID:
    • Single Responsibility Principle
    • Open-Closed Principle
    • Liskov Substitution Principle
    • Interface Segregation Principle
    • Dependency Inversion Principle
  • Livros:
  • Recursos:
    • Artigos e tutoriais sobre SOLID.

Módulo 2: Clean Code

Módulo 3: Separation of Concerns (SoC)

Módulo 4: Test-Driven Development (TDD)

Módulo 5: Design Patterns

Módulo 6: Refactoring

Módulo 7: DevOps e CI/CD

Módulo 8: Estratégias de Deployment

  • Conteúdo: Shadow, Canary, Rolling Update, Blue Green.
  • Recursos:
    • Artigos e estudos de caso sobre estratégias de deployment.

Módulo 9: Provas de Conceito (POCs) e Spikes

  • Conteúdo: Desenvolvimento de POCs para validação de tecnologias.
  • Recursos:
    • Workshops práticos.

Módulo 10: Transaction Stream / Data Stream

Módulo 11: OpenShift e AWS

Módulo 12: Segurança e Padrões de Logs

Módulo 13: Automação e RPA

  • Conteúdo: Criação de automações e pipelines.
  • Recursos:

Módulo 14: Arquitetura Avançada

  • Conteúdo: Micro serviços, DDD, Arquitetura Hexagonal, CQRS.
  • Livros:
  • Recursos:
    • Estudos de caso sobre arquiteturas modernas.

Módulo 15: Integração de APIs

Conclusão

Este plano de treinamento é uma base sólida para desenvolver as habilidades necessárias em desenvolvimento de software moderno. É importante adaptar o conteúdo e a abordagem de acordo com as necessidades específicas do grupo ou indivíduo em treinamento. Além disso, a prática contínua e a participação em projetos reais são essenciais para consolidar o aprendizado.

Clean Code

Escrever código limpo e sustentável é um dos objetivos fundamentais dos engenheiros de software. A longo prazo, código limpo pode economizar tempo e dinheiro, pois é mais simples de compreender, alterar e estender. Veremos algumas recomendações para escrever código limpo neste artigo.

  1. Use nomes descritivos:  Escolha nomes descritivos para suas variáveis, funções e classes. Isso torna mais fácil entender o propósito e o uso de cada componente.
  2. Escreva código legível:  Certifique-se de que seu código seja fácil de ler e entender. Use formatação consistente, recuo adequado e comentários quando necessário. Considere a legibilidade ao escolher seus nomes de variáveis ​​e assinaturas de métodos.
  3. Minimize a complexidade:  Mantenha seu código o mais simples possível. Use o algoritmo e a estrutura de dados mais simples possíveis para resolver o problema. Evite engenharia excessiva e otimização prematura.
  4. Evite duplicação de código:  Não se repita (DRY). Se você se pegar copiando e colando código, considere refatorá-lo em uma função ou classe reutilizável.
  5. Escreva código modular:  divida seu código em módulos pequenos e reutilizáveis ​​que podem ser facilmente testados e mantidos. Use interfaces e abstração para tornar seu código mais flexível e extensível.
  6. Use comentários significativos:  Use comentários para explicar seções complexas ou confusas do código. Evite comentários desnecessários que simplesmente reafirmam o que o código está fazendo.
  7. Escreva testes automatizados:  Testes automatizados ajudam a garantir que seu código esteja correto e seja sustentável. Escreva testes para cada módulo e função, e execute-os regularmente como parte do seu processo de desenvolvimento.
  8. Use controle de versão:  O controle de versão ajuda você a manter o controle das alterações no seu código e colaborar com outros. Use um sistema de controle de versão como o Git e faça commit das suas alterações regularmente.
  9. Refatorar continuamente : Refatorar é o processo de melhorar a qualidade e a manutenibilidade do seu código sem alterar seu comportamento. Refatorar continuamente seu código para melhorar sua legibilidade, manutenibilidade e desempenho.
  10. Siga os padrões de codificação:  Use padrões de codificação e guias de estilo para garantir consistência e legibilidade. Considere adotar um padrão de codificação como o guia de estilo do Google ou o guia de estilo PEP 8 para Python.

Ferramentas de Teste por domínio

1. Testes Unitários

  • JUnit: Framework de teste unitário para Java.
  • TestNG: Alternativa ao JUnit com suporte adicional para configurações avançadas.
  • Mockito: Framework para criação de mocks em testes unitários.

2. Testes de Integração

  • Testcontainers: Ferramenta para criar ambientes de teste utilizando contêineres Docker.
  • Spring Boot Test: Abordagens específicas do Spring Boot para testes de integração.

3. Automação de Testes de APIs

  • RestAssured: Framework para automação de testes em APIs RESTful com Java.
  • Postman: Ferramenta GUI para testes de APIs e automação.
  • Newman: CLI para executar coleções do Postman.
  • Karate: Framework para automação de testes de APIs, com suporte a DSL semelhante ao Gherkin.

4. Testes Funcionais e End-to-End (E2E)

  • Selenium: Automação de testes para navegadores web.
  • Cypress: Automação de testes E2E moderna, com foco em aplicações web.
  • Playwright: Alternativa ao Cypress, com suporte a múltiplos navegadores.
  • Robot Framework: Ferramenta de automação genérica, aplicável a E2E e outros tipos de testes.

5. Testes de Contrato

  • Pact: Framework para validação de contratos entre serviços usando Consumer-Driven Contracts.

6. Testes de Carga e Desempenho

  • JMeter: Ferramenta para testes de carga em aplicações e APIs.
  • k6: Framework moderno para testes de desempenho com scripts em JavaScript.
  • Gatling: Ferramenta de alto desempenho para testes de carga.

7. Testes de Segurança

  • OWASP ZAP (Zed Attack Proxy): Ferramenta de segurança para identificar vulnerabilidades em aplicações web.
  • Burp Suite: Conjunto de ferramentas para testes de segurança, amplamente utilizado em APIs e aplicações web.

8. Simulação de Dependências

  • WireMock: Ferramenta para criar mocks de APIs REST.
  • Mockoon: Ferramenta GUI para simulação de APIs.
  • Hoverfly: Alternativa ao WireMock, com suporte a gravação e reprodução de interações.

9. Observabilidade e Debug

  • Jaeger: Ferramenta para rastreamento distribuído.
  • Zipkin: Alternativa para rastreamento de dependências em microserviços.

10. Gestão de Testes

  • TestRail: Ferramenta para planejar, organizar e rastrear casos de teste.
  • Zephyr: Alternativa para gestão de testes, com integração ao Jira.

11. Integração com CI/CD

  • Jenkins: Ferramenta de automação popular para CI/CD.
  • GitHub Actions: Plataforma integrada ao GitHub para automação de pipelines.
  • GitLab CI: Ferramenta de CI/CD integrada ao GitLab.

Resumo Consolidado

Domínio Ferramentas
Testes Unitários JUnit, TestNG, Mockito
Testes de Integração Testcontainers, Spring Boot Test
Automação de APIs RestAssured, Postman, Newman, Karate
Testes Funcionais e E2E Selenium, Cypress, Playwright, Robot Framework
Testes de Contrato Pact
Testes de Carga e Desempenho JMeter, k6, Gatling
Testes de Segurança OWASP ZAP, Burp Suite
Simulação de Dependências WireMock, Mockoon, Hoverfly
Observabilidade e Debug Jaeger, Zipkin
Gestão de Testes TestRail, Zephyr
Integração com CI/CD Jenkins, GitHub Actions, GitLab CI

Top interview question Leetcode

Easy

Array

Strings

Linked List

Trees

Sorting and Searching

Dynamic Programming

Design

Math

 Fizz Buzz
 Count Primes
 Power of Three
 Roman to Integer

Others

 Number of 1 Bits
 Hamming Distance
 Reverse Bits
 Pascal’s Triangle
 Valid Parentheses
 Missing Number

Medium

Array and Strings

 3Sum
 Set Matrix Zeroes
 Group Anagrams
 Longest Substring Without Repeating Characters
 Longest Palindromic Substring
 Increasing Triplet Subsequence
 Missing Ranges
 Count and Say

 

Linked List

 Add Two Numbers
 Odd Even Linked List
 Intersection of Two Linked Lists

 

Trees and Graphs

 Binary Tree Inorder Traversal
 Binary Tree Zigzag Level Order Traversal
 Construct Binary Tree from Preorder and Inorder Traversal
 Populating Next Right Pointers in Each Node
 Kth Smallest Element in a BST
 Inorder Successor in BST
 Number of Islands

 

Backtracking

 Letter Combinations of a Phone Number
 Generate Parentheses
 Permutations
 Subsets
 Word Search

 

Sorting and Searching

 Sort Colors
 Top K Frequent Elements
 Kth Largest Element in an Array
 Find Peak Element
 Search for a Range
 Merge Intervals
 Search in Rotated Sorted Array
 Meeting Rooms II
 Search a 2D Matrix II

 

Dynamic Programming

 Jump Game
 Unique Paths
 Coin Change
 Longest Increasing Subsequence

 

Design

 Flatten 2D Vector
 Serialize and Deserialize Binary Tree
 Insert Delete GetRandom O(1)
 Design Tic-Tac-Toe

 

Math

 Happy Number
 Factorial Trailing Zeroes
 Excel Sheet Column Number
 Pow(x, n)
 Sqrt(x)
 Divide Two Integers
 Fraction to Recurring Decimal

 

Others

 Sum of Two Integers
 Evaluate Reverse Polish Notation
 Majority Element
 Find the Celebrity
 Task Scheduler

 Hard

Array and Strings

 Product of Array Except Self
 Spiral Matrix
 4Sum II
 Container With Most Water
 Game of Life
 First Missing Positive
 Longest Consecutive Sequence
 Find the Duplicate Number
 Longest Substring with At Most K Distinct Characters
 Basic Calculator II
 Sliding Window Maximum
 Minimum Window Substring

 

Linked List

 Merge k Sorted Lists
 Sort List
 Copy List with Random Pointer

 

Trees and Graphs

 Word Ladder
 Surrounded Regions
 Lowest Common Ancestor of a Binary Tree
 Binary Tree Maximum Path Sum
 Friend Circles
 Course Schedule
 Course Schedule II
 Longest Increasing Path in a Matrix
 Alien Dictionary
 Count of Smaller Numbers After Self

 

Backtracking

 Palindrome Partitioning
 Word Search II
 Remove Invalid Parentheses
 Wildcard Matching
 Regular Expression Matching

 

Sorting and Searching

 Wiggle Sort II
 Kth Smallest Element in a Sorted Matrix
 Median of Two Sorted Arrays

 

Dynamic Programming

 Maximum Product Subarray
 Decode Ways
 Best Time to Buy and Sell Stock with Cooldown
 Perfect Squares
 Word Break
 Word Break II
 Burst Balloons

 

Design

 LRU Cache
 Implement Trie (Prefix Tree)
 Flatten Nested List Iterator
 Find Median from Data Stream
 Range Sum Query 2D – Mutable

 

Math

 Largest Number
 Max Points on a Line

 

Others

 Queue Reconstruction by Height
 Trapping Rain Water
 The Skyline Problem
 Largest Rectangle in Histogram

 

 

 

Docker – Kubernetes – Openshift

Docker

Docker surgiu em 2013 inicialmente como uma camada sobre a funcionalidade do Kernel do Linux chamada LXC (Linux Containers), que permite a execução de processos de maneira isolada e restrita. Posteriormente trocaram a LXC pela libcontainer, permitindo seu uso além do Linux.
A tecnologia de containers possibilita rodar processos, serviços e aplicativos de maneira isolada, ou seja, um não enxerga o outro, e de forma limitada, no qual cada um possui um limite dos recursos de hardware disponíveis como quantidade de memória e espaço em disco.
Containers são mais “leves” do que máquinas virtuais pois não precisam simular o hardware e não precisam carregar um sistema operacional completo antes de executar uma aplicação. Utilizam como base Imagens Docker que são arquivos compactados contendo um sistema de arquivos e a aplicação a ser executada.
Basicamente uma aplicação é empacotada na forma de uma Imagem Docker e cada instância em execução é chamada de container.

Kubernetes

Orquestração de containers é a capacidade de provisionar automaticamente a infraestrutura necessária para atender às solicitações das aplicações web por meio de de containers do Docker.
Kubernetes, também conhecido como k8s, é uma ferramenta open source criada pela Google e distribuída em 2014 para automatização de deploys e gerenciamento de containers. Com ele é possível criar um cluster de containers em clouds privadas ou públicas (AWS, Google Cloud, etc.).
Algumas vantagens do Kubernetes:

  • Container sempre online: verifica a saúde da aplicação e recria o container se identificar alguma anomalia.
  • Autoscaling: obtém métricas e verifica se há necessidade de crescer horizontalmente.
  • Descoberta de Serviço: containers recebem um endereço IP e conseguem enxergar um ao outro por meio de uma rede virtual.
  • Crescimento Horizontal: com um simples comando é possível aumentar o número de containers da mesma imagem.
  • Balanceador de Carga: utiliza load balancer para dividir a carga de requisições recebidas entre os containers.
  • Rollbacks automáticos: se algo der errado, Kubernetes volta automaticamente à versão anterior da aplicação.
  • Execução em Batch: permite rodar comandos em batch como containers.

Openshift

Openshift é uma plataforma desenvolvida pela Red Hat que utiliza como base o Kubernetes. Atualmente há 3 distribuições:

  1. Openshift Origin: versão open source utilizada para quem deseja criar um cluster sem precisar pagar licenças.
  2. Openshift Enterprise: versão comercializada pela Red Hat baseada no Origin e suportada oficialmente pelo Red Hat Linux.
  3. Openshift Online: plataforma de serviço fornecida pela Red Hat concorrente do Heroku e Google App Engine.

Mas quais são as vantagens e diferenças entre o Openshift e Kubernetes? O Openshift introduziu algumas camadas que o tornam mais amigável e fácil de integrar com soluções de softwares utilizadas no mundo corporativo. Algumas das vantagens do Openshift em relação ao Kubernetes:

  • Source to Image (S2I) e Build Config: capacidade de obter o código fonte da aplicação a partir de um repositório Git e criar uma Imagem Docker pronta para uso. Um Build é disparado quando há uma mudança no código do repositório através de um Webhook.
  • Integrated Docker Registry: possui um Docker Registry privado utilizado para armazenar as Imagens Docker criadas pelo processo de Source to Image.
  • Image Stream: o Openshift faz tracking das Imagens Docker e recria os containers quando detecta uma mudança na Imagem.
  • Deployment Config: um macro serviço que detecta quando há uma alteração na configuração, por exemplo uma mudança no valor de uma variável de ambiente, e recria os containers.
  • Policies: políticas de autorização para usuários, permitindo por exemplo que um determinado usuário consiga apenas visualizar logs dos containers.
  • Webconsole: uma interface web amigável que possibilita escalar containers, visualizar logs de aplicações e containers e alterar configurações de pods, services, routes, deployments, etc.

Instalando Redis Desktop Manager no Ubuntu

Introdução

Neste post, apresentamos a instalação do Redis Desktop Manager, versão 0.9, no Ubuntu 16.04.

Procedimento

Baixar fontes no Git

$ git clone –recursive https://github.com/uglide/RedisDesktopManager.git -b 0.9 rdm && cd ./rdm

Configurando Make

$ cd src

$ ./configure

Fazendo Make

$ source /opt/qt59/bin/qt59-env.sh && qmake && make && sudo make install

Rodando RDM

$ cd /usr/share/redis-desktop-manager/bin

$ mv qt.conf qt.backup

$ ./rdm

ou

$ redis-desktop-manager

 

Instalando Redis no Ubuntu

Introdução

Este post apresenta como instalar o Redis no Ubuntu, facilmente.

Procedimento

Atualizar biblioteca

$ sudo apt-get update

Obter o Redis

$ sudo apt-get install redis-server

Subir o servidor

$ redis-server /etc/redis/redis.conf

Verificar servidor

$ ps -ef| grep redis

ou

$ redis-cli

Baixar o servidor

$ /etc/init.d/redis-server stop