Simples exemplo de CRUD para armazenar em memoria os dados vindo do JSON.

API Growth

Este repositório foi criado para colocarmos projetos em diversas linguagens com intúito totalmente didático para colaborar com a comunidade e desenvolvedores como resolver o problema proposto utilizando diversas linguagens de programação e visualizando as vantagens e desvantagens de cada uma para resolver o problema.

O escopo do projeto é criar uma API rEST um CRUD e persistir em memória e colocar em uma imagem docker e o tamanho desta imagem não poderá ultrapassar 6Mb.

Todo repo foi organizado por linguagens de programação, fique a vontade em colaborar enviando um pull request para nós, logo abaixo vamos deixar na documentação como fazer PR.

O que iremos enviar para o [POST] será um json de 3Mb com mais de 40k de linhas e o corpo do Json está logo abaixo:

[
   {
      "Country":"BRZ",
      "Indicator":"NGDP_R",
      "Value":183.26,
      "Year":2002
   },
   {
      "Country":"AFG",
      "Indicator":"NGDP_R",
      "Value":198.736,
      "Year":2003
   }
]
Owner
Jefferson Otoni Lima
Senior Software Enginer and Architect entrepreneur since 2006, currently as Senior Software Enginer at Engineering Brasil and CEO & Co-Fundador S3WF
Jefferson Otoni Lima
Comments
  • Aplica o PHP Swoole

    Aplica o PHP Swoole

    Este PR utiliza a extensão Swoole do PHP para criar um web server com Async IO.

    Todas as classes do código fonte foram convertidas para esta extensão. Trocou-se o APCU pelo Swoole\Table.

    Para os testes de estresse, utilizou-se o K6 e no script.js removeu-se os comandos de sleep.

    running (1m00.0s), 00/10 VUs, 158483 complete and 0 interrupted iterations
    default ✓ [ 100% ] 10 VUs  1m0s
    
         data_received..................: 87 MB  1.4 MB/s
         data_sent......................: 70 MB  1.2 MB/s
         http_req_blocked...............: avg=4.09µs  min=1.17µs   med=2.5µs    max=12.35ms p(90)=3.73µs  p(95)=5.01µs 
         http_req_connecting............: avg=18ns    min=0s       med=0s       max=2.61ms  p(90)=0s      p(95)=0s     
         http_req_duration..............: avg=1.11ms  min=196.11µs med=952.22µs max=36.08ms p(90)=1.84ms  p(95)=2.3ms  
           { expected_response:true }...: avg=1.11ms  min=196.11µs med=952.22µs max=36.08ms p(90)=1.84ms  p(95)=2.3ms  
         http_req_failed................: 0.00%  ✓ 0           ✗ 475449
         http_req_receiving.............: avg=52.71µs min=11.37µs  med=27.08µs  max=28.18ms p(90)=46.36µs p(95)=89.06µs
         http_req_sending...............: avg=21.55µs min=5.97µs   med=13.65µs  max=20.52ms p(90)=21.58µs p(95)=32.26µs
         http_req_tls_handshaking.......: avg=0s      min=0s       med=0s       max=0s      p(90)=0s      p(95)=0s     
         http_req_waiting...............: avg=1.04ms  min=165.84µs med=892.72µs max=35.69ms p(90)=1.75ms  p(95)=2.17ms 
         http_reqs......................: 475449 7923.704607/s
         iteration_duration.............: avg=3.76ms  min=964.14µs med=3.41ms   max=41.52ms p(90)=5.43ms  p(95)=6.6ms  
         iterations.....................: 158483 2641.234869/s
         vus............................: 10     min=10        max=10  
         vus_max........................: 10     min=10        max=10  
    

    Efetuando-se um teste de carga de leitura com ab:

    $ ab -n100000 -c1000 http://localhost:8080/api/v1/growth/brz/ngdp_r/2002
    This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 10000 requests
    Completed 20000 requests
    Completed 30000 requests
    Completed 40000 requests
    Completed 50000 requests
    Completed 60000 requests
    Completed 70000 requests
    Completed 80000 requests
    Completed 90000 requests
    Completed 100000 requests
    Finished 100000 requests
    
    
    Server Software:        swoole-http-server
    Server Hostname:        localhost
    Server Port:            8080
    
    Document Path:          /api/v1/growth/brz/ngdp_r/2002
    Document Length:        67 bytes
    
    Concurrency Level:      1000
    Time taken for tests:   14.574 seconds
    Complete requests:      100000
    Failed requests:        0
    Total transferred:      22200000 bytes
    HTML transferred:       6700000 bytes
    Requests per second:    6861.30 [#/sec] (mean)
    Time per request:       145.745 [ms] (mean)
    Time per request:       0.146 [ms] (mean, across all concurrent requests)
    Transfer rate:          1487.51 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0   37 202.2      1    3051
    Processing:     1  100 253.4     34    3064
    Waiting:        1   96 253.1     30    3062
    Total:          1  137 331.8     36    3298
    
    Percentage of the requests served within a certain time (ms)
      50%     36
      66%     45
      75%     53
      80%     59
      90%    108
      95%   1058
      98%   1088
      99%   1249
     100%   3298 (longest request)
    

    Por fim, o tamanho da imagem Docker aumentou de 2.38MB para 5.26MB.

  • Aprimora Compactação do Binário do PHP

    Aprimora Compactação do Binário do PHP

    Este PR modifica a construção da imagem Docker do PHP e compila o SAPI cli de forma estática, fazendo com que a biblioteca MUSL seja incluida e compactada pelo upx.

    Isso faz com que a imagem seja reduzida de 2.75MB para 2.38MB.

  • nodejs + typescript 🚀

    nodejs + typescript 🚀

    Exemplo de projeto usando Nodejs (typescript) com a menor imagem de Docker que consegui encontrar. Estou usando uma versão bem antiga (Nodejs4) porque foi o menor binário que consegui encontrar :)

  • Correção de erro de modificação concorrente

    Correção de erro de modificação concorrente

    Solução proposta:

    • Utilizar um identificador de chave/valor em um HashMap que suporta concorrência de acesso e utilizar funções sincronizadas para remoção e listagem de dados!

    • Utilizar um novo objeto para listagem, deixando assim o objeto responsável por armazenar livre para acesso!

    println("Kotlin rocks!")  // =D
    
  • Imagem criada com kotlin!

    Imagem criada com kotlin!

    Não consegui fazer muita coisa com relação ao tamanho da imagem, e o build está bem demorado... mas, aí está!

    Esta API foi construída inteiramente com Kotlin, utilizando features da linguagem, como companion objects, coroutines e um pouco de paradigma funcional!

    O tamanho da imagem docker, por conta do multistage, ficou em 75.9MB, o que pra JVM é um belo de um avanço =D

    Quero minha camisa ein ahhahaha

  • Só vim pela camisa 😆

    Só vim pela camisa 😆

    Go + Echo = ❤️

    Uma solução simples do problema usando Go + Echo. O projeto contem um Makefile e um README.md para deixar a vida de todo mundo mais fácil 😄

    Observações

    No README.md da página inicial a requisição de DELETE está com o valor de PUT no curl

    curl -i -XPUT ....
    

    o correto seria

    curl -i -XDELETE ....
    

    E a request de verificar os status não faz sentido algum aquele RESPONSE, tem um campo chamado test value que eu realmente não entendi o que raios é aquilo, logo eu alterei o RESPONSE do endpoint e descrevi ele melhor no meu README.

    That's all folks

  • PHP Image

    PHP Image

    Este PR somente cria uma imagem Docker de PHP com um tamanho reduzido (~12MB).

    Tem muito o que melhorar ainda, mas o primeiro passo está aí.

    A API será desenvolvida nos próximos dias.

  • WIP: Teste de Integração usando Docker

    WIP: Teste de Integração usando Docker

    Programadores normalmente são preguiçosos, então pq não testarmos tudo de forma automática? A idéia é a seguinte:

    • Procurar por implementações nas pastas que começam com grow.*
    • Encontrar os arquivos Dockerfile
    • Construir um container à partir dessas informações
    • Iniciar o container na porta 8080
    • Realizar testes de integração utilizando técnicas comuns em servidores Golang :)

    Essa implementação é um work in progress. A ideia é construir de forma colaborativa através da #17.

  • Adicionado versão de C# usando .NET 6 minimal api

    Adicionado versão de C# usando .NET 6 minimal api

    Essa versão usa a versão do C# 10 e .NET 6, ambas em preview. Com .NET 6 foi introduzido o formato de minimal api, que simplifica bastante o desenvolvimento de apis simples, sem necessidade de adicionar controllers, actions etc...

  • Teste de Integração usando Docker

    Teste de Integração usando Docker

    Programadores normalmente são preguiçosos, então pq não testarmos tudo de forma automática? A idéia é a seguinte:

    • Procurar por implementações nas pastas que começam com grow.*
    • Encontrar os arquivos Dockerfile
    • Construir um container à partir dessas informações
    • Iniciar o container na porta 8080
    • Realizar testes de integração utilizando técnicas comuns em servidores Golang :)

    E aí? O que acham?

