{"id":5235,"date":"2018-06-05T04:50:16","date_gmt":"2018-06-05T11:50:16","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5235"},"modified":"2023-06-13T02:19:55","modified_gmt":"2023-06-13T09:19:55","slug":"elastic-microservices-with-kubernetes-and-spring-boot","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/elastic-microservices-with-kubernetes-and-spring-boot\/","title":{"rendered":"Cria\u00e7\u00e3o de microsservi\u00e7os el\u00e1sticos com Kubernetes e Spring Boot"},"content":{"rendered":"<p>Al\u00e9m de todas as discuss\u00f5es recentes sobre o Kubernetes e se voc\u00ea deve ou n\u00e3o Dockerizar seu banco de dados, hoje eu gostaria de mostrar por que essas duas coisas podem ser boas solu\u00e7\u00f5es quando a escalabilidade e a elasticidade s\u00e3o um grande requisito em sua arquitetura.<\/p>\n<p>O segredo aqui \u00e9 simples: <span style=\"font-weight: 400\">Spring Boot com Kubernetes para <\/span>implanta\u00e7\u00e3o do aplicativo e do banco de dados usando NoSQL.<\/p>\n<p>&nbsp;<\/p>\n<h3>Por que NoSQL e Spring Data?<\/h3>\n<p>Com os bancos de dados de documentos, \u00e9 poss\u00edvel evitar muitas jun\u00e7\u00f5es desnecess\u00e1rias, pois toda a estrutura \u00e9 armazenada em um \u00fanico documento. Portanto, ele ter\u00e1 um desempenho naturalmente mais r\u00e1pido do que um modelo relacional \u00e0 medida que seus dados crescerem.<\/p>\n<p>Se voc\u00ea estiver usando qualquer uma das linguagens JVM, o Spring Data e o Spring Boot podem ser algo bastante familiar para voc\u00ea. Assim, voc\u00ea pode come\u00e7ar rapidamente com o NoSQL mesmo sem nenhum conhecimento pr\u00e9vio.<\/p>\n<p>&nbsp;<\/p>\n<h3>Por que Kubernetes?<\/h3>\n<p>O Kubernetes (K8s) permite escalonar para cima e para baixo seu aplicativo sem estado em um ambiente independente de nuvem. Nas \u00faltimas vers\u00f5es, o K8s tamb\u00e9m adicionou a capacidade de executar aplicativos com estado, como bancos de dados, e esse \u00e9 um dos (muitos) motivos pelos quais ele \u00e9 um tema t\u00e3o importante atualmente.<\/p>\n<p>Eu mostrei em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/databases-on-kubernetes\/\">Minha postagem anterior no blog<\/a> como implantar o Couchbase no K8s e como torn\u00e1-lo \"el\u00e1stico\", aumentando e diminuindo a escala facilmente. Se voc\u00ea ainda n\u00e3o o leu, dedique alguns minutos extras \u00e0 transcri\u00e7\u00e3o do v\u00eddeo, pois ela \u00e9 uma parte importante do que falaremos aqui.<\/p>\n<p>&nbsp;<\/p>\n<h2>Cria\u00e7\u00e3o de um microsservi\u00e7o de perfil de usu\u00e1rio<\/h2>\n<p>Na maioria dos sistemas, o usu\u00e1rio (e todas as entidades relacionadas) \u00e9 o dado acessado com mais frequ\u00eancia. Consequentemente, essa \u00e9 uma das primeiras partes do sistema que precisa passar por algum tipo de otimiza\u00e7\u00e3o \u00e0 medida que os dados crescem.<\/p>\n<p>Adicionar uma camada de cache \u00e9 o primeiro tipo de otimiza\u00e7\u00e3o que podemos pensar. No entanto, ainda n\u00e3o \u00e9 a \"solu\u00e7\u00e3o final\". As coisas podem ficar um pouco mais complicadas se voc\u00ea tiver milhares de usu\u00e1rios ou se precisar armazenar entidades relacionadas ao usu\u00e1rio tamb\u00e9m na mem\u00f3ria.<\/p>\n<p>O gerenciamento de grandes quantidades de perfis de usu\u00e1rios \u00e9 uma boa op\u00e7\u00e3o para bancos de dados de documentos. Basta dar uma olhada no <a href=\"https:\/\/www.youtube.com\/watch?v=B3IGuOzuL3I\">Caso de uso do Pok\u00e9mon Go<\/a>por exemplo. Portanto, a cria\u00e7\u00e3o de um servi\u00e7o de perfil de usu\u00e1rio altamente dimension\u00e1vel e el\u00e1stico parece ser um desafio suficientemente bom para demonstrar como projetar um microsservi\u00e7o altamente dimension\u00e1vel.<\/p>\n<h4>O que voc\u00ea vai precisar:<\/h4>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">Couchbase<\/a><\/li>\n<li>JDK e o plug-in do Lombok para <a href=\"https:\/\/projectlombok.org\/setup\/eclipse\">Eclipse<\/a> ou <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6317-lombok-plugin\">Intellij<\/a><\/li>\n<li>\u00a0Maven<\/li>\n<li>Um cluster do Kubernetes - estou executando este exemplo em 3 n\u00f3s no AWS (n\u00e3o recomendo usar o minikube). Se voc\u00ea n\u00e3o sabe como configurar um, assista a este v\u00eddeo <a href=\"https:\/\/www.youtube.com\/watch?v=bzBtR0N0QBI\">v\u00eddeo<\/a>.<\/li>\n<\/ul>\n<h2><strong>O C\u00f3digo<\/strong><\/h2>\n<p>Voc\u00ea pode clonar o projeto inteiro aqui:<\/p>\n<pre class=\"lang:default decode:true\">https:\/\/github.com\/couchbaselabs\/kubernetes-starter-kit<\/pre>\n<p>&nbsp;<\/p>\n<p>Vamos come\u00e7ar criando nossa entidade principal chamada Usu\u00e1rio:<\/p>\n<pre class=\"lang:java decode:true\">@Document\r\n@Data\r\n@AllArgsConstructor\r\n@NoArgsConstructor\r\n@EqualsAndHashCode\r\npublic class User extends BasicEntity {\r\n\r\n    @NotNull\r\n    @Id\r\n    private String id;\r\n\r\n    @NotNull\r\n    @Field\r\n    private String name;\r\n\r\n    @Field\r\n    private Address address;\r\n\r\n    @Field\r\n    private List&lt;Preference&gt; preferences = new ArrayList&lt;&gt;();\r\n\r\n    @Field\r\n    private List&lt;String&gt; securityRoles = new ArrayList&lt;&gt;();\r\n\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Nessa entidade, temos duas propriedades importantes:<\/p>\n<ul>\n<li><strong>securityRoles:<\/strong> Todas as fun\u00e7\u00f5es que o usu\u00e1rio pode desempenhar no sistema.<\/li>\n<li><strong>prefer\u00eancias:<\/strong> Todas as poss\u00edveis prefer\u00eancias que o usu\u00e1rio possa ter, como idioma, notifica\u00e7\u00f5es, moeda etc.<\/li>\n<\/ul>\n<p>Agora, vamos brincar um pouco com nosso Reposit\u00f3rio. Como estamos usando o Spring Data, voc\u00ea pode usar praticamente todos os seus recursos aqui:<\/p>\n<pre class=\"lang:default decode:true\">@N1qlPrimaryIndexed\r\n@ViewIndexed(designDoc = \"user\")\r\npublic interface UserRepository extends CouchbasePagingAndSortingRepository&lt;User, String&gt; {\r\n    List&lt;User&gt; findByName(String name);\r\n}<\/pre>\n<h6>Se voc\u00ea quiser saber mais sobre o Couchbase e o Spring Data,<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-spring-boot-spring-data\/\"> Confira este tutorial<\/a>.<\/h6>\n<p>Tamb\u00e9m implementamos dois outros m\u00e9todos:<\/p>\n<pre class=\"lang:default decode:true\">@Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and ANY preference IN \" +\r\n            \" preferences SATISFIES preference.name = $1 END\")\r\nList&lt;User&gt; findUsersByPreferenceName(String name);\r\n\r\n@Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and meta().id = $1 and ARRAY_CONTAINS(securityRoles, $2)\")\r\nUser hasRole(String userId, String role);<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li><strong>hasRole:<\/strong> Verifica se um usu\u00e1rio tem uma fun\u00e7\u00e3o especificada:<\/li>\n<li><strong>findUsersByPreferencyName:<\/strong> Como o nome diz, ele encontra todos os usu\u00e1rios que cont\u00eam uma determinada prefer\u00eancia.<\/li>\n<\/ul>\n<p>Observe que estamos usando a sintaxe N1QL no c\u00f3digo acima, pois ela torna as consultas muito mais simples do que o uso de JQL simples.<\/p>\n<p>Al\u00e9m disso, voc\u00ea pode executar todos os testes para se certificar de que tudo est\u00e1 funcionando corretamente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5236\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-1024x312.png\" alt=\"\" width=\"693\" height=\"211\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-1024x312.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-300x91.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-768x234.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-1536x468.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM-1320x402.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-11.10.30-AM.png 1876w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/p>\n<p>N\u00e3o se esque\u00e7a de alterar seu application.properties com as credenciais corretas do seu banco de dados:<\/p>\n<pre class=\"lang:default decode:true\">spring.couchbase.bootstrap-hosts=localhost\r\nspring.couchbase.bucket.name=test\r\nspring.couchbase.bucket.password=couchbase\r\nspring.data.couchbase.auto-index=true<\/pre>\n<p>Para testar nosso microsservi\u00e7o, adicionei alguns endpoints Restful:<\/p>\n<pre class=\"lang:default decode:true\">@RestController\r\n@RequestMapping(\"\/api\/user\")\r\npublic class UserServiceController {\r\n\r\n    @Autowired\r\n    private UserService userService;\r\n    \r\n    @RequestMapping(value = \"\/{id}\", method = GET, produces = APPLICATION_JSON_VALUE)\r\n    public User findById(@PathParam(\"id\") String id) {\r\n        return userService.findById(id);\r\n    }\r\n\r\n    @RequestMapping(value = \"\/preference\", method = GET, produces = APPLICATION_JSON_VALUE)\r\n    public List&lt;User&gt; findPreference(@RequestParam(\"name\") String name) {\r\n        return userService.findUsersByPreferenceName(name);\r\n    }\r\n\r\n    @RequestMapping(value = \"\/find\", method = GET, produces = APPLICATION_JSON_VALUE)\r\n    public List&lt;User&gt; findUserByName(@RequestParam(\"name\") String name) {\r\n        return userService.findByName(name);\r\n    }\r\n\r\n    @RequestMapping(value = \"\/save\", method = POST, produces = APPLICATION_JSON_VALUE)\r\n    public User findUserByName(@RequestBody User user) {\r\n        return userService.save(user);\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3>Dockerizando seu microsservi\u00e7o<\/h3>\n<p>Primeiro, altere seu <strong>application.properties<\/strong> para obter as credenciais de conex\u00e3o das vari\u00e1veis de ambiente:<\/p>\n<pre class=\"lang:default decode:true\">spring.couchbase.bootstrap-hosts=${COUCHBASE_HOST}\r\nspring.couchbase.bucket.name=${COUCHBASE_BUCKET}\r\nspring.couchbase.bucket.password=${COUCHBASE_PASSWORD}\r\nspring.data.couchbase.auto-index=true<\/pre>\n<p>E agora podemos criar nosso Dockerfile:<\/p>\n<pre class=\"lang:default decode:true\">FROM openjdk:8-jdk-alpine\r\nVOLUME \/tmp\r\nMAINTAINER Denis Rosa &lt;denis.rosa@couchbase.com&gt;\r\nARG JAR_FILE\r\nADD ${JAR_FILE} app.jar\r\nENTRYPOINT [\"java\",\"-Djava.security.egd=file:\/dev\/.\/urandom\",\"-jar\",\"\/app.jar\"]<\/pre>\n<p>Em seguida, criamos e publicamos nossa imagem no Docker Hub:<\/p>\n<ul>\n<li>Crie sua imagem:<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">.\/mvnw install dockerfile:build -DskipTests<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>Fa\u00e7a login no Docker Hub a partir da linha de comando<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">docker login<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5237\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-1024x103.png\" alt=\"\" width=\"900\" height=\"91\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-1024x103.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-300x30.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-768x77.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-1536x155.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-20x2.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM-1320x133.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.06.07-PM.png 1788w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<ul>\n<li>\u00a0Vamos pegar o imageId de nossa imagem criada recentemente:\n<pre class=\"lang:default decode:true\">imagens do docker<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5238\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-1024x119.png\" alt=\"\" width=\"900\" height=\"105\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-1024x119.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-300x35.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-768x89.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-20x2.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM-1320x153.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.03.00-PM.png 1376w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/li>\n<li>Crie sua nova tag usando o imageId:<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">\/\/docker tag YOUR_IMAGE_ID YOUR_USER\/REPO_NAME\r\ndocker tag 3f9db98544bd deniswsrosa\/kubernetes-starter-kit<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>Por fim, impulsione sua imagem:\n<pre class=\"lang:default decode:true\">docker push deniswsrosa\/kubernetes-starter-kit<\/pre>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5239\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-1024x176.png\" alt=\"\" width=\"900\" height=\"155\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-1024x176.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-300x52.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-768x132.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM-1320x227.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.32.32-PM.png 1350w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/>Sua imagem agora deve estar dispon\u00edvel no Docker Hub:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5240\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-1024x131.png\" alt=\"\" width=\"610\" height=\"78\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-1024x131.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-300x38.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-768x98.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-1536x196.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM-1320x169.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-1.34.30-PM.png 1596w\" sizes=\"auto, (max-width: 610px) 100vw, 610px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>Configura\u00e7\u00e3o do banco de dados<\/h3>\n<p>Escrevi um artigo inteiro sobre isso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/databases-on-kubernetes\/\">aqui<\/a>mas para ser breve. Basta executar os seguintes comandos <strong>dentro do diret\u00f3rio do kubernetes<\/strong>.<\/p>\n<pre class=\"lang:default decode:true\">.\/rbac\/cluster_role.sh\r\nkubectl create -f secret.yaml\r\nkubectl create -f operator.yaml\r\nkubectl create -f couchbase-cluster.yaml<\/pre>\n<p>Depois de algum tempo, todas as tr\u00eas inst\u00e2ncias do nosso banco de dados dever\u00e3o estar em execu\u00e7\u00e3o:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5242\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM-1024x152.png\" alt=\"\" width=\"900\" height=\"134\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM-1024x152.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM-300x45.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM-768x114.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.30.34-PM.png 1250w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Vamos encaminhar a porta do Console da Web para nossa m\u00e1quina local:<\/p>\n<pre class=\"lang:default decode:true\">kubectl port-forward cb-example-0000 8091:8091<\/pre>\n<p>E agora podemos acessar o console da Web em https:\/\/localhost:8091. Voc\u00ea pode fazer login usando o nome de usu\u00e1rio <strong>Administrador<\/strong>\u00a0e a senha <strong>senha<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5241\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-1024x390.png\" alt=\"\" width=\"729\" height=\"278\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-1024x390.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-300x114.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-768x292.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-1536x585.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-2048x780.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-3.36.36-PM-1320x503.png 1320w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/p>\n<p>Ir para <strong>Seguran\u00e7a -&gt; ADICIONAR USU\u00c1RIO<\/strong> com as seguintes propriedades:<\/p>\n<ul>\n<li><strong>Nome de usu\u00e1rio:<\/strong> amostra de couchbase<\/li>\n<li><strong>Nome completo:<\/strong> amostra de couchbase<\/li>\n<li><strong>Senha:<\/strong> amostra de couchbase<\/li>\n<li><strong>Verificar senha:<\/strong> amostra de couchbase<\/li>\n<li><strong>Fun\u00e7\u00f5es:<\/strong> De acordo com a imagem abaixo:<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5250\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM-1024x880.png\" alt=\"\" width=\"511\" height=\"439\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM-1024x880.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM-300x258.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM-768x660.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM-20x17.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-05-at-12.25.32-PM.png 1282w\" sizes=\"auto, (max-width: 511px) 100vw, 511px\" \/><\/p>\n<h6 style=\"text-align: center\"><strong>OBS<\/strong>: Em um ambiente de produ\u00e7\u00e3o, n\u00e3o adicione seu aplicativo como administrador<\/h6>\n<p>&nbsp;<\/p>\n<h3>Implanta\u00e7\u00e3o de seu microsservi\u00e7o<\/h3>\n<p>Primeiro, vamos criar um segredo do Kubernetes onde armazenaremos a senha para nos conectarmos ao nosso banco de dados:<\/p>\n<pre class=\"\">apiVersion: v1\r\nkind: Secret\r\nmetadata:\r\n  name: spring-boot-app-secret\r\ntype: Opaque\r\ndata:\r\n  bucket_password: Y291Y2hiYXNlLXNhbXBsZQ== #couchbase-sample in base64<\/pre>\n<p>Execute o seguinte comando para criar o segredo:<\/p>\n<pre class=\"lang:default decode:true\">kubectl create -f spring-boot-app-secret.yaml<\/pre>\n<p>O arquivo <strong>spring-boot-app.yaml<\/strong> \u00e9 o respons\u00e1vel pela implanta\u00e7\u00e3o do nosso aplicativo. Vamos dar uma olhada em seu conte\u00fado:<\/p>\n<pre class=\"lang:yaml decode:true\">apiVersion: apps\/v1beta1\r\nkind: Deployment\r\nmetadata:\r\n  name: spring-boot-deployment\r\nspec:\r\n  selector:\r\n    matchLabels:\r\n      app: spring-boot-app\r\n  replicas: 2 # tells deployment to run 2 pods matching the template\r\n  template: # create pods using pod definition in this template\r\n    metadata:\r\n      labels:\r\n        app: spring-boot-app\r\n    spec:\r\n      containers:\r\n      - name: spring-boot-app\r\n        image: deniswsrosa\/kubernetes-starter-kit\r\n        imagePullPolicy: Always\r\n        ports:\r\n        - containerPort: 8080\r\n          name: server\r\n        - containerPort: 8081\r\n          name: management\r\n        env:\r\n        - name: COUCHBASE_PASSWORD\r\n          valueFrom:\r\n            secretKeyRef:\r\n              name: spring-boot-app-secret\r\n              key: bucket_password\r\n        - name: COUCHBASE_BUCKET\r\n          value: couchbase-sample\r\n        - name: COUCHBASE_HOST\r\n          value: cb-example<\/pre>\n<p>Gostaria de destacar algumas partes importantes desse arquivo:<\/p>\n<ul>\n<li><strong>r\u00e9plicas: 2 -&gt;<\/strong> O Kubernetes iniciar\u00e1 duas inst\u00e2ncias do nosso aplicativo<\/li>\n<li>\u00a0<strong>imagem: deniswsrosa\/kubernetes-starter-kit -&gt;<\/strong> A imagem do docker que criamos anteriormente.<\/li>\n<li><strong>cont\u00eaineres: nome: -&gt;<\/strong> Aqui \u00e9 onde definimos o nome do cont\u00eainer que executa nosso aplicativo. Voc\u00ea usar\u00e1 esse nome no Kubernetes sempre que quiser definir quantas inst\u00e2ncias devem estar em execu\u00e7\u00e3o, estrat\u00e9gias de escalonamento autom\u00e1tico, balanceamento de carga etc.<\/li>\n<li><strong>env: -&gt;<\/strong>\u00a0\u00c9 aqui que definimos as vari\u00e1veis de ambiente do nosso aplicativo. Observe que tamb\u00e9m estamos nos referindo ao segredo que criamos anteriormente.<\/li>\n<\/ul>\n<p>Execute o seguinte comando para implementar nosso aplicativo:<\/p>\n<pre class=\"lang:default decode:true\">kubectl create -f spring-boot-app.yaml<\/pre>\n<p>Em alguns segundos, voc\u00ea perceber\u00e1 que as duas inst\u00e2ncias do seu aplicativo j\u00e1 est\u00e3o em execu\u00e7\u00e3o:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5243\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-1024x217.png\" alt=\"\" width=\"900\" height=\"191\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-1024x217.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-300x63.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-768x162.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM.png 1106w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Por fim, vamos expor nosso microsservi\u00e7o ao mundo externo. H\u00e1 dezenas de possibilidades diferentes de como isso pode ser feito. No nosso caso, vamos simplesmente criar um balanceador de carga:<\/p>\n<pre class=\"lang:yaml decode:true\">apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n  name: spring-boot-load-balancer\r\nspec:\r\n  ports:\r\n  - port: 8080\r\n    targetPort: 8080\r\n    name: http\r\n  - port: 8081\r\n    targetPort: 8081\r\n    name: management\r\n  selector:\r\n    app: spring-boot-app\r\n  type: LoadBalancer<\/pre>\n<p>O seletor \u00e9 uma das partes mais importantes do arquivo acima. \u00c9 onde definimos os cont\u00eaineres para os quais o tr\u00e1fego ser\u00e1 redirecionado. Nesse caso, estamos apenas apontando para o aplicativo que implantamos anteriormente.<\/p>\n<p>Execute o seguinte comando para criar nosso balanceador de carga:<\/p>\n<pre class=\"lang:default decode:true\">kubectl create -f spring-boot-load-balancer.yaml<\/pre>\n<p>O balanceador de carga levar\u00e1 alguns minutos para ser ativado e redirecionar o tr\u00e1fego para nossos pods. Voc\u00ea pode executar o seguinte comando para verificar seu status:<\/p>\n<pre class=\"lang:default decode:true\">kubectl describe service spring-boot-load-balancer<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5244\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-1024x543.png\" alt=\"\" width=\"900\" height=\"477\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-1024x543.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-300x159.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-768x407.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-818x434.png 818w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.44.05-PM.png 1286w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Como voc\u00ea pode ver na imagem acima, nosso balanceador de carga pode ser acessado em ad84a916d65ad11e884a20266aa53c9-1223617270.us-west-2.elb.amazonaws.com, e o targetPort 8080 redirecionar\u00e1 o tr\u00e1fego para dois endpoints: 10.2.1.6:8080 e 10.2.2.7:8080<\/p>\n<p>Por fim, podemos acessar nosso aplicativo e come\u00e7ar a enviar solicita\u00e7\u00f5es a ele:<\/p>\n<ul>\n<li>Inser\u00e7\u00e3o de um novo usu\u00e1rio:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5245\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-1024x760.png\" alt=\"\" width=\"649\" height=\"482\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-1024x760.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-300x223.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-768x570.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-1536x1140.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM-1320x980.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.32.45-PM.png 1956w\" sizes=\"auto, (max-width: 649px) 100vw, 649px\" \/><\/li>\n<li>Busca de usu\u00e1rios:<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5246\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-1024x727.png\" alt=\"\" width=\"647\" height=\"459\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-1024x727.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-300x213.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-768x546.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-1536x1091.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM-1320x938.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-6.34.21-PM.png 1940w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>E quanto a ser el\u00e1stico?<\/h3>\n<p>\u00c9 aqui que as coisas ficam realmente interessantes. E se precisarmos aumentar a escala de todo o nosso microsservi\u00e7o? Digamos que a Black Friday esteja chegando e que precisemos preparar nossa infraestrutura para suportar esse fluxo maci\u00e7o de usu\u00e1rios que chegam ao nosso site. Bem, esse \u00e9 um problema f\u00e1cil de resolver:<\/p>\n<ul>\n<li>\u00a0Para escalonar nosso aplicativo, basta alterar o n\u00famero de r\u00e9plicas no <strong>spring-boot-app.yaml<\/strong> arquivo.\n<pre class=\"lang:yaml decode:true\">...\r\nspec:\r\n  selector:\r\n    matchLabels:\r\n      app: spring-boot-app\r\n  replicas: 6 # tells deployment to run 6 pods matching the template\r\n  template: # create pods using pod definition in this template\r\n    metadata:\r\n      labels:\r\n...<\/pre>\n<p>Em seguida, execute o seguinte comando:<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">kubectl replace -f spring-boot-app.yaml<\/pre>\n<p>Est\u00e1 faltando alguma coisa? Sim. E quanto ao nosso banco de dados? Devemos ampli\u00e1-lo tamb\u00e9m:<\/p>\n<ul>\n<li>Altere o atributo size no <strong>couchbase-cluster.yaml<\/strong> file:<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">...      \r\n     enableIndexReplica: false\r\n  servers:\r\n    - size: 6\r\n      name: all_services\r\n      services:\r\n        - data\r\n        - index\r\n...<\/pre>\n<p>&nbsp;<\/p>\n<p>Por fim, execute o seguinte comando:<\/p>\n<pre class=\"lang:default decode:true\">kubectl replace -f couchbase-cluster.yaml<\/pre>\n<p>&nbsp;<\/p>\n<h3>Como posso reduzir a escala?<\/h3>\n<p>Reduzir a escala \u00e9 t\u00e3o f\u00e1cil quanto aumentar a escala; voc\u00ea s\u00f3 precisa alterar ambos <strong>couchbase-cluster.yaml<\/strong> e <strong>spring-boot-app.yaml<\/strong>:<\/p>\n<ul>\n<li><strong>couchbase-cluster.yaml<\/strong><\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">...\r\n      enableIndexReplica: false\r\n  servers:\r\n    - size: 1\r\n      name: all_services\r\n      services:\r\n        - data\r\n        - index\r\n...<\/pre>\n<ul>\n<li><strong>spring-boot-app.yaml<\/strong>:<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">...\r\nspec:\r\n  selector:\r\n    matchLabels:\r\n      app: spring-boot-app\r\n  replicas: 1 \r\n  template:\r\n    metadata:\r\n      labels:\r\n...<\/pre>\n<p>&nbsp;<\/p>\n<p>E execute os seguintes comandos:<\/p>\n<pre class=\"lang:default decode:true\">kubectl replace -f couchbase-cluster.yaml\r\nkubectl replace -f spring-boot-app.yaml<\/pre>\n<p>&nbsp;<\/p>\n<h3>Escalonamento autom\u00e1tico de microsservi\u00e7os no Kubernetes<\/h3>\n<p>Vou me aprofundar nesse t\u00f3pico na parte 2 deste artigo. Enquanto isso, voc\u00ea pode conferir este v\u00eddeo sobre dimensionamento autom\u00e1tico de pods.<\/p>\n<h3>Solu\u00e7\u00e3o de problemas de sua implanta\u00e7\u00e3o do Kubernetes<\/h3>\n<p>Se seus pods n\u00e3o conseguirem iniciar, h\u00e1 muitas maneiras de solucionar o problema. No caso abaixo, ambos os aplicativos n\u00e3o conseguiram iniciar:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5247\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM-1024x266.png\" alt=\"\" width=\"900\" height=\"234\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM-1024x266.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM-300x78.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM-768x199.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.28.43-PM.png 1172w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Como eles fazem parte da implanta\u00e7\u00e3o, vamos descrever a implanta\u00e7\u00e3o para tentar entender o que est\u00e1 acontecendo:<\/p>\n<pre class=\"lang:default decode:true\">kubectl describe deployment spring-boot-deployment<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5248\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-1024x639.png\" alt=\"\" width=\"706\" height=\"441\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-1024x639.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-300x187.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-768x479.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM-1320x824.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.31.14-PM.png 1400w\" sizes=\"auto, (max-width: 706px) 100vw, 706px\" \/><\/p>\n<p>Bem, nada \u00e9 realmente relevante nesse caso. Ent\u00e3o, vamos dar uma olhada em um dos registros do pod:<\/p>\n<pre class=\"lang:default decode:true\">kubectl log spring-boot-deployment-74649f869d-74sq8<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5249\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-1024x375.png\" alt=\"\" width=\"753\" height=\"276\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-1024x375.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-300x110.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-768x281.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-1536x562.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-2048x750.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-5.33.50-PM-1320x483.png 1320w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><\/p>\n<p>Entendi! O aplicativo n\u00e3o foi iniciado porque esquecemos de criar o usu\u00e1rio no Couchbase. Basta criar o usu\u00e1rio para que os pods sejam ativados em alguns segundos:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5243\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-1024x217.png\" alt=\"\" width=\"740\" height=\"157\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-1024x217.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-300x63.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-768x162.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-01-at-4.14.19-PM.png 1106w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Os bancos de dados s\u00e3o aplicativos com estado, e dimension\u00e1-los n\u00e3o \u00e9 t\u00e3o r\u00e1pido quanto dimensionar aplicativos sem estado (e provavelmente nunca ser\u00e1), mas se voc\u00ea precisar criar uma arquitetura realmente el\u00e1stica, dever\u00e1 planejar o dimensionamento de todos os componentes da sua infraestrutura. Caso contr\u00e1rio, voc\u00ea estar\u00e1 apenas criando um gargalo em outro lugar.<\/p>\n<p>Neste artigo, tentei mostrar apenas uma pequena introdu\u00e7\u00e3o sobre como voc\u00ea pode tornar el\u00e1sticos seu aplicativo e seu banco de dados no Kubernetes. No entanto, essa ainda n\u00e3o \u00e9 uma arquitetura pronta para produ\u00e7\u00e3o. Ainda h\u00e1 muitos outros aspectos a serem considerados, e abordarei alguns deles nos pr\u00f3ximos artigos.<\/p>\n<p>Enquanto isso, se voc\u00ea tiver alguma d\u00favida, envie-me um tweet para <a href=\"https:\/\/twitter.com\/deniswsrosa\">@deniswsrosa<\/a> ou deixe um coment\u00e1rio abaixo.<\/p>\n<p>&nbsp;<\/p>\n<h3>Leia tamb\u00e9m:<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/fuzzy-matching\/\">Correspond\u00eancia difusa<\/a><\/li>\n<li>\n<p class=\"entry-title\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-on-openshift-in-action\/\">OpenShift em a\u00e7\u00e3o<\/a><\/p>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Apart from all the recent discussions about Kubernetes and whether you should Dockerize your database or not, today I would like to show you why those two things might be good solutions when scalability and elasticity is a big requirement [&hellip;]<\/p>","protected":false},"author":8754,"featured_media":10786,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814],"tags":[],"ppma_author":[9059],"class_list":["post-5235","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building Elastic Microservices With Kubernetes and Spring Boot<\/title>\n<meta name=\"description\" content=\"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.\" \/>\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\/elastic-microservices-with-kubernetes-and-spring-boot\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Elastic Microservices With Kubernetes, Spring Boot\" \/>\n<meta property=\"og:description\" content=\"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/elastic-microservices-with-kubernetes-and-spring-boot\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-05T11:50:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-13T09:19:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/cover-kube_RESIZED.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1700\" \/>\n\t<meta property=\"og:image:height\" content=\"638\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@deniswsrosa\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/\"},\"author\":{\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\"},\"headline\":\"Building Elastic Microservices With Kubernetes, Spring Boot\",\"datePublished\":\"2018-06-05T11:50:16+00:00\",\"dateModified\":\"2023-06-13T09:19:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/\"},\"wordCount\":1572,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png\",\"articleSection\":[\"Application Design\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/\",\"name\":\"Building Elastic Microservices With Kubernetes and Spring Boot\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png\",\"datePublished\":\"2018-06-05T11:50:16+00:00\",\"dateModified\":\"2023-06-13T09:19:55+00:00\",\"description\":\"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png\",\"width\":1700,\"height\":638,\"caption\":\"The Kubernetes logo with a plus sign followed by the Spring Boot logo with another plus sign and then the Couchbase logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Elastic Microservices With Kubernetes, Spring Boot\"}]},{\"@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\/fe3c5273e805e72a5294611a48f62257\",\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"caption\":\"Denis Rosa, Developer Advocate, Couchbase\"},\"description\":\"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.\",\"sameAs\":[\"https:\/\/x.com\/deniswsrosa\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/denis-rosa\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cria\u00e7\u00e3o de microsservi\u00e7os el\u00e1sticos com Kubernetes e Spring Boot","description":"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.","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\/elastic-microservices-with-kubernetes-and-spring-boot\/","og_locale":"pt_BR","og_type":"article","og_title":"Building Elastic Microservices With Kubernetes, Spring Boot","og_description":"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/elastic-microservices-with-kubernetes-and-spring-boot\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-06-05T11:50:16+00:00","article_modified_time":"2023-06-13T09:19:55+00:00","og_image":[{"width":1700,"height":638,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/cover-kube_RESIZED.png","type":"image\/png"}],"author":"Denis Rosa, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@deniswsrosa","twitter_misc":{"Written by":"Denis Rosa, Developer Advocate, Couchbase","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/"},"author":{"name":"Denis Rosa, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257"},"headline":"Building Elastic Microservices With Kubernetes, Spring Boot","datePublished":"2018-06-05T11:50:16+00:00","dateModified":"2023-06-13T09:19:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/"},"wordCount":1572,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png","articleSection":["Application Design"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/","url":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/","name":"Cria\u00e7\u00e3o de microsservi\u00e7os el\u00e1sticos com Kubernetes e Spring Boot","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png","datePublished":"2018-06-05T11:50:16+00:00","dateModified":"2023-06-13T09:19:55+00:00","description":"In this article, the author explains how to make both your application and database on Kubernetes elastic using microservices and Spring Boot.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/cover-kube_RESIZED.png","width":1700,"height":638,"caption":"The Kubernetes logo with a plus sign followed by the Spring Boot logo with another plus sign and then the Couchbase logo"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/elastic-microservices-with-kubernetes-and-spring-boot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Building Elastic Microservices With Kubernetes, Spring Boot"}]},{"@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\/fe3c5273e805e72a5294611a48f62257","name":"Denis Rosa, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6","url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","caption":"Denis Rosa, Developer Advocate, Couchbase"},"description":"Denis Rosa \u00e9 um Developer Advocate do Couchbase e mora em Munique, na Alemanha. Ele tem uma s\u00f3lida experi\u00eancia como engenheiro de software e fala fluentemente Java, Python, Scala e Javascript. Denis gosta de escrever sobre pesquisa, Big Data, IA, microsservi\u00e7os e tudo o mais que possa ajudar os desenvolvedores a criar um aplicativo bonito, mais r\u00e1pido, est\u00e1vel e escal\u00e1vel.","sameAs":["https:\/\/x.com\/deniswsrosa"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/denis-rosa\/"}]}},"authors":[{"term_id":9059,"user_id":8754,"is_guest":0,"slug":"denis-rosa","display_name":"Denis Rosa, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","author_category":"","last_name":"Rosa, Developer Advocate, Couchbase","first_name":"Denis","job_title":"","user_url":"","description":"Denis Rosa \u00e9 um Developer Advocate do Couchbase e mora em Munique, na Alemanha. Ele tem uma s\u00f3lida experi\u00eancia como engenheiro de software e fala fluentemente Java, Python, Scala e Javascript. Denis gosta de escrever sobre pesquisa, Big Data, IA, microsservi\u00e7os e tudo o mais que possa ajudar os desenvolvedores a criar um aplicativo bonito, mais r\u00e1pido, est\u00e1vel e escal\u00e1vel."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5235","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\/8754"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=5235"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5235\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10786"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=5235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=5235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=5235"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=5235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}