{"id":13147,"date":"2022-04-26T20:13:45","date_gmt":"2022-04-27T03:13:45","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13147"},"modified":"2025-06-13T23:04:15","modified_gmt":"2025-06-14T06:04:15","slug":"build-a-python-microservice-with-couchbase-part-3","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/","title":{"rendered":"Crie um microsservi\u00e7o Python com o Couchbase - Parte 3"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Recapitula\u00e7\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Nas duas parcelas anteriores de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-1\/\" target=\"_blank\" rel=\"noopener\">esta s\u00e9rie<\/a>Na se\u00e7\u00e3o \"A arquitetura de microsservi\u00e7os\", discutimos os motivadores por tr\u00e1s da cria\u00e7\u00e3o de microsservi\u00e7os. Tamb\u00e9m analisamos por que o Couchbase \u00e9 o reposit\u00f3rio de dados perfeito para ser usado com essa arquitetura. Tamb\u00e9m analisamos tr\u00eas variantes de um exemplo de microsservi\u00e7o de perfil de usu\u00e1rio. Duas foram escritas em Python e uma foi escrita em Node.js para compara\u00e7\u00e3o. Nesta \u00faltima parte da s\u00e9rie, discutiremos um m\u00e9todo para gerar dados de teste para o esquema de microsservi\u00e7o. <\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Por que usar dados de teste?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Testes rigorosos s\u00e3o essenciais para o lan\u00e7amento de um software est\u00e1vel. Muitos elementos fazem parte de uma boa estrat\u00e9gia de teste. Na \u00faltima d\u00e9cada, o termo \"DevOps\" \u00e9 frequentemente usado para fazer refer\u00eancia tanto aos conjuntos de ferramentas usados no desenvolvimento e teste de software quanto \u00e0 cultura, aos processos e aos procedimentos que devem ser implementados para obter um desenvolvimento r\u00e1pido e \u00e1gil. Independentemente da terminologia, h\u00e1 um ponto em comum: automa\u00e7\u00e3o e orquestra\u00e7\u00e3o. Esses dois aspectos podem facilmente constituir sua pr\u00f3pria s\u00e9rie de blog, portanto, n\u00e3o nos deteremos muito neles, exceto para dizer que a gera\u00e7\u00e3o de dados de teste \u00e9 um aspecto essencial do DevOps e do desenvolvimento e teste \u00e1geis de software.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Pessoalmente, ca\u00ed na armadilha de n\u00e3o ter um bom conjunto de dados de desenvolvimento. Por conveni\u00eancia, criei manualmente alguns dados que se encaixavam no esquema desejado para que eu pudesse fazer testes de unidade no c\u00f3digo. Mas, no dia seguinte, percebi que o c\u00f3digo que funcionava bem com meu pequeno conjunto de dados n\u00e3o funcionava muito bem quando era executado em um banco de dados de teste com milhares de registros e dados mais realistas.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Gera\u00e7\u00e3o de dados JSON para testar o microsservi\u00e7o Python<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">H\u00e1 muitas maneiras de colocar os dados de teste em um banco de dados de teste ou de desenvolvimento. Um m\u00e9todo \u00e9 copiar e higienizar os dados de produ\u00e7\u00e3o, se poss\u00edvel. Pode n\u00e3o ser vi\u00e1vel ter c\u00f3pias completas da produ\u00e7\u00e3o para v\u00e1rios ambientes de desenvolvimento e teste, dependendo dos recursos dispon\u00edveis. As plataformas de banco de dados devem ser dimensionadas adequadamente e deve-se tomar cuidado para remover dados confidenciais por motivos de conformidade e seguran\u00e7a. C\u00f3pias completas de produ\u00e7\u00e3o devem ser um requisito para ambientes de teste de regress\u00e3o e pr\u00e9-produ\u00e7\u00e3o. A gera\u00e7\u00e3o de dados sint\u00e9ticos e aleat\u00f3rios com um conjunto m\u00ednimo de dados para teste e desenvolvimento de unidades geralmente \u00e9 adequada.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Com um banco de dados relacional, pode ser um desafio criar uma inst\u00e2ncia de banco de dados com um subconjunto de tabelas porque os modelos relacionais normalmente exigem que todas as estruturas de dados estejam presentes. No entanto, com o formato de documento JSON do Couchbase, isso \u00e9 muito mais f\u00e1cil de fazer. Observando a amostra do microsservi\u00e7o, o esquema foi criado em torno dos escopos e cole\u00e7\u00f5es do Couchbase. Eles poderiam facilmente fazer parte de um esquema maior com mais cole\u00e7\u00f5es e escopos. Mas tudo o que precisamos s\u00e3o as cole\u00e7\u00f5es para acessar chaves, perfis de usu\u00e1rios e imagens de usu\u00e1rios, pois isso \u00e9 tudo o que o nosso exemplo de servi\u00e7o precisa acessar para funcionar.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Na segunda parte da s\u00e9rie do blog, usamos o JMeter para fazer testes de desempenho. Para realizar testes de desempenho, o banco de dados deve ter pelo menos milhares de registros para fornecer ao JMeter um conjunto de dados razo\u00e1vel para a gera\u00e7\u00e3o de testes. O microsservi\u00e7o simplesmente obt\u00e9m elementos de perfil e os retorna por meio da API REST. O pressuposto \u00e9 que outros componentes do aplicativo consumam os dados e executem a l\u00f3gica comercial usando os resultados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Revisando as tr\u00eas cole\u00e7\u00f5es de perfis, veja a seguir um exemplo de um documento na cole\u00e7\u00e3o <\/span><span style=\"font-weight: 400;\">dados_do_usu\u00e1rio<\/span><span style=\"font-weight: 400;\"> cole\u00e7\u00e3o. O servi\u00e7o n\u00e3o imp\u00f5e se o campo de imagem tem uma ID que faz refer\u00eancia a um registro de imagem. O servi\u00e7o apenas retorna os dados do perfil ou os dados da imagem. O pressuposto \u00e9 que o que quer que o consuma no sentido ascendente lidar\u00e1 com essa l\u00f3gica.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"record_id\": 1,\r\n\u00a0\u00a0\"name\": \"Michael Jones\",\r\n\u00a0\u00a0\"nickname\": \"mjones\",\r\n\u00a0\u00a0\"picture\": \"\",\r\n\u00a0\u00a0\"user_id\": \"michaeljones2104\",\r\n\u00a0\u00a0\"email\": \"michael.jones@example.com\",\r\n\u00a0\u00a0\"email_verified\": \"True\",\r\n\u00a0\u00a0\"first_name\": \"Michael\",\r\n\u00a0\u00a0\"last_name\": \"Jones\",\r\n\u00a0\u00a0\"address\": \"0208 River Parkway\",\r\n\u00a0\u00a0\"city\": \"Strongdol\",\r\n\u00a0\u00a0\"state\": \"IL\",\r\n\u00a0\u00a0\"zip_code\": \"29954\",\r\n\u00a0\u00a0\"phone\": \"363-555-9036\",\r\n\u00a0\u00a0\"date_of_birth\": \"10\/27\/1958\"\r\n}<\/pre>\n<p>A cole\u00e7\u00e3o user_images \u00e9 simples, com um ID de registro (que pode ser referenciado por um perfil de usu\u00e1rio), um campo de tipo de imagem para que v\u00e1rios codecs de imagem possam ser suportados e a pr\u00f3pria imagem codificada em Base64. Conforme observado na primeira postagem da s\u00e9rie, o Couchbase oferece suporte a documentos bin\u00e1rios, mas usamos o JSON por sua portabilidade e extensibilidade no aplicativo de amostra. Isso implica em um custo adicional de largura de banda de rede para obter os dados e os ciclos do processador para fazer a decodifica\u00e7\u00e3o.<\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"record_id\": 1,\r\n\u00a0\u00a0\"type\": \"jpeg\",\r\n\u00a0\u00a0\"image\": \"AAAAD\u2026\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">O b\u00e1sico <\/span><em><span style=\"font-weight: 400;\">service_auth<\/span><\/em><span style=\"font-weight: 400;\"> cont\u00e9m o token de autentica\u00e7\u00e3o, mas pode ser facilmente ampliada para incluir outros campos de autentica\u00e7\u00e3o.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"record_id\": 1,\r\n\u00a0\u00a0\"token\": \"6j6nW3KD0ZXodBv1\"\r\n}<\/pre>\n<h3><span style=\"font-weight: 400;\">Gera\u00e7\u00e3o de dados JSON de amostra aleat\u00f3ria<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Escrevi um utilit\u00e1rio chamado <\/span><span style=\"font-weight: 400;\">cb_perf<\/span><span style=\"font-weight: 400;\"> para gerar dados aleat\u00f3rios e inseri-los no Couchbase. O utilit\u00e1rio tamb\u00e9m faz alguns testes de desempenho para avaliar os recursos do Python em uma plataforma. Ferramentas como o YCSB usam um esquema irrealista, pois o \u00fanico objetivo \u00e9 avaliar o desempenho bruto. Eu queria ter a capacidade de pegar um JSON arbitr\u00e1rio e inseri-lo com dados sint\u00e9ticos aleat\u00f3rios.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para testar o microsservi\u00e7o de amostra, adicionei o esquema a <\/span><span style=\"font-weight: 400;\">cb_perf<\/span><span style=\"font-weight: 400;\"> para que eu pudesse gerar conjuntos de dados de teste em qualquer cluster do Couchbase. Os <\/span><span style=\"font-weight: 400;\">cb_perf<\/span><span style=\"font-weight: 400;\"> O utilit\u00e1rio JSON usa um arquivo de defini\u00e7\u00e3o de esquema JSON. Para cada cole\u00e7\u00e3o, voc\u00ea define a estrutura de dados JSON.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Voc\u00ea pode especificar express\u00f5es Jinja2 com vari\u00e1veis que mapeiam os tipos de dados do randomizador para cada valor JSON. Dessa forma, cada registro ser\u00e1 diferente. Voc\u00ea tamb\u00e9m pode definir quais \u00edndices criar. Nesse caso, criamos um \u00edndice prim\u00e1rio e \u00edndices secund\u00e1rios em alguns campos.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ela especifica que <\/span><em><span style=\"font-weight: 400;\">id_registro<\/span><\/em><span style=\"font-weight: 400;\"> \u00e9 um campo de ID e que a contagem geral de registros solicitada n\u00e3o deve ser substitu\u00edda (para que possamos criar quantos registros quisermos).<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\"name\": \"user_data\",\r\n\"schema\": {\r\n\u00a0\u00a0\"record_id\": \"record_id\",\r\n\u00a0\u00a0\"name\": \"{{ rand_first }} {{ rand_last }}\",\r\n\u00a0\u00a0\"nickname\": \"{{ rand_nickname }}\",\r\n\u00a0\u00a0\"picture\": \"\",\r\n\u00a0\u00a0\"user_id\": \"{{ rand_username }}\",\r\n\u00a0\u00a0\"email\": \"{{ rand_email }}\",\r\n\u00a0\u00a0\"email_verified\": \"{{ rand_bool }}\",\r\n\u00a0\u00a0\"first_name\": \"{{ rand_first }}\",\r\n\u00a0\u00a0\"last_name\": \"{{ rand_last }}\",\r\n\u00a0\u00a0\"address\": \"{{ rand_address }}\",\r\n\u00a0\u00a0\"city\": \"{{ rand_city }}\",\r\n\u00a0\u00a0\"state\": \"{{ rand_state }}\",\r\n\u00a0\u00a0\"zip_code\": \"{{ rand_zip_code }}\",\r\n\u00a0\u00a0\"phone\": \"{{ rand_phone }}\",\r\n\u00a0\u00a0\"date_of_birth\": \"{{ rand_dob_1 }}\"\r\n\u00a0\u00a0},\r\n\"idkey\": \"record_id\",\r\n\"primary_index\": true,\r\n\"override_count\": false,\r\n\"indexes\": [\r\n\u00a0\u00a0\"record_id\",\r\n\u00a0\u00a0\"nickname\",\r\n\u00a0\u00a0\"user_id\"\r\n\u00a0\u00a0]\r\n},<\/pre>\n<p>Aproveitamos o <em>cb_perf<\/em> para a cole\u00e7\u00e3o de imagens para criar uma imagem JPEG aleat\u00f3ria (ele cria um mapa aleat\u00f3rio de valores RGB para criar uma imagem de cores aleat\u00f3rias). Definimos o seguinte:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><em>Definir record_id<\/em> para ser a ID da imagem.<\/li>\n<li>Crie um \u00edndice prim\u00e1rio e secund\u00e1rio no campo ID.<\/li>\n<li>Use uma quantidade de imagens igual \u00e0 contagem de registros solicitada.<\/li>\n<li>Substituir a fun\u00e7\u00e3o <i>tamanho padr\u00e3o do lote <\/i>para opera\u00e7\u00f5es ass\u00edncronas (o padr\u00e3o \u00e9 100) para defini-lo como 10, pois esses documentos s\u00e3o grandes (aproximadamente 70 KiB por documento). N\u00e3o queremos criar um gargalo se carregarmos dados em uma rede de longa dist\u00e2ncia ou na Internet. O padr\u00e3o pode ser usado em uma rede privada de alta taxa de transfer\u00eancia, como uma VPC de nuvem ou um data center corporativo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13149\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/04\/image1-3.png\" alt=\"Sample random image generated by cb_perf\" width=\"214\" height=\"214\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image1-3.png 128w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image1-3-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image1-3-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image1-3-20x20.png 20w\" sizes=\"auto, (max-width: 214px) 100vw, 214px\" \/><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\"name\": \"user_images\",\r\n\"schema\": {\r\n\u00a0\u00a0\"record_id\": \"record_id\",\r\n\u00a0\u00a0\"type\": \"jpeg\",\r\n\u00a0\u00a0\"image\": \"{{ rand_image }}\"\r\n\u00a0\u00a0},\r\n\"idkey\": \"record_id\",\r\n\"primary_index\": true,\r\n\"override_count\": false,\r\n\"batch_size\": 10,\r\n\"indexes\": [\r\n\u00a0\u00a0\"record_id\"\r\n]\r\n},<\/pre>\n<p><span style=\"font-weight: 400;\">Criamos apenas um \u00fanico registro de autentica\u00e7\u00e3o no <\/span><span style=\"font-weight: 400;\">service_auth<\/span><span style=\"font-weight: 400;\"> pois isso \u00e9 tudo o que \u00e9 necess\u00e1rio.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\"name\": \"service_auth\",\r\n\"schema\": {\r\n\u00a0\u00a0\"record_id\": \"record_id\",\r\n\u00a0\u00a0\"token\": \"{{ rand_hash }}\"\r\n\u00a0\u00a0},\r\n\"idkey\": \"record_id\",\r\n\"primary_index\": true,\r\n\"override_count\": true,\r\n\"record_count\": 1,\r\n\"indexes\": [\r\n\u00a0\u00a0\"record_id\"\r\n]\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Na parte final, conectamos os registros de imagem aos registros de perfil. Usamos a regra \"link\" como parte da defini\u00e7\u00e3o do esquema. As regras de esquema s\u00e3o executadas ap\u00f3s um carregamento de dados. Estamos simplesmente extraindo a lista de chaves de registro de imagem e atualizando o campo de imagem nos documentos de perfil para incluir uma refer\u00eancia \u00e0 chave de imagem.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">\"rules\": [\r\n{\r\n\u00a0\u00a0\"name\": \"rule0\",\r\n\u00a0\u00a0\"type\": \"link\",\r\n\u00a0\u00a0\"foreign_key\": \"sample_app:profiles:user_data:picture\",\r\n\u00a0\u00a0\"primary_key\": \"sample_app:profiles:user_images:record_id\"\r\n}\r\n]<\/pre>\n<h3><span style=\"font-weight: 400;\">Carregando os dados gerados<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">O Cb_perf tem um modo de carregamento que cria o n\u00famero especificado de registros do esquema solicitado para carregar os dados.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:sh decode:true\">% .\/cb_perf load --host db.example.com --schema profile_demo -u developer -p password --count 1000<\/pre>\n<p><span style=\"font-weight: 400;\">Quando conclu\u00eddo, os dados ser\u00e3o carregados e os \u00edndices ser\u00e3o criados. Voc\u00ea est\u00e1 pronto para executar e testar os microsservi\u00e7os. O utilit\u00e1rio gera automaticamente IDs de documentos (o ID do documento do Couchbase nos metadados do documento, em oposi\u00e7\u00e3o ao ID do registro no documento) para ser o nome da cole\u00e7\u00e3o, mais dois pontos e o ID do registro. Aqui, podemos ver um exemplo do que foi carregado na UI do Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13148 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/04\/image2-3.png\" alt=\"Python series - Viewing randomized JSON data document in Couchbase\" width=\"959\" height=\"588\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image2-3.png 959w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image2-3-300x184.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image2-3-768x471.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/image2-3-20x12.png 20w\" sizes=\"auto, (max-width: 959px) 100vw, 959px\" \/><\/span><\/p>\n<h3><span style=\"font-weight: 400;\">A seguir<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Isso conclui a s\u00e9rie Criando um microsservi\u00e7o Python com o Couchbase. No entanto, aguarde futuras atualiza\u00e7\u00f5es sobre novos recursos que est\u00e3o sendo adicionados ao <\/span><i><span style=\"font-weight: 400;\">cb_perf <\/span><\/i><span style=\"font-weight: 400;\">e outros t\u00f3picos. Obrigado por ler esta s\u00e9rie. Espero que a tenha considerado informativa.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Recursos Python e links de s\u00e9ries de blogs<\/span><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/mminichino\/cbperf\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Baixe o utilit\u00e1rio cb_perf do meu GitHub<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Leia as postagens anteriores desta s\u00e9rie:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-1\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Parte 1 - Criando um microsservi\u00e7o Python com o Couchbase<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Parte 2<\/span><\/a> e\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Parte 3<\/span><\/a> (final)<\/li>\n<\/ul>\n<\/li>\n<li aria-level=\"2\">Documentos do Couchbase Python SDK - <a href=\"https:\/\/docs.couchbase.com\/python-sdk\/current\/hello-world\/start-using-sdk.html\" target=\"_blank\" rel=\"noopener\">Primeiros passos com o Python SDK<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3><span style=\"font-weight: 400;\">Fato engra\u00e7ado aleat\u00f3rio<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Em um universo muito, muito distante, em uma \u00e9poca tecnol\u00f3gica diferente, o Perl era a linguagem interpretada mais popular. Ela cresceu de uma linguagem de processamento de texto (como o cl\u00e1ssico AWK do UNIX) para uma linguagem de uso geral onipresente. Entre 1996 e 2000, a comunidade Perl decidiu se inspirar na antiga competi\u00e7\u00e3o Obfuscated C e realizou competi\u00e7\u00f5es Obfuscated Perl. A sintaxe solta e de forma livre do Perl certamente pode levar a programas dif\u00edceis de decifrar, portanto, \u00e9 natural que tenha havido uma competi\u00e7\u00e3o desse tipo. Todo programador, em algum momento, olha para algo que escreveu, talvez alimentado por cafe\u00edna e priva\u00e7\u00e3o de sono, e se pergunta o que isso faz.\u00a0<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">python3 -c \"print(bytearray([ord(b'a')+b%26 for b in [19,7,0,13,10,18]]).decode('utf-8'))\"<\/pre>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Recap In the previous two installments of this series, we discussed the drivers behind creating microservices. We also looked at why Couchbase is the perfect datastore to use with such an architecture. We also looked at three variants of a [&hellip;]<\/p>","protected":false},"author":81015,"featured_media":13151,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1816,1819,9139,2201],"tags":[1261,2103,1877],"ppma_author":[9550],"class_list":["post-13147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-server","category-data-modeling","category-python","category-tools-sdks","tag-json","tag-microservices","tag-testing"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Build A Python Microservice With Couchbase - Part 3<\/title>\n<meta name=\"description\" content=\"Python series - part 3 of building a microservice, in this post we create randomized JSON sample data for testing microservices in Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build A Python Microservice With Couchbase - Part 3\" \/>\n<meta property=\"og:description\" content=\"Python series - part 3 of building a microservice, in this post we create randomized JSON sample data for testing microservices in Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-27T03:13:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:04:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1341\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Michael Minichino\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Minichino\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/\"},\"author\":{\"name\":\"Michael Minichino\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/15ea6a51d53d4739913c98d25a8d7e77\"},\"headline\":\"Build A Python Microservice With Couchbase &#8211; Part 3\",\"datePublished\":\"2022-04-27T03:13:45+00:00\",\"dateModified\":\"2025-06-14T06:04:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/\"},\"wordCount\":1367,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg\",\"keywords\":[\"JSON\",\"microservices\",\"testing\"],\"articleSection\":[\"Application Design\",\"Couchbase Server\",\"Data Modeling\",\"Python\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/\",\"name\":\"Build A Python Microservice With Couchbase - Part 3\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg\",\"datePublished\":\"2022-04-27T03:13:45+00:00\",\"dateModified\":\"2025-06-14T06:04:15+00:00\",\"description\":\"Python series - part 3 of building a microservice, in this post we create randomized JSON sample data for testing microservices in Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg\",\"width\":2560,\"height\":1341,\"caption\":\"Creating test data for Python microservices in Couchbase\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build A Python Microservice With Couchbase &#8211; Part 3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/15ea6a51d53d4739913c98d25a8d7e77\",\"name\":\"Michael Minichino\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ed87fc8ff8aedc56f9872fbd77382f29\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png\",\"caption\":\"Michael Minichino\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-minichino\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Build A Python Microservice With Couchbase - Part 3","description":"S\u00e9rie Python - parte 3 da cria\u00e7\u00e3o de um microsservi\u00e7o, nesta postagem criamos dados de amostra JSON aleat\u00f3rios para testar microsservi\u00e7os no Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/","og_locale":"pt_BR","og_type":"article","og_title":"Build A Python Microservice With Couchbase - Part 3","og_description":"Python series - part 3 of building a microservice, in this post we create randomized JSON sample data for testing microservices in Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/build-a-python-microservice-with-couchbase-part-3\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-04-27T03:13:45+00:00","article_modified_time":"2025-06-14T06:04:15+00:00","og_image":[{"width":2560,"height":1341,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg","type":"image\/jpeg"}],"author":"Michael Minichino","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Michael Minichino","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/"},"author":{"name":"Michael Minichino","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/15ea6a51d53d4739913c98d25a8d7e77"},"headline":"Build A Python Microservice With Couchbase &#8211; Part 3","datePublished":"2022-04-27T03:13:45+00:00","dateModified":"2025-06-14T06:04:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/"},"wordCount":1367,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg","keywords":["JSON","microservices","testing"],"articleSection":["Application Design","Couchbase Server","Data Modeling","Python","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/","url":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/","name":"Build A Python Microservice With Couchbase - Part 3","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg","datePublished":"2022-04-27T03:13:45+00:00","dateModified":"2025-06-14T06:04:15+00:00","description":"S\u00e9rie Python - parte 3 da cria\u00e7\u00e3o de um microsservi\u00e7o, nesta postagem criamos dados de amostra JSON aleat\u00f3rios para testar microsservi\u00e7os no Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/build-microservice-python-couchbase-scaled.jpg","width":2560,"height":1341,"caption":"Creating test data for Python microservices in Couchbase"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/build-a-python-microservice-with-couchbase-part-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build A Python Microservice With Couchbase &#8211; Part 3"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/15ea6a51d53d4739913c98d25a8d7e77","name":"Michael Minichino","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ed87fc8ff8aedc56f9872fbd77382f29","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png","caption":"Michael Minichino"},"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-minichino\/"}]}},"authors":[{"term_id":9550,"user_id":81015,"is_guest":0,"slug":"michael-minichino","display_name":"Michael Minichino","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/Screen-Shot-2022-03-28-at-12.40.06-PM.png"},"author_category":"","last_name":"Minichino","first_name":"Michael","job_title":"","user_url":"","description":"Michael Minichino \u00e9 engenheiro de solu\u00e7\u00f5es principal da Couchbase"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/81015"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=13147"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13147\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13151"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13147"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}