# Cadence® Connection Examples Using TLS

[Blog](/blog/)&gt;[Technology](/blog/category/technical/)&gt;Cadence® Connection Examples Using TLS 

Cadence® Connection Examples Using TLS
======================================

December 02, 2022 | By [ Rony Rahman](https://www.instaclustr.com/blog/author/rony-rahman/)

 

 

 

 



   [ ](https://x.com/intent/tweet?text=Cadence%C2%AE%20Connection%20Examples%20Using%20TLS&url=https://www.instaclustr.com/blog/cadence-connection-examples-using-tls/) [ ](https://www.linkedin.com/shareArticle?mini=true&url=https://www.instaclustr.com/blog/cadence-connection-examples-using-tls/&title=&summary=Cadence%C2%AE%20Connection%20Examples%20Using%20TLS&source=) 

In Cadence® 0.24.0, TLS support was introduced for the gRPC transport (<https://github.com/uber/cadence/pull/4606>). In this blog we provide a couple of sample code snippets—one using the Go SDK and the other using the Java SDK—to demonstrate how to establish connection to the Cadence server using TLS. For both the snippets, we assume a X.509 Certificate Authority (CA) certificate from the Cadence server in PEM-encoded (ASCII) format called ***ca-certificate.pem***.

### **Go**

To create a **Worker** using Go, the following code snippet can be used:































package main import ( "fmt" "github.com/uber-go/tally" apiv1 "github.com/uber/cadence-idl/go/proto/api/v1" "go.uber.org/cadence/.gen/go/cadence/workflowserviceclient" "go.uber.org/cadence/compatibility" "go.uber.org/cadence/worker" "go.uber.org/yarpc" "go.uber.org/yarpc/transport/grpc" "go.uber.org/zap" "go.uber.org/zap/zapcore" "crypto/tls" "crypto/x509" "io/ioutil" "go.uber.org/yarpc/peer" "go.uber.org/yarpc/peer/hostport" "google.golang.org/grpc/credentials" ) var HostPort = "&lt;HOST&gt;:&lt;PORT&gt;" var Domain = "&lt;DOMAIN&gt;" var TaskListName = "&lt;TASK&gt;" var ClientName = "&lt;CLIENT&gt;" var CadenceService = "cadence-frontend" func main() { ………………… ………………… ………………… worker := getWorker(buildLogger(), buildCadenceClient()) ………………… ………………… ………………… } func buildLogger() \*zap.Logger { config := zap.NewDevelopmentConfig() config.Level.SetLevel(zapcore.InfoLevel) var err error logger, err := config.Build() if err != nil { panic("Failed to setup logger") } return logger } func buildCadenceClient() workflowserviceclient.Interface { grpcTransport := grpc.NewTransport() var dialOptions \[\]grpc.DialOption caCert, err := ioutil.ReadFile("ca-certificate.pem") if err != nil { fmt.Printf("Failed to load server CA certificate: %v", zap.Error(err)) } caCertPool := x509.NewCertPool() if !caCertPool.AppendCertsFromPEM(caCert) { fmt.Errorf("Failed to add server CA's certificate") } tlsConfig := tls.Config{ RootCAs: caCertPool, } creds := credentials.NewTLS(&amp;tlsConfig) dialOptions = append(dialOptions, grpc.DialerCredentials(creds)) dialer := grpcTransport.NewDialer(dialOptions...) outbound := grpcTransport.NewOutbound( peer.NewSingle(hostport.PeerIdentifier(HostPort), dialer) ) dispatcher := yarpc.NewDispatcher(yarpc.Config{ Name: ClientName, Outbounds: yarpc.Outbounds{ CadenceService: {Unary: outbound}, }, }) if err := dispatcher.Start(); err != nil { panic("Failed to start dispatcher") } clientConfig := dispatcher.ClientConfig(CadenceService) return compatibility.NewThrift2ProtoAdapter( apiv1.NewDomainAPIYARPCClient(clientConfig), apiv1.NewWorkflowAPIYARPCClient(clientConfig), apiv1.NewWorkerAPIYARPCClient(clientConfig), apiv1.NewVisibilityAPIYARPCClient(clientConfig), ) } func getWorker(logger \*zap.Logger, service workflowserviceclient.Interface) worker.Worker { workerOptions := worker.Options{ Logger: logger, MetricsScope: tally.NewTestScope(TaskListName, map\[string\]string{}), } worker := worker.New( service, Domain, TaskListName, workerOptions) return worker }

   1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109



  package main

import (

 "fmt"

 "github.com/uber-go/tally"

 apiv1 "github.com/uber/cadence-idl/go/proto/api/v1"

 "go.uber.org/cadence/.gen/go/cadence/workflowserviceclient"

 "go.uber.org/cadence/compatibility"

 "go.uber.org/cadence/worker"

 "go.uber.org/yarpc"

 "go.uber.org/yarpc/transport/grpc"

 "go.uber.org/zap"

 "go.uber.org/zap/zapcore"

 "crypto/tls"

 "crypto/x509"

 "io/ioutil"

 "go.uber.org/yarpc/peer"

 "go.uber.org/yarpc/peer/hostport"

 "google.golang.org/grpc/credentials"

)



var HostPort = "&lt;HOST&gt;:&lt;PORT&gt;"

var Domain = "&lt;DOMAIN&gt;"

var TaskListName = "&lt;TASK&gt;"

var ClientName = "&lt;CLIENT&gt;"

var CadenceService = "cadence-frontend"



func main() {

 …………………

 …………………

 …………………

 worker := getWorker(buildLogger(), buildCadenceClient())

 …………………

 …………………

 …………………

}



func buildLogger() \*zap.Logger {

 config := zap.NewDevelopmentConfig()

 config.Level.SetLevel(zapcore.InfoLevel)



 var err error

 logger, err := config.Build()

 if err != nil {

 panic("Failed to setup logger")

 }



 return logger

}



func buildCadenceClient() workflowserviceclient.Interface {

 grpcTransport := grpc.NewTransport()

 var dialOptions \[\]grpc.DialOption



 caCert, err := ioutil.ReadFile("ca-certificate.pem")

 if err != nil {

 fmt.Printf("Failed to load server CA certificate: %v", zap.Error(err))

 }



 caCertPool := x509.NewCertPool()

 if !caCertPool.AppendCertsFromPEM(caCert) {

 fmt.Errorf("Failed to add server CA's certificate")

 }



 tlsConfig := tls.Config{

 RootCAs: caCertPool,

 }



 creds := credentials.NewTLS(&amp;tlsConfig)

 dialOptions = append(dialOptions, grpc.DialerCredentials(creds))



 dialer := grpcTransport.NewDialer(dialOptions...)

 outbound := grpcTransport.NewOutbound(

 peer.NewSingle(hostport.PeerIdentifier(HostPort), dialer)

 )



 dispatcher := yarpc.NewDispatcher(yarpc.Config{

 Name: ClientName,

 Outbounds: yarpc.Outbounds{

 CadenceService: {Unary: outbound},

 },

 })

 if err := dispatcher.Start(); err != nil {

 panic("Failed to start dispatcher")

 }



 clientConfig := dispatcher.ClientConfig(CadenceService)



 return compatibility.NewThrift2ProtoAdapter(

 apiv1.NewDomainAPIYARPCClient(clientConfig),

 apiv1.NewWorkflowAPIYARPCClient(clientConfig),

 apiv1.NewWorkerAPIYARPCClient(clientConfig),

 apiv1.NewVisibilityAPIYARPCClient(clientConfig),

 )

}



func getWorker(logger \*zap.Logger, service workflowserviceclient.Interface) worker.Worker {

 workerOptions := worker.Options{

 Logger: logger,

 MetricsScope: tally.NewTestScope(TaskListName, map\[string\]string{}),

 }



 worker := worker.New(

 service,

 Domain,

 TaskListName,

 workerOptions)



 return worker

}



   

 

 ### **Java**

In order to use the Java SDK to establish a connection to the Cadence server over TLS, the following Maven dependencies are needed:































&lt;dependency&gt; &lt;groupId&gt;io.grpc&lt;/groupId&gt; &lt;artifactId&gt;grpc-netty&lt;/artifactId&gt; &lt;version&gt;1.28.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.uber.cadence&lt;/groupId&gt; &lt;artifactId&gt;cadence-client&lt;/artifactId&gt; &lt;version&gt;3.7.2&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;io.netty&lt;/groupId&gt; &lt;artifactId&gt;netty-all&lt;/artifactId&gt; &lt;version&gt;4.1.17.Final&lt;/version&gt; &lt;/dependency&gt;

   1

2

3

4

5

6

7

8

9

10

11

12

13

14

15



  &lt;dependency&gt;

 &lt;groupId&gt;io.grpc&lt;/groupId&gt;

 &lt;artifactId&gt;grpc-netty&lt;/artifactId&gt;

 &lt;version&gt;1.28.0&lt;/version&gt;

&lt;/dependency&gt;

&lt;dependency&gt;

 &lt;groupId&gt;com.uber.cadence&lt;/groupId&gt;

 &lt;artifactId&gt;cadence-client&lt;/artifactId&gt;

 &lt;version&gt;3.7.2&lt;/version&gt;

&lt;/dependency&gt;

&lt;dependency&gt;

 &lt;groupId&gt;io.netty&lt;/groupId&gt;

 &lt;artifactId&gt;netty-all&lt;/artifactId&gt;

 &lt;version&gt;4.1.17.Final&lt;/version&gt;

&lt;/dependency&gt;



   

 

 The following code snippet demonstrates how to create a new **Worker**.































import com.uber.cadence.client.WorkflowClient; import com.uber.cadence.client.WorkflowClientOptions; import com.uber.cadence.internal.compatibility.Thrift2ProtoAdapter; import com.uber.cadence.internal.compatibility.proto.serviceclient.IGrpcServiceStubs; import com.uber.cadence.serviceclient.ClientOptions; import com.uber.cadence.worker.Worker; import com.uber.cadence.worker.WorkerFactory; import io.grpc.netty.GrpcSslContexts; import io.grpc.netty.NettyChannelBuilder; import java.io.File; …………………… …………………… …………………… WorkflowClient workflowClient = WorkflowClient.newInstance( new Thrift2ProtoAdapter( IGrpcServiceStubs.newInstance( ClientOptions.newBuilder() .setGRPCChannel( NettyChannelBuilder.forAddress("&lt;HOST&gt;", &lt;PORT&gt;) .useTransportSecurity() .defaultLoadBalancingPolicy("round\_robin") .sslContext(GrpcSslContexts.forClient() .trustManager(new File("ca-certificate.pem")) .build() ) .build() ) .build() ) ), WorkflowClientOptions.newBuilder() .setDomain("&lt;DOMAIN&gt;") .build() ); WorkerFactory factory = WorkerFactory.newInstance(workflowClient); Worker worker = factory.newWorker("&lt;ACTIVITY&gt;"); …………………… …………………… ……………………

   1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44



  import com.uber.cadence.client.WorkflowClient;

import com.uber.cadence.client.WorkflowClientOptions;

import com.uber.cadence.internal.compatibility.Thrift2ProtoAdapter;

import com.uber.cadence.internal.compatibility.proto.serviceclient.IGrpcServiceStubs;

import com.uber.cadence.serviceclient.ClientOptions;

import com.uber.cadence.worker.Worker;

import com.uber.cadence.worker.WorkerFactory;

import io.grpc.netty.GrpcSslContexts;

import io.grpc.netty.NettyChannelBuilder;

import java.io.File;



……………………

……………………

……………………



 WorkflowClient workflowClient =

 WorkflowClient.newInstance(

 new Thrift2ProtoAdapter(

 IGrpcServiceStubs.newInstance(

 ClientOptions.newBuilder()

 .setGRPCChannel(

 NettyChannelBuilder.forAddress("&lt;HOST&gt;", &lt;PORT&gt;)

 .useTransportSecurity()

 .defaultLoadBalancingPolicy("round\_robin")

 .sslContext(GrpcSslContexts.forClient()

 .trustManager(new File("ca-certificate.pem"))

 .build()

 )

 .build()

 )

 .build()

 )

 ),

 WorkflowClientOptions.newBuilder()

 .setDomain("&lt;DOMAIN&gt;")

 .build()

 );



 WorkerFactory factory = WorkerFactory.newInstance(workflowClient);

 Worker worker = factory.newWorker("&lt;ACTIVITY&gt;");



……………………

……………………

……………………



   

 

  

### About the author

**[Rony Rahman](https://www.instaclustr.com/blog/author/rony-rahman/)** | Lead Software Engineer

Rony is a Lead software engineer at Instaclustr. He is based in Canberra, Australia.

 



 

 ![mail icon]()#### Get the latest articles for open sourceIn your inbox

 <a class="btn btn-primary btn-popup text-dark" href="">Sign up now</a> 

 

 

 

  ### Related content

 [ Zero Downtime Migration to Instaclustr 

 

 Yes, we can migrate existing Cassandra clusters to Instaclustr without any downtime. Here's what to expect from the process... 

 

 

 

 

 

 

 ](https://www.instaclustr.com/blog/zero-downtime-migration-to-instaclustr/) 

 [ Workflow Comparison: Uber Cadence vs Netflix Conductor 

 

 When choosing what’s right for your company’s opensource workflow needs it is important to know the difference and similarities ... 

 

 

 

 

 

 

 ](https://www.instaclustr.com/blog/workflow-comparison-uber-cadence-vs-netflix-conductor/) 

 [ Will Your Cassandra Database Project Succeed?: The New Stack 

 

 Open source Apache Cassandra® continues to stand out as an enterprise-proven solution for organizations seeking high availability... 

 

 

 

 

 

 

 ](https://www.instaclustr.com/blog/will-your-cassandra-database-project-succeed-the-new-stack/) 

 

  <a class="close-modal" href="">×</a>Sign upto ourNewsletter
-----------------------
