Go Client

Quick Setup

Follow the below instructions to connect a Go client to your cluster.

  1. Create a cluster.

    The cluster’s state will be Pending while the cluster is provisioned.

    A cluster being created

  2. When the cluster’s state changes to Running, click Configure Client.

  3. Go to the Go tab and download the ZIP file as instructed in Step 1 of the dialog box.

  4. Extract the ZIP file and run the command, in the extracted folder, shown in Step 2 of the above dialog box.

You should see log output similar to the following:

Go client logs that it is connected

Connection Successful! in your logs means that your client application has successfully connected to your cluster in Hazelcast Cloud. The sample code inserts random entries to your cluster as you can see in the logs. In your Hazelcast Cloud console (your cluster’s page where you can reach from the "Clusters" top menu), you should see the charts are being populated with metrics of your map, as shown below:

Map metrics that show entries are being added to the map

Client Code

Now, as we have successfully connected and put data into the cluster, let’s review and explain the client code you downloaded.

Go to the directory (extracted from the ZIP file you downloaded in the Step 3 above) and locate the client sample code. If you had enabled encryption in your cluster, open the client_with_ssl.go file. Otherwise, open the client.go file. We will explain both files line by line in the following sections.

client.go

This is the downloaded sample client code when your cluster does not have encryption.

package main

import (
  "fmt"
  "log"
  "math/rand"
  "time"

  hazelcast "github.com/hazelcast/hazelcast-go-client"
  "github.com/hazelcast/hazelcast-go-client/config"
  "github.com/hazelcast/hazelcast-go-client/config/property"
)
func main() {

  cfg := hazelcast.NewConfig() (1)
  (2)
  cfg.GroupConfig().SetName("YOUR_CLUSTER_NAME")
  cfg.GroupConfig().SetPassword("YOUR_CLUSTER_PASSWORD")

  cfg.NetworkConfig().SSLConfig().SetEnabled(false)
  (3)
  discoveryCfg := config.NewCloudConfig()
  discoveryCfg.SetEnabled(true)
  discoveryCfg.SetDiscoveryToken("YOUR_CLUSTER_DISCOVERY_TOKEN")
  cfg.NetworkConfig().SetCloudConfig(discoveryCfg)
  (4)
  cfg.SetProperty(property.StatisticsEnabled.Name(), "true")
  cfg.SetProperty(property.StatisticsPeriodSeconds.Name(), "1")

  client, _ := hazelcast.NewClientWithConfig(cfg) (5)
  (6)
  mp, _ := client.GetMap("map")
  mp.Put("key", "value")
  val, _ := mp.Get("key")
  (7)
  if val == "value" {
    log.Println("Connection Successful!")
    log.Println("Now, `map` will be filled with random entries.")
    rand.Seed(time.Now().UTC().UnixNano())
    for true {
      randKey := rand.Intn(100000)
      mp.Put("key"+string(randKey), "value"+string(randKey))
      if randKey%10 == 0 {
        size, _ := mp.Size()
        log.Println(fmt.Sprintf("Map size: %d", size))
      }
      time.Sleep(100 * time.Millisecond)
    }
  } else {
    panic("Connection failed, check your configuration.")
  }

  client.Shutdown()
}
1 First, we create an empty client configuration.
2 Then, we set the cluster name and password via GroupConfig.

The cluster name and password are unique to your cluster. The client is authenticated using this password.

3 Then, we set the discovery token.

This token is also unique to your cluster and used to discover Hazelcast cluster members.

4 We enable Hazelcast to send the client statistics to see them in the cluster’s page.
5 Now, we create the client with config.

This step creates the connection between your application and the cluster.

6 We get/create a map and put a simple entry ("key", "value").
7 Then, we check if the entry has been added and let the code throw an exception if the value is not correct. Finally, we add random entries with 100-millisecond intervals.

client_with_ssl.go

This is the downloaded sample client code when your cluster has encryption enabled.

package main

import (
  "fmt"
  "log"
  "math/rand"
  "path/filepath"
  "time"

  hazelcast "github.com/hazelcast/hazelcast-go-client"
  "github.com/hazelcast/hazelcast-go-client/config"
  "github.com/hazelcast/hazelcast-go-client/config/property"
)

func main() {
  cfg := hazelcast.NewConfig()
  (1)
  sslConfig := cfg.NetworkConfig().SSLConfig()
  sslConfig.SetEnabled(true)
  caFile,_ := filepath.Abs("./ca.pem")
  certFile,_ := filepath.Abs("./cert.pem")
  keyFile,_ := filepath.Abs("./key.pem")
  sslConfig.SetCaPath(caFile)
  sslConfig.AddClientCertAndEncryptedKeyPath(certFile, keyFile, "YOUR_SSL_PASSWORD")

  sslConfig.ServerName = "hazelcast.cloud"
  cfg.GroupConfig().SetName("YOUR_CLUSTER_NAME")
  cfg.GroupConfig().SetPassword("YOUR_CLUSTER_PASSWORD")
  discoveryCfg := config.NewCloudConfig()
  discoveryCfg.SetEnabled(true)
  discoveryCfg.SetDiscoveryToken("YOUR_CLUSTER_DISCOVERY_TOKEN")
  cfg.NetworkConfig().SetCloudConfig(discoveryCfg)
  cfg.SetProperty(property.StatisticsEnabled.Name(), "true")
  cfg.SetProperty(property.StatisticsPeriodSeconds.Name(), "1")

  client, _ := hazelcast.NewClientWithConfig(cfg)

  mp, _ := client.GetMap("map")
  mp.Put("key", "value")
  val, _ := mp.Get("key")
  if val == "value" {
    log.Println("Connection Successful!")
    log.Println("Now, `map` will be filled with random entries.")
    rand.Seed(time.Now().UTC().UnixNano())
    for true {
      randKey := rand.Intn(100000)
      mp.Put("key"+string(randKey), "value"+string(randKey))
      if randKey%10 == 0 {
        size, _ := mp.Size()
        log.Println(fmt.Sprintf("Map size: %d", size))
      }
      time.Sleep(100 * time.Millisecond)
    }
  } else {
      panic("Connection failed, check your configuration.")
  }
  client.Shutdown()
}
1 The only difference between this one and the client.go is the lines that enable and configure TLS encryption on the client side.

You may want to move the 'pem' files to another directory. Then, you need to set 'ca', 'cert' and 'key' file directories accordingly.

More Configuration Options

Please refer to the Hazelcast Go Client Documentation for further configuration options.