{"id":2483,"date":"2017-01-04T15:00:00","date_gmt":"2017-01-04T15:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2483"},"modified":"2021-01-25T13:50:10","modified_gmt":"2021-01-25T21:50:10","slug":"using-couchbase-in-a-golang-websocket-chat-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-in-a-golang-websocket-chat-application\/","title":{"rendered":"Uso do Couchbase em um aplicativo de bate-papo Websocket da Golang"},"content":{"rendered":"<p>N\u00e3o faz muito tempo, escrevi sobre a cria\u00e7\u00e3o de um <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2016\/12\/create-real-time-chat-app-golang-angular-2-websockets\/\">aplicativo de bate-papo que usava o Angular 2 para o front-end e o Golang para o back-end<\/a>. A comunica\u00e7\u00e3o de mensagens entre os dois foi poss\u00edvel gra\u00e7as aos websockets. Neste exemplo, qualquer n\u00famero de clientes Angular 2 poderia se conectar ao aplicativo Golang e se comunicar uns com os outros, mas os novos clientes n\u00e3o poderiam ver as mensagens anteriores. Isso ocorre porque os dados n\u00e3o estavam sendo salvos depois de serem enviados.<\/p>\n<div class=\"figure\"><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2017\/january\/using-couchbase-in-a-golang-websocket-chat-application\/golang-chat-couchbase.gif\" alt=\"Couchbase Golang Chat\" \/><\/div>\n<p>Vamos expandir o aplicativo Golang que foi criado anteriormente e incluir <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\">Couchbase<\/a> para que as mensagens sejam salvas depois de enviadas e, em seguida, sejam carregadas quando novos clientes se conectarem.<\/p>\n<h2 id=\"the-requirements\">Os requisitos<\/h2>\n<p>H\u00e1 alguns requisitos para dar andamento a esse projeto. Eles s\u00e3o os seguintes:<\/p>\n<ul>\n<li>Couchbase Server 4.1+.<\/li>\n<li><a href=\"https:\/\/golang.org\/\">Golang<\/a> 1.7+.<\/li>\n<li>Um cliente e um servidor de bate-papo em funcionamento, como visto no <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2016\/12\/create-real-time-chat-app-golang-angular-2-websockets\/\">tutorial anterior<\/a>.<\/li>\n<\/ul>\n<p>\u00c9 muito importante que voc\u00ea tenha o servidor de bate-papo funcionando, pois muito do que veremos ser\u00e1 uma revis\u00e3o do que foi feito no guia anterior. A inclus\u00e3o de um banco de dados NoSQL do Couchbase ser\u00e1 trivial, mas o Couchbase com suporte a consultas N1QL j\u00e1 deve estar instalado.<\/p>\n<h2 id=\"creating-a-couchbase-server-bucket-and-adding-an-index\">Cria\u00e7\u00e3o de um bucket do Couchbase Server e adi\u00e7\u00e3o de um \u00edndice<\/h2>\n<p>Este projeto exigir\u00e1 a cria\u00e7\u00e3o de pelo menos um bucket no Couchbase. Esse bucket armazenar\u00e1 todos os dados de mensagens enviadas de e para o servidor de bate-papo Golang. Os dados armazenados ser\u00e3o mais ou menos assim:<\/p>\n<pre><code>{\r\n  \"sender\": \"62f142ce-7308-4dae-9eb0-3ae61d363c22\",\r\n  \"content\": \"Hey there Nic Raboy!\",\r\n  \"timestamp\": 1482174735\r\n}<\/code><\/pre>\n<p>Voc\u00ea pode optar por usar o Couchbase <strong>padr\u00e3o<\/strong> ou voc\u00ea pode optar por criar um novo. Usarei um bucket chamado <strong>exemplo<\/strong> neste projeto.<\/p>\n<p>Como a consulta estar\u00e1 envolvida, precisamos definir pelo menos um \u00edndice que possa ser usado em nosso bucket. Esse \u00edndice pode ser criado usando o Couchbase Query Workbench ou o Couchbase Shell (CBQ). Usando uma dessas ferramentas, execute o seguinte:<\/p>\n<pre><code>CREATE PRIMARY INDEX ON `example` USING GSI;<\/code><\/pre>\n<p>Com o \u00edndice criado, o aplicativo pode ser modificado para incluir o armazenamento NoSQL.<\/p>\n<h2 id=\"establishing-a-connection-to-couchbase-server\">Estabelecimento de uma conex\u00e3o com o servidor Couchbase<\/h2>\n<p>Antes de come\u00e7armos a salvar os dados no Couchbase, \u00e9 necess\u00e1rio estabelecer uma conex\u00e3o a partir do nosso aplicativo Go. Se voc\u00ea seguiu a instru\u00e7\u00e3o <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2016\/12\/create-real-time-chat-app-golang-angular-2-websockets\/\">guia anterior<\/a>seu aplicativo Go pode estar em um caminho semelhante a <strong>$GOPATH\/src\/github.com\/nraboy\/realtime-chat\/main.go<\/strong>.<\/p>\n<p>Antes de abrir seu arquivo de c\u00f3digo-fonte, voc\u00ea precisa instalar o Golang SDK for Couchbase. Ele pode ser instalado executando:<\/p>\n<pre><code>go get github.com\/couchbase\/gocb<\/code><\/pre>\n<p>Com o SDK do Couchbase instalado, abra <strong>$GOPATH\/src\/github.com\/nraboy\/realtime-chat\/main.go<\/strong> e inclua a seguinte linha fora de qualquer fun\u00e7\u00e3o:<\/p>\n<pre><code>var bucket *gocb.Bucket<\/code><\/pre>\n<p>Inclu\u00edmos a vari\u00e1vel fora de qualquer fun\u00e7\u00e3o porque queremos que ela seja global em nosso aplicativo, n\u00e3o local em uma fun\u00e7\u00e3o espec\u00edfica.<\/p>\n<p>Dentro do <code>principal<\/code> antes da goroutina do nosso gerenciador de clientes, queremos estabelecer uma conex\u00e3o com o cluster e abrir um determinado bucket. Isso pode ser feito da seguinte forma:<\/p>\n<pre><code>cluster, _ := gocb.Connect(\"couchbase:\/\/localhost\")\r\nbucket, _ = cluster.OpenBucket(\"example\", \"\")<\/code><\/pre>\n<p>No cen\u00e1rio acima, eu me conectei ao meu n\u00f3 em execu\u00e7\u00e3o local e abri o arquivo <strong>exemplo<\/strong> que foi criado anteriormente.<\/p>\n<p>Neste ponto, o Couchbase est\u00e1 pronto para ser usado e podemos nos concentrar em nosso modelo de dados.<\/p>\n<h2 id=\"defining-the-couchbase-json-data-model\">Defini\u00e7\u00e3o do modelo de dados JSON do Couchbase<\/h2>\n<p>Vimos o modelo de dados JSON proposto anteriormente, mas precisamos torn\u00e1-lo poss\u00edvel por meio do Golang. Isso \u00e9 feito por meio do uso de uma estrutura de dados Golang.<\/p>\n<p>Perto das outras estruturas de dados existentes, inclua o seguinte:<\/p>\n<pre><code>type Message struct {\r\n    Sender    string `json:\"sender,omitempty\"`\r\n    Recipient string `json:\"recipient,omitempty\"`\r\n    Content   string `json:\"content,omitempty\"`\r\n    Timestamp int64  `json:\"timestamp,omitempty\"`\r\n}<\/code><\/pre>\n<p>O acima <code>Mensagem<\/code> tem propriedades mapeadas para elementos JSON. Um elemento que n\u00e3o estamos optando por usar, mas que faria sentido ter \u00e9 o <code>Benefici\u00e1rio<\/code>. Nunca se sabe se, no futuro, voc\u00ea desejar\u00e1 enviar mensagens para clientes espec\u00edficos.<\/p>\n<p>O Couchbase pode trabalhar diretamente com o <code>Mensagem<\/code> para salvar e ler dados. Para envi\u00e1-los por um websocket, eles podem ser transformados em JSON.<\/p>\n<h2 id=\"saving-and-loading-messages-with-couchbase\">Salvando e carregando mensagens com o Couchbase<\/h2>\n<p>Isso nos leva a fazer o salvamento e o carregamento de dados. Temos a configura\u00e7\u00e3o do banco de dados com uma conex\u00e3o estabelecida. Temos nosso modelo de dados. Agora vamos coloc\u00e1-lo em uso.<\/p>\n<p>Para simplificar, manteremos o ID de cada documento exclusivo. Isso pode ser feito por meio de uma biblioteca UUID que pode ser instalada por meio da linha de comando da seguinte forma:<\/p>\n<pre><code>go get github.com\/satori\/go.uuid<\/code><\/pre>\n<p>No aplicativo, adicione um <code>saveMessage<\/code> como o seguinte:<\/p>\n<pre><code>func saveMessage(message *Message) {\r\n    bucket.Upsert(uuid.NewV4().String(), message, 0)\r\n}<\/code><\/pre>\n<p>Observe que estamos aceitando um <code>Mensagem<\/code>gerando uma nova chave de documento e inserindo-a no banco de dados. Isso significa que cada mensagem ser\u00e1 armazenada como seu pr\u00f3prio documento.<\/p>\n<p>Ent\u00e3o, que tal carregar dados quando uma conex\u00e3o \u00e9 estabelecida?<\/p>\n<pre class=\"lang:default decode:true\">func (manager *ClientManager) loadMessages(client *Client) {\r\n    query := gocb.NewN1qlQuery(\"SELECT `example`.* FROM `example` ORDER BY timestamp\")\r\n    rows, _ := bucket.ExecuteN1qlQuery(query, nil)\r\n    var row Message\r\n    var jsonMessage []byte\r\n    for rows.Next(&amp;row) {\r\n      jsonMessage, _ = json.Marshal(row)\r\n      client.send<\/pre>\n<p>No exemplo acima <code>loadMessages<\/code> aceitamos um m\u00e9todo <code>Cliente<\/code> que representar\u00e1 o cliente rec\u00e9m-conectado. O cliente que deseja obter o hist\u00f3rico de mensagens.<\/p>\n<p>Uma consulta N1QL \u00e9 criada para buscar todas as mensagens e orden\u00e1-las pelo <code>carimbo de data\/hora<\/code> valor. Cada resultado da consulta \u00e9 transformado em JSON e adicionado ao canal do cliente para ser enviado.<\/p>\n<p>Ent\u00e3o, como usamos esses dois m\u00e9todos?<\/p>\n<p>Quando uma conex\u00e3o de websocket \u00e9 estabelecida, o gerenciador de clientes registra o cliente para transmiss\u00e3o. Isso acontece na se\u00e7\u00e3o <code>iniciar<\/code> m\u00e9todo. No <code>iniciar<\/code> h\u00e1 uma instru\u00e7\u00e3o switch para o registro do cliente. Vamos modific\u00e1-la para que se pare\u00e7a com o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">case conn := &lt; -manager.register:\r\nmanager.clients[conn] = true\r\njsonMessage, _ := json.Marshal(&amp;Message{Content: \"\/A new socket has connected.\"}) manager.send(jsonMessage, conn)\r\nmanager.loadMessages(conn)<\/pre>\n<p>Observe que, depois que a conex\u00e3o do cliente \u00e9 registrada, pegamos a conex\u00e3o e a passamos para o <code>loadMessages<\/code> que acabamos de criar. Isso enviar\u00e1 todas as mensagens armazenadas anteriormente para esse cliente espec\u00edfico.<\/p>\n<p>O salvamento das mensagens ser\u00e1 um pouco diferente.<\/p>\n<p>No tutorial anterior, criamos um arquivo <code>ler<\/code> m\u00e9todo. Modifique-o para que fique parecido com o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">func (c *Client) read() {\r\n    defer func(){\r\n        manager.unregister &lt; -c\r\n        c.socket.Close()\r\n    }()\r\n \r\n    for{\r\n        _, message, err := c.socket.ReadMessage()\r\n        if err != nil {\r\n            manager.unregister &lt; -c\r\n            c.socket.Close()\r\n            break\r\n        }\r\n        msg := &amp;Message {\r\n            Sender:    c.id,\r\n            Content:   string(message),\r\n            Timestamp:(time.Now()).Unix(),\r\n        }\r\n        jsonMessage, _ := json.Marshal(msg)\r\n        saveMessage(msg)\r\n        manager.broadcast &lt; -jsonMessage\r\n    }\r\n}<\/pre>\n<p>O que \u00e9 importante s\u00e3o as linhas a seguir:<\/p>\n<pre class=\"lang:default decode:true\">msg := &amp;Message {\r\n    Sender: c.id,\r\n    Content: string(message),\r\n    Timestamp: (time.Now()).Unix(),\r\n}\r\nsaveMessage(msg)<\/pre>\n<p>O servidor receber\u00e1 uma mensagem do cliente e criar\u00e1 uma mensagem real de <code>Mensagem<\/code> com informa\u00e7\u00f5es adicionais, como quem a enviou e quando. Essa mensagem \u00e9 ent\u00e3o salva no banco de dados.<\/p>\n<p>Tente executar o aplicativo Golang novamente com o cliente Angular 2. Ele deve salvar as mensagens agora.<\/p>\n<h2 id=\"conclusion\">Conclus\u00e3o<\/h2>\n<p>Acabamos de ver como adicionar o Couchbase a um <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2016\/12\/create-real-time-chat-app-golang-angular-2-websockets\/\">Exemplo anterior de websocket<\/a> que eu escrevi. No exemplo anterior, t\u00ednhamos um aplicativo de bate-papo cliente e servidor que se comunicava usando websockets. Expandimos esse exemplo e come\u00e7amos a salvar os dados da mensagem no Couchbase para que pudessem ser carregados por novos participantes do bate-papo.<\/p>","protected":false},"excerpt":{"rendered":"<p>Not too long ago I wrote about creating a chat application that used Angular 2 for the front-end and Golang for the back-end. The message communication between the two was possible because of websockets. In this example, any number of [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,1820,1812],"tags":[1782],"ppma_author":[9032],"class_list":["post-2483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-golang","category-n1ql-query","tag-websocket"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using Couchbase in a Golang Websocket Chat Application - The Couchbase Blog<\/title>\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\/using-couchbase-in-a-golang-websocket-chat-application\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Couchbase in a Golang Websocket Chat Application\" \/>\n<meta property=\"og:description\" content=\"Not too long ago I wrote about creating a chat application that used Angular 2 for the front-end and Golang for the back-end. The message communication between the two was possible because of websockets. In this example, any number of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-in-a-golang-websocket-chat-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-04T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-25T21:50:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Using Couchbase in a Golang Websocket Chat Application\",\"datePublished\":\"2017-01-04T15:00:00+00:00\",\"dateModified\":\"2021-01-25T21:50:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/\"},\"wordCount\":1002,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"websocket\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"GoLang\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/\",\"name\":\"Using Couchbase in a Golang Websocket Chat Application - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-04T15:00:00+00:00\",\"dateModified\":\"2021-01-25T21:50:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Couchbase in a Golang Websocket Chat Application\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Couchbase in a Golang Websocket Chat Application - The Couchbase Blog","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\/using-couchbase-in-a-golang-websocket-chat-application\/","og_locale":"pt_BR","og_type":"article","og_title":"Using Couchbase in a Golang Websocket Chat Application","og_description":"Not too long ago I wrote about creating a chat application that used Angular 2 for the front-end and Golang for the back-end. The message communication between the two was possible because of websockets. In this example, any number of [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-in-a-golang-websocket-chat-application\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-01-04T15:00:00+00:00","article_modified_time":"2021-01-25T21:50:10+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Using Couchbase in a Golang Websocket Chat Application","datePublished":"2017-01-04T15:00:00+00:00","dateModified":"2021-01-25T21:50:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/"},"wordCount":1002,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["websocket"],"articleSection":["Best Practices and Tutorials","Couchbase Server","GoLang","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/","url":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/","name":"Using Couchbase in a Golang Websocket Chat Application - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-04T15:00:00+00:00","dateModified":"2021-01-25T21:50:10+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-in-a-golang-websocket-chat-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Couchbase in a Golang Websocket Chat Application"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2483","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2483"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2483\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2483"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}