Write microservice in golang

126
Build MicroServices in Golang Bo-Yi Wu 2016.08.21 1

Transcript of Write microservice in golang

Page 1: Write microservice in golang

1

Build MicroServices in GolangBo-Yi Wu

2016.08.21

Page 2: Write microservice in golang

Bo-Yi Wu (appleboy)https://blog.wu-boy.com

https://github.com/appleboy 2

Page 3: Write microservice in golang

Agenda• What are Microservices?• Why Microservices?• Golang Introduction• Golang Testing Tool• Golang Deployment

3

Page 4: Write microservice in golang

4

What are Microservices?• Fulfill only one task• Application is a suite of small services and

size• Communicate with lightweight

mechanisms, often REST • Written in different programming languages• Use different data storage technologies

Page 5: Write microservice in golang

Why Microservices?• Scaling Agility • Migrating Legacy Applications • Sustainable Development Speed • Continuous Delivery • Independent Scalability • Technology Freedom

5

Page 6: Write microservice in golang

6

Golang Introduction

Page 7: Write microservice in golang

7

Who made this thing?

Robert Griesemer, Rob Pike and Ken Thompson

Page 8: Write microservice in golang

Frequently Asked Questionshttps://golang.org/doc/faq

8

Page 9: Write microservice in golang

Why Choose Golang• Performance• Multiple core• Concurrency• Compiled && portable• Clean syntax• Powerful standard library• Strong type• Open source

9

Page 10: Write microservice in golang

Go, Open SourceDo Less. Enable More.

https://blog.golang.org/open-source

10

Page 11: Write microservice in golang

11

Portable

https://github.com/mitchellh/gox

Page 12: Write microservice in golang

12

Page 15: Write microservice in golang

15

companies using Go

Page 16: Write microservice in golang

16How We Moved Our API From Ruby to Go and Saved Our Sanity

Page 18: Write microservice in golang

18HOW WE BUILT UBER ENGINEERING’S HIGHEST QUERY PER SECOND SERVICE USING GO

Page 19: Write microservice in golang

Companies currently using Go throughout the world

https://github.com/golang/go/wiki/GoUsers

19

Page 20: Write microservice in golang

Farewell Node.jsTJ Holowaychuk

https://goo.gl/WVxwtb

20

Page 21: Write microservice in golang

How to Write Go Codehttps://golang.org/doc/code.html

21

Page 22: Write microservice in golang

Getting Started• Workspaces• GOPATH environment variable• Import paths• Your first program• Your first library• Package names• Testing

22

Page 23: Write microservice in golang

Workspaces• Src– contains Go source files

• Pkg– contains package objects

• Bin– contains executable commands

23

Page 24: Write microservice in golang

24

Page 25: Write microservice in golang

GOPATH Variable$ mkdir $HOME/work$ export GOPATH=$HOME/work$ export PATH=$PATH:$GOPATH/bin

25

Page 26: Write microservice in golang

Import paths$ mkdir -p $GOPATH/src/github.com/user

26

Page 27: Write microservice in golang

27

Your first program$ mkdir –p $GOPATH/src/github.com/user/hello$ touch $GOPATH/src/github.com/user/hello/hello.go

Page 28: Write microservice in golang

28

Page 29: Write microservice in golang

Build and install package$ go install github.com/user/hello

29

Page 30: Write microservice in golang

30

You will find hello binary$GOPATH/bin/hello

$HOME/work/bin/hello

Page 31: Write microservice in golang

Your first library$ mkdir $GOPATH/src/github.com/user/stringutil

31

Page 32: Write microservice in golang

32

SWAP

Page 33: Write microservice in golang

33

Page 34: Write microservice in golang

34

Page 35: Write microservice in golang

Tesing in Go$GOPATH/src/github.com/user/stringutil/

reverse_test.go

35

Page 36: Write microservice in golang

36

Page 37: Write microservice in golang

