Skip to content

Instantly share code, notes, and snippets.

View jordisilvazup's full-sized avatar

Jordi Henrique Silva jordisilvazup

View GitHub Profile
@jordisilvazup
jordisilvazup / escrevendo-rest-apis-idempontentes-com-spring-mvc.md
Last active May 19, 2023 23:00
O Objetivo deste texto, é demostrar como implementar estratégias para construção de REST APIs Idempotentes. Esse material irá se basear no guideline sobre REST APIs do time de engenharia da Zalando, e os exemplos de implementação são escritos para aplicações Spring Boot

3 estratégias para implementar Idempotência em REST APIs

Em arquiteturas distribuidas, é comum que a maior parte das transações de negocio estejam fragmentas em microsserviços disponiveis na rede. E bem como já ouvimos falar nas 8 Falacias dos sistemas distribuidos, a rede não é segura, e falhas podem acontecer a qualquer momento, então é importante que nós desenvolvedores projetamos nossas APIs para lidar com este tipo de eventualidade.

Uma falha de rede, pode proporcionar processamentos desnecessários, e dependendo da criticidade do projeto, é possível que ate prejuizos sejam adquiridos, como por exemplo, em um marketplace o processo de venda é composto por varias etapas, iniciando na busca e escolha do produto, e finalizando no pagamento. Porém, o que acontece, caso o servidor processe o pagamento e por motivo caia, e não retorne resposta ao cliente. Caso o cliente esteja programando para fazer retentativas, um novo pagamento pode

Cache-Control em uma API REST Java usando OpenFeign

O cabeçalho Cache-Control é um campo do cabeçalho HTTP que permite controlar como o cache do navegador ou do servidor deve armazenar e usar uma resposta HTTP. Ele especifica diretivas que informam ao cache se a resposta pode ser armazenada, se pode ser compartilhada entre vários usuários ou se deve ser revalidada antes de ser reutilizada.

Algumas das diretivas do cabeçalho Cache-Control incluem:

  • public: permite que a resposta seja armazenada em cache pelo navegador ou servidor intermediário e compartilhada com outros usuários.
  • private: especifica que a resposta deve ser armazenada em cache somente pelo navegador do usuário e não por servidores intermediários.
  • no-cache: indica que a resposta não deve ser armazenada em cache sem ser revalidada.
  • max-age: especifica por quanto tempo a resposta pode ser armazenada em cache antes de ser considerada obsoleta.
package zup.edu.livraria.samples.books;
import java.math.BigDecimal;
import java.util.UUID;
public class BookEvent {
private UUID id;
private String title;
private String description;
private BigDecimal price;
@jordisilvazup
jordisilvazup / tutorial.md
Last active April 22, 2024 12:38
Aqui você aprenderá como configurar o IntelliJ para usar o Docker junto a Test Containers quando docker é nativo no WSL2

Aqui vou deixar o que é necessario para configurar o docker nativo do linux através de ubunto e wsl2 no IntteliJIDE

  1. Exponha o daemon no seu wsl
sudo echo '{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}' > /etc/docker/daemon.json
  1. Crie o arquivo .testcontainers.properties em C:\Users\SeuUser
docker.client.strategy = org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy
@jordisilvazup
jordisilvazup / docker-compose-com-kafka-e-kafkadrop.yml
Last active July 27, 2022 20:43
compose com kafka e kafkadrop
version: '3.0'
services:
db:
image: postgres
restart: always
hostname: dblivraria
ports:
- "5432:5432"
networks:
- metricas
version: '3.0'
services:
db:
image: postgres
restart: always
hostname: dblivraria
ports:
- "5432:5432"
networks:
- metricas
@jordisilvazup
jordisilvazup / HowToUseIt.java
Created June 1, 2022 15:20 — forked from rponte/HowToUseIt.java
THEORY: Example of a simple Single Thread Pool implementation in Java
public class HowToUseIt {
/**
* Usually we'll have a single instance per client
*/
private static final SingleThreadPool THREAD_POOL = new SingleThreadPool();
public void executeAsync() {
try {
package br.com.zup.edu.fornecedormanager.controller;
import br.com.zup.edu.fornecedormanager.model.Fornecedor;
import br.com.zup.edu.fornecedormanager.model.Telefone;
import br.com.zup.edu.fornecedormanager.repository.FornecedorRepository;
import br.com.zup.edu.fornecedormanager.repository.TelefoneRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
package br.com.zup.edu.nossozenity.zupper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
package br.com.zup.edu.marketplace.controller;
import br.com.zup.edu.marketplace.model.Produto;
import br.com.zup.edu.marketplace.repository.ProdutoRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;