#Resumepramim Microserviços na prática: o que aprendemos em 2 anos

5 02 2018

Da série #resumepramim segue uma apresentação do Felipe Silvestre postada no InfoQ

Objetivo

Mudar uma solução Monólito centralizada para uma solução descentralizada com microserviços.

Características

  1. A aplicação usava JSF 1.2, JBoss Seam 2.2 e Java 6 e eles migraram para uma plataforma multisserviços
  2. Deixaram a interface gráfica na frente e criaram alguns serviços backend desacoplados por trás
  3. Fizeram uma aplicação paralela e foram migrando aos poucos os usuários e soluções, analisado caso a caso
    1. Para isso utilizaram um banco central até a migração final por um tempo
  4. Dividiram a execução em 4 partes
  5. Primeira parte: definições e estruturação
    1. A definição da API com Restful estudando muito bem o padrão
    2. A definição dos testes, onde criaram uma boa camada de testes de integração de API com diferentes tecnologias como (REST-assured, Mocha etc..)
    3. A definição da documentação com Suwagger
    4. A definição do versionamento para não quebrar a API
    5. A definição da segurança (utilizando sistema de Token)
    6. A definição  da integração continua (com multi serviços a complexidade aumenta e precisa ser melhor analisada)
    7. A definição do monitoramento de todos os serviços (Utilizaram o newrelic)
  6. Segunda parte: Ajustando engrenagem
    1. Tinham problemas de logs distribuídos e centralizaram os logs usando o Graylog
    2. Começaram a utilizara mensageria com filas de mensagem
    3. Feature toggle: padronizaram as configurações de funcionalidades com o Togglz
    4. DB-MIGRATION: versionamento do banco com liquibase para os diferentes serviços
    5. SpringBoot: Utilizaram o spring boot para a criação dos microserviços com os padrões recomendados
  7. Terceira parte: Otimizando recursos
    1. Container docker: para resolver problemas de dependências com outros microserviços para desenvolvimento
    2. Kubernates: para organizar os containers do Docker
    3. Melhorando indisponibilidade de ambientes com Kubernates
    4. Utilizaram o Configserver para centralização de toda a configuração
    5. Pensaram no conceito de redundância e Fallback para os microserviços
    6. Utilizaram o Netflix OSS para API de e-mails
      1. API Gaeway (Gerencia de recurso)
      2. SeviceDiscovery (Discovery de recursos e serviços)
      3. Ristricts (Fallback e desvio de fluxos)
    7. Ao infinito em além
      1. Tracing (rastreamento)
      2. Serverless (versionamento)
      3. Eventsourcercing (mudanças de estado)
      4. DDD (pensar mais em serviços independentes)
  8. Resumo da estratégia
    1. Planeje, Prepare e Execute
    2. Progressivamente
    3. Executando e colhendo experiências em cada fatia
    4. Cuidar das pessoas (treinamento, incentivar, e processos)
    5. São muitas tecnologias envolvidas e precisa de treinamento

 

Conclusões

Achei a apresentação muito boa, bem planejada e executada, em um cenário muito comum.

Fica a sugestão de ver, acho bem interessante avaliarmos o feedback de outras empresas nessas trajetórias.

 

Anúncios




Stop Gain vs Stop Loss

2 10 2017

Stop Gain

Pra que serve?

  • Estabelecer um limite de ganho com maior garantia de venda

Como funciona?

  • Quando a cotação da ação chegar a um topo é enviada uma ordem automática com um valor um pouco menor garantindo assim a venda.
  • É necessário configurar dois valores principais
    • Preço de disparo: preço quando será criado a ordem automáticamente pelo sistema
    • Preço de Venda: preço que a ordem será enviada

Exemplo

  • Comprei a WEGE3 á R$ 22,45 quero fazer um Swing Trade a médio prazo vendendo a R$ 24,05 então configuro da seguinte maneira
    • Compra: R$ 22,45
    • Preço de disparo: R$ 24,10
      • quando chegar nesse preço será disparado uma ordem de venda de R$ 24,05
    • Preço de venda: R$ 24,05

Mas porque tenho que configurar uma ordem de venda menor do que o disparo?

Porque a ação pode oscilar bastante então se você configurar uma venda no topo pode ser que ação caia e não suba mais fazendo com que você não garanta a venda.

Esse é o verdadeiro valor do stop porque se configura uma bolha que garante a venda.

Stop Loss

Pra que serve?

Estabelecer um limite de perda com maior garantia de venda

Como funciona?

Quando a cotação da ação chegar a um vale é enviada uma ordem automática com um valor um pouco menor garantindo assim a venda.

É necessário configurar dois valores principais

  • Preço de disparo: preço quando será criado a ordem automáticamente pelo sistema
  • Preço de Venda: preço que a ordem será enviada

Exemplo

Comprei a WEGE3 á R$ 22,45 e quero perder no máximo 10% a médio prazo, vendendo a R$ 20,20, então configuro da seguinte maneira

  • Compra: R$ 22,45
  • Preço de disparo: R$ 22,25 (quando chegar nesse preço será disparado uma ordem de venda de R$ 22,20)
  • Preço de venda: R$ 22,20

Mas porque tenho que configurar uma ordem de venda menor do que o disparo?