Simple boilerplate code to get started with building and deploying a serverless CRUD API

Simple boilerplate code to get started with building and deploying a serverless CRUD API with Go, MongoDB and Netlify

Jan 20, 2022
A complete guide to undersatnd golang programming language, web requests, JSON and creating web APIs with mongodb

Golang series A complete guide to undersatnd golang programming language, web requests, JSON and creating web APIs with mongodb LearnCodeonline.in 01

Jan 1, 2023
gron transforms JSON into discrete assignments to make it easier to grep

gron Make JSON greppable! gron transforms JSON into discrete assignments to make it easier to grep for what you want and see the absolute 'path' to it

Nov 2, 2021
Primer proyecto OSS en comunidad sobre cache en memoria.

GoKey ?? Concepto del proyecto: Sistema de base de datos clave valor, distribuido. En forma de cache en memoria. Especificaciones: Para conjuntar inf

Aug 6, 2022
Aplicação Pedra, Papel e Tesoura de exemplo do curso Let's Go!

?? Pedra ?? Papel ✂️ Tesoura Objetivo Disponibilizar, por meio uma API HTTP Rest, um jogo de "Pedra, Papel, Tesoura". Rotas Jogar um jogo de "Pedra, P

Nov 6, 2021
go-api-crud: API Rest CRUD