Learn GoLang For Great Good Part: Unit Testing in Go

https://goo.gl/WhAV5P

37

Page 38: Write microservice in golang

38

Teamwork in

http://aib.edu.au/blog/top-tips-effective-teamwork/

Page 39: Write microservice in golang

39

Check Style

Unit Testing

Code Review

Develop

Page 40: Write microservice in golang

Effective Gohttps://golang.org/doc/effective_go.html

40

Page 41: Write microservice in golang

41

Page 42: Write microservice in golang

Code Review Commentshttps://github.com/golang/go/wiki/CodeReviewComments

42

Page 43: Write microservice in golang

Concurrency in go

Go routines

43

Page 44: Write microservice in golang

44

Page 45: Write microservice in golang

45

Page 46: Write microservice in golang

46

Go synchronization

Page 47: Write microservice in golang

47

Page 48: Write microservice in golang

GOMAXPROCSmaximum number of CPU

48

Page 49: Write microservice in golang

49

sets the maximum number of CPUs

Page 50: Write microservice in golang

50

Race Condition

Page 51: Write microservice in golang

51

Page 52: Write microservice in golang

52

sync/Mutex

Page 53: Write microservice in golang

53

Page 54: Write microservice in golang

54

sync/atomic

Page 55: Write microservice in golang

55

Page 56: Write microservice in golang

Channel in go

56

Page 57: Write microservice in golang

57

Page 58: Write microservice in golang

58

Command line in Go

Page 59: Write microservice in golang

59https://github.com/appleboy/gorush

Page 60: Write microservice in golang

60

Build a MicroService

Page 61: Write microservice in golang

61

• Configuration– Yaml, JSON or INI format

• Logger– Access and error log format– write file or output to console

• Web API– JSON or XML format

• App and System status– Memory, go version, uptime, response time …

• Deployment / Upgrades– Docker image or binary file

Page 62: Write microservice in golang

62

Page 63: Write microservice in golang

63

Configuration• Yaml– https://github.com/go-gas/config

• INI– https://github.com/go-ini/ini

• JSON– https://github.com/spf13/viper

Page 64: Write microservice in golang

LoggerStructured, pluggable logging for Go.https://github.com/Sirupsen/logrus

64

Page 65: Write microservice in golang

Build HTTP APIWhy You No Framework?

https://goo.gl/ZlMtpN

65

Page 66: Write microservice in golang

Web Framework• Gin• Echo• Httprouter• Mux• Go-json-rest• Gas 66

Page 67: Write microservice in golang

67

Monitoring App Status

Page 68: Write microservice in golang

68

Page 69: Write microservice in golang

69

Page 70: Write microservice in golang

70

Golang Testing ToolJust one command

Page 71: Write microservice in golang

71hello.go

Page 72: Write microservice in golang

72hello_test.go

Page 73: Write microservice in golang

73

go test –v –cover

Page 74: Write microservice in golang

74

Page 75: Write microservice in golang

To run only specific test go test –run xxxxx

75

Page 76: Write microservice in golang

Tesing Coverage for gogo test –

coverprofile=covergae.out

76

Page 77: Write microservice in golang

Viewing the resultsgo tool cover –html=coverage.out

77

Page 78: Write microservice in golang

78

Page 79: Write microservice in golang

linter for Go source codegolint -set_exit_status packagehttps://github.com/golang/lint

79

Page 80: Write microservice in golang

Gofmt formats Go programs.go list ./... | grep -v vendor | xargs go fmt

https://golang.org/cmd/gofmt/

80

Page 81: Write microservice in golang

81

+Testing Report Testing View

Page 82: Write microservice in golang

Coverage Reportinghttps://github.com/axw/gocov

https://github.com/AlekSi/gocov-xml

82

Page 83: Write microservice in golang

83

Page 84: Write microservice in golang

Testing ReportingConvert go test output to junit xml

https://github.com/jstemmer/go-junit-report