Porque a ação pode oscilar bastante entre a ordem ser disparada e a venda, então é necessário configurar ela um pouco abaixo que o valor atual para que aumente a garantia de venda.

Esse é o verdadeiro valor do stop, porque se configura uma bolha que garante a venda.





Efeito halo

4 07 2017

O que é?

Pra mim, a melhor maneira de explica o que é o efeito Halo é com um exemplo:

Imagine uma empresa de carros que produz 10 diferentes carros, desses 9 carros são a gasolina e poluem o meio ambiente e 1 carro é elétrico. A empresa pode utilziar o efeito Halo ao seu favor fazendo marqueting sobre o carro que não polui gerando assim uma imagem de empresa boa, o que faz com que as pessoas desconsiderem os outros 9 modelos de carro que poluem.

Sendo assim o efeito Halo é a predominância de um determinado fato sobre os outros no julgamento de algo.

Outro exemplo é a utilização de famosos para vender, fazendo que as pessoas que confiam nos famosos comprem os produtos, uma vez que a confiança nos famosos é uma premissa predominante no julgamento do produto.

Quem descreveu esse efeito?

Thorndike investigou esse fenômeno em 1920. Muito resumidamente, concluiu que “depois de criada uma primeira impressão global sobre uma pessoa, temos a tendência para captar as características que vão confirmar essa mesma impressão”.

Por que isso me interessa?

Pra mim vale saber que existe esse efeito para controlarmos melhor meus julgamentos e tentar não ser manipulado pelo mesmo.

Fonte: AQUI





Hibernate – Monitorando atualizações de entidades

19 04 2017

Problema

Preciso monitorar cada atualização da entidade para tentar descobrir a causa de um relacionada ao versionamento da entidade

Solução

Utilizar o Listner do hibernate

Como?

Escrever um Listener

public class DocumentoListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(DocumentoListener.class);

    @PostUpdate
    public void documentoPrePersist(Documento entidade) {
        logarAlteracao(entidade);
    }

    private void logarAlteracao(Documento entity) {
        String informacoesDocumento = buscarInformacoesDoDocumento(entity);
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("[PostUpdate] Documento atualizado no BD " + informacoesDocumento + getStackTraceComString());
        }
    }

Anotar a entidade que será monitorada

@EntityListeners(DocumentoListener.class)
@Entity
@Table(name = "DOCUMENTO")
public class Documento extends AbstractBusinessEntity {

Configurar o persistence.xml

<property name="org.hibernate.envers.revision_field_name" value="id_revision" />
			<property name="org.hibernate.envers.revision_type_field_name" value="tp_revision" />
			<property name="hibernate.ejb.event.post-insert" value="org.hibernate.ejb.event.EJB3PostInsertEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-update" value="org.hibernate.ejb.event.EJB3PostUpdateEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-delete" value="org.hibernate.ejb.event.EJB3PostDeleteEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" />

 

Links: LINK1, LINK2 e LINK3





SQL SERVER 2014 Express – Aplicação não conecta depois de instalado

17 01 2017

Problema

Depois de instalar o SQL server 2014 express não consigo conectar com a aplicação na porta 1433

Solução

  1. Habilitar a conexão TCP/IP (acredito que por padrão vem desabilitado)
    1. Abirir o SQL Server Configuration Manager
    2. Expandir o nodo de SQL server Network Configuration
    3. Selecionar Protocolos MSSQLSERVER
    4. Garantir que o TCP/IP protocolo está habilitado
  2. Verificar as propriedades do TCP/IP
    1. Botão direito sobre o TCP/IP e selecionar propriedades
    2. Na aba selecionar propriedades e endereços
    3. No final na opção IPAII garantir:
      1. TCP Dynamic Ports deve estar branco/vazio
      2. TCP Port deve estar como 1433
  3. Verificar se a base esta aceitando conexões remotas (por padrão sempre está habilitado, então provavelmente não precisa fazer nada)

FONTE

 





SQLSERVER 2014 – Erro instalação: “Falha na espera do identificador de recuperação do Mecanismo de Banco de Dados”

16 01 2017

Problema

Estou com um problema para instalar o SQL Server 2014 na minha maquina, onde no final da instalação é apresentado um erro.

Erro

Falha na espera do identificador de recuperação do Mecanismo de Banco de Dados. Verifique as causas prováveis no log de erros do SQL Server.

Solução

  1. Desinstalar TUDO referente ao SQL server via Programas/Recursos do Windows
  2. Rodar a instalação do SQL Server 2014
  3. Quando solicitado Contas de Serviço/Service
    1. Informar em Account name na linha: SQL Server Database Engine
      1. NT AUTHORITY\NETWORK SERVICE

FONTE 1

FONTE 2





InteliJ-Converter\Visualizar automaticamente ascii em arquivos properties de i18n

11 01 2017

Problema

Gostaria de visualizar a conversão de ascii automaticamente na visualização de arquivos internacionalizados/i18n

Solução

Existe uma propriedade que pode ser habilitada no inteliJ chamada Transparent native-to-ascii conversion

File->Settings->Editor->File Encodings -> Marcar opção Transparent native-to-ascii conversion

Depois de aplicar já é possível visualizar os arquivos convertidos automaticamente

Fonte