Add slides (#16)
* Initial version of the slides * Add usages section * Add pros & cons * Add assets/wc.png * Add screenshot + new elements * Add new screenshots * Add examples * Update image * Last words * Last words * Add slides.pdf
This commit is contained in:
		
							
								
								
									
										247
									
								
								slides/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								slides/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | |||||||
|  | # [fit] Protobuf & Code Generation | ||||||
|  |  | ||||||
|  | ### 2016, by Manfred Touron (@moul) | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # overview | ||||||
|  |  | ||||||
|  | * go-kit is an amazing framework to develop strong micro services | ||||||
|  | * but it requires a lot of boilerplate code | ||||||
|  | * return on experience on go-kit boilerplate code generation | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # protobuf? | ||||||
|  |  | ||||||
|  | * limited to exchanges (methods and models) | ||||||
|  | * extendable with plugins | ||||||
|  | * contract-based | ||||||
|  | * universal | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # code generation? | ||||||
|  |  | ||||||
|  | * the good old ./generate.sh bash script | ||||||
|  | * go:generate | ||||||
|  | * make | ||||||
|  | * protobuf + [protoc-gen-gotemplate](https://github.com/moul/protoc-gen-gotemplate) | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # go-kit | ||||||
|  |  | ||||||
|  | * protobuf-first, rpc-first service framework in Golang | ||||||
|  | * abstract services, endpoints, transports | ||||||
|  | * requires a lot of boilerplate code in multiple packages | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # example: `session.proto` | ||||||
|  |  | ||||||
|  | ```protobuf | ||||||
|  | syntax = "proto3"; | ||||||
|  | package session; | ||||||
|  |  | ||||||
|  | service SessionService { | ||||||
|  |   rpc Login(LoginRequest) returns (LoginResponse) {} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message LoginRequest { | ||||||
|  |   string username = 1; | ||||||
|  |   string password = 2; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message LoginResponse { | ||||||
|  |   string token = 1; | ||||||
|  |   string err_msg = 2; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # example: `session.go` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | package sessionsvc | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | 	pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Service struct{} | ||||||
|  |  | ||||||
|  | func New() pb.SessionServiceServer { | ||||||
|  | 	return &Service{} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (svc *Service) Login(ctx context.Context, in *pb.LoginRequest) (*pb.LoginResponse, error) { | ||||||
|  |     // custon code here | ||||||
|  | 	return nil, fmt.Errorf("not implemented") | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ##### example: `{{.File.Package}}/gen/transports/http/http.go.tmpl` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // source: templates/{{.File.Package}}/gen/transports/http/http.go.tmpl | ||||||
|  | package {{.File.Package}}_httptransport | ||||||
|  | import ( | ||||||
|  |     gokit_endpoint "github.com/go-kit/kit/endpoint" | ||||||
|  | 	httptransport "github.com/go-kit/kit/transport/http" | ||||||
|  | 	endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/endpoints" | ||||||
|  | 	pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/pb" | ||||||
|  | ) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // result: services/user/gen/transports/http/http.go | ||||||
|  | package user_httptransport | ||||||
|  | import ( | ||||||
|  | 	gokit_endpoint "github.com/go-kit/kit/endpoint" | ||||||
|  | 	httptransport "github.com/go-kit/kit/transport/http" | ||||||
|  | 	endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints" | ||||||
|  | 	pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb" | ||||||
|  | ) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ##### example: `{{.File.Package}}/gen/transports/http/http.go.tmpl` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // source: templates/{{.File.Package}}/gen/transports/http/http.go.tmpl | ||||||
|  | {{range .Service.Method}} | ||||||
|  | func Make{{.Name}}Handler(ctx context.Context, svc pb.{{$file.Package | title}}ServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server { | ||||||
|  | 	return httptransport.NewServer( | ||||||
|  | 		ctx, | ||||||
|  | 		endpoint, | ||||||
|  | 		decode{{.Name}}Request, | ||||||
|  | 		encode{{.Name}}Response, | ||||||
|  |                 []httptransport.ServerOption{}..., | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  | {{end}} | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // result: services/user/gen/transports/http/http.go | ||||||
|  | func MakeGetUserHandler(ctx context.Context, svc pb.UserServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server { | ||||||
|  | 	return httptransport.NewServer( | ||||||
|  | 		ctx, | ||||||
|  | 		endpoint, | ||||||
|  | 		decodeGetUserRequest, | ||||||
|  | 		encodeGetUserResponse, | ||||||
|  | 		[]httptransport.ServerOption{}..., | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ##### example: `{{.File.Package}}/gen/transports/http/http.go.tmpl` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // source: templates/{{.File.Package}}/gen/transports/http/http.go.tmpl | ||||||
|  | func RegisterHandlers(ctx context.Context, svc pb.{{$file.Package | title}}ServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error { | ||||||
|  | 	{{range .Service.Method}} | ||||||
|  |         log.Println("new HTTP endpoint: \"/{{.Name}}\" (service={{$file.Package | title}})") | ||||||
|  | 	mux.Handle("/{{.Name}}", Make{{.Name}}Handler(ctx, svc, endpoints.{{.Name}}Endpoint)) | ||||||
|  | 	{{end}} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | // result: services/user/gen/transports/http/http.go | ||||||
|  | func RegisterHandlers(ctx context.Context, svc pb.UserServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error { | ||||||
|  |  | ||||||
|  | 	log.Println("new HTTP endpoint: \"/CreateUser\" (service=User)") | ||||||
|  | 	mux.Handle("/CreateUser", MakeCreateUserHandler(ctx, svc, endpoints.CreateUserEndpoint)) | ||||||
|  |  | ||||||
|  | 	log.Println("new HTTP endpoint: \"/GetUser\" (service=User)") | ||||||
|  | 	mux.Handle("/GetUser", MakeGetUserHandler(ctx, svc, endpoints.GetUserEndpoint)) | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | #### `protoc --gogo_out=plugins=grpc:. ./services/*/*.proto` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | #### `protoc --gotemplate_out=template_dir=./templates:services ./services/*/*.proto` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## 3 services | ||||||
|  | ## 6 methods | ||||||
|  | ## 149 custom lines | ||||||
|  | ## 1429 generated lines | ||||||
|  | ## business focus | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # generation usages | ||||||
|  |  | ||||||
|  | * go-kit boilerplate (see [examples/go-kit](https://github.com/moul/protoc-gen-gotemplate/tree/master/examples/go-kit)) | ||||||
|  | * k8s configuration | ||||||
|  | * Dockerfile | ||||||
|  | * documentation | ||||||
|  | * unit-tests | ||||||
|  | * fun | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # pros | ||||||
|  |  | ||||||
|  | * small custom codebase | ||||||
|  | * templates shipped with code | ||||||
|  | * hardly typed, no reflects | ||||||
|  | * genericity | ||||||
|  | * contrat terms (protobuf) respected | ||||||
|  | * not limited to a language | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # cons | ||||||
|  |  | ||||||
|  | * the author needs to write its own templates | ||||||
|  | * sometimes difficult to generate valid code | ||||||
|  | * not enough helpers around the code generation yet | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # improvement ideas | ||||||
|  |  | ||||||
|  | * Support protobufs extensions (i.e, annotations.probo) | ||||||
|  | * Generate one file from multiple services | ||||||
|  | * Add more helpers around the code generation | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # conclusion | ||||||
|  |  | ||||||
|  | * Useful to keep everything standard | ||||||
|  | * The awesomeness of go-kit without the hassle of writing boilerplate code | ||||||
|  | * Always up-to-date with the contracts | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # questions? | ||||||
|  |  | ||||||
|  | ### github.com/moul/protoc-gen-gotemplate | ||||||
|  | ### @moul | ||||||
							
								
								
									
										
											BIN
										
									
								
								slides/assets/session-wc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								slides/assets/session-wc.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 48 KiB | 
							
								
								
									
										
											BIN
										
									
								
								slides/assets/wc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								slides/assets/wc.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 124 KiB | 
							
								
								
									
										
											BIN
										
									
								
								slides/slides.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								slides/slides.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user