84

Page 85: Write microservice in golang

85

Page 86: Write microservice in golang

86

Page 87: Write microservice in golang

87

Page 88: Write microservice in golang

Go Lint Reportinghttps://github.com/golang/lint

88

Page 89: Write microservice in golang

89

Page 90: Write microservice in golang

90

Page 91: Write microservice in golang

91

Run test for multiple package?

+

Page 92: Write microservice in golang

92

+Testing Report Testing View

Page 93: Write microservice in golang

93

Docker image includes Golang coverage tools for testing

https://github.com/appleboy/golang-testing

Page 94: Write microservice in golang

94

Feature• Convert go test output to junit xml• Coverage testing tool• XML (Cobertura) export• Linter for Go source code• Package Management for Golang• Testing multiple Golang package

Page 95: Write microservice in golang

95

Testing without Docker

Download coverage script and copy to bin folder

Page 97: Write microservice in golang

97

Run docker command

docker run --rm \ -v $(PWD):$PROJECT_PATH \ -w=$PROJECT_PATH \ appleboy/golang-testing \ sh -c ”make install && coverage all"

Page 98: Write microservice in golang

Run docker-compose commandhttps://goo.gl/0JMnlo

98

Page 99: Write microservice in golang

99

docker-compose configdocker-compose run golang-

testingdocker-compose down

Page 100: Write microservice in golang

docker-compose.yml filehttps://goo.gl/0JMnlo

100

Page 101: Write microservice in golang

101

Page 102: Write microservice in golang

Golang Dockerfilehttps://goo.gl/Vnt7Zc

102

Page 103: Write microservice in golang

103

Page 104: Write microservice in golang

104

Page 105: Write microservice in golang

Output all report files

105

Xml and txt format

Page 106: Write microservice in golang

106

Page 107: Write microservice in golang

107

Golang Deployment

Page 108: Write microservice in golang

108

Build Go binary command

Page 109: Write microservice in golang

109

Go build command

GOOS=linux \GOARCH=amd64 \CGO_ENABLED=0 \go build \ -ldflags="-s -w -X main.Version=${v}" \ -o bin/hello go-hello

Page 110: Write microservice in golang

110

Prepare golang Docker image

Build go file

Add bin file to

Docker image

Deploy image to Docker registry

Page 111: Write microservice in golang

111

Prepare golang Docker image

Build go file

Add bin file to

Docker image

Deploy image to Docker registry

Page 112: Write microservice in golang

112

Clone source

Build binary

file

Tar binary

file

Page 113: Write microservice in golang

113

Clone source into docker

Page 114: Write microservice in golang

114

Build binary file

Page 115: Write microservice in golang

115Tar binary file

Page 116: Write microservice in golang

116

Prepare Docker Image

docker build -t $(IMAGE) -f Dockerfile.build .

Page 117: Write microservice in golang

117

Prepare golang Docker image

Build go file

Add bin file to

Docker image

Deploy image to Docker registry

Page 118: Write microservice in golang

Output binary filedocker run $(BUILD_IMAGE) > build.tar.gz

118

Page 119: Write microservice in golang

119

Prepare golang Docker image

Build go file

Add bin file to

Docker image

Deploy image to Docker registry

Page 120: Write microservice in golang

Prepare production image

120

Page 121: Write microservice in golang

121

Untar binary file

Page 122: Write microservice in golang

Build production imagedocker build –t hello-world -f Dockerfile.dist .

122

Page 123: Write microservice in golang

Test your production imagedocker run -d -p 8088:8000 hello-world

123

Page 124: Write microservice in golang

124

Prepare golang Docker image

Build go file

Add bin file to

Docker image

Deploy image to Docker registry

docker push $(ACCOUNT)/$(IMAGE):$(tag)

Page 125: Write microservice in golang

Gas web framework

https://github.com/go-gas/gas

125

Page 126: Write microservice in golang

126

Any Question?