go-api-crud API Rest CRUD Estrutura de pacotes cfg (config) Utilizando variáveis de ambiente. Arquivo [cfg/config.go] é possível "setar" configuração.

Oct 27, 2021
Crud - A mysql crud code generate tool from table DDL sql file

crud is a mysql crud code generate tool 中文文档 Getting Started Overview Crud is a

Oct 13, 2022
A simple GO module providing CRUD and match methods on a User "entity" stored locally as JSON

A simple GO module providing CRUD and match methods on a User "entity" stored locally as JSON. Created for GO language learning purposes. Once finishe

Feb 5, 2022
Repositório para a aula sobre integração do containerd com Golang
Repositório para a aula sobre integração do containerd com Golang

Integrando containers nativamente usando Golang Este é o código finalizado da aplicação Já pensou em uma alternativa ao Docker? Que tal manipular cont

May 4, 2021
Laboratorios y guías en español para aprender Docker de manera práctica

Docker Labs Laboratorios y guías en español para aprender Docker de manera práctica. Iniciando Clona el repositorio Navega a través de la carpeta de l

Jun 21, 2022
Teste prático para vaga de back-end Python / Go na Stone.

Stone_GitHub_API_Golang Teste prático para vaga de back-end Python / Go na Stone. Nota 1: Utilizar a branch Release Nota 2: É necessário adicionar o T

Jun 26, 2021
Ambiente com Docker de "live-reload" para aplicações Go

Ambiente Go Um ambiente de "live reload", onde as alterações no código são observadas e re-executadas automaticamente, com Docker e Docker Compose. O

Jun 17, 2022
Bot para o discord escrito em Golang durante o workshop ministrado na Codecon 2021

Codecon Bot Bot para o discord escrito em Golang durante o workshop ministrado na Codecon 2021 Primeiramente no arquivo main.go coloque o TOKEN do bot

Oct 4, 2021
Ejemplo de un k8s custom controller para un CRD nuevo

Clonado de kubernetes/sample-controller Para pruebas de un CRD nuevo This repository implements a simple controller for watching Foo resources as defi

Nov 3, 2021
Apis para la administracion de notifiaciones, utilizando servicios como AWS SNS y AWS SQS

notificacion_api Servicio para envío de notificaciónes por difusión en AWS SNS Especificaciones Técnicas Tecnologías Implementadas y Versiones Golang

Jan 7, 2022
Empleando interfaces para inyectar capas o dependencias

go-interfaces Trabajar con Interfaces facilita la inyeccion de capas, y tambien el testing de cada capa. Para desarrollar con este mecanismo es necesa

Dec 1, 2021
Tutorial para Go

Plain-go-tutorial Tutorial para Go. Descarga antes de nada los siguientes componentes para la formación. https://code.visualstudio.com/ https://go.dev

Nov 28, 2021
Projeto de biomecânica para tentar avaliar photoelasticidade
Projeto de biomecânica para tentar avaliar photoelasticidade

Alunos Carlos Manuel de Jesus Puentes Valdes 11812591 O que esse programa faz? A partir de uma região da imagem, vão ser buscadas regiões vizinhas de

Dec 1, 2021
e-distribucion (Endesa) API para la lectura remota de contadores inteligentes

e-Distribucion API Go API to read Endesa energy meters info. Ported from Python to Go using https://github.com/trocotronic/edistribucion. You'll need

Dec 4, 2021
Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gateway, Lambda, DynamoDB, DynamoDB Streams
Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gateway, Lambda, DynamoDB, DynamoDB Streams

Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gatew

May 7, 2022