diff --git a/README.md b/README.md index 442dced..ffd75b4 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,65 @@ # GO GRPC BASIC -### Requirements ( Do It Letter ) -- -- +## Requirements +check other branch to step by step create project +### Validate Go Installation +```bash +$ go version +go version go1.18.3 linux/amd64 +``` + +### Validate GOPATH +```bash +echo $GOPATH +``` + +### Start Project in Go +```bash +cd $GOPATH/src +mkdir -p github.com/ajikamaludin/go-grpc_basic +cd github.com/ajikamaludin/go-grpc_basic +go mod init github.com/ajikamaludin/go-grpc_basic +go mod tidy +``` + +### Install Protoc +Linux : Download zip file, extract zip file to ~/.local/, add PATH ~/.local/bin +please read documentation from this link for more detail information +``` +https://grpc.io/docs/protoc-installation/ +``` + +### Validate Protoc Installation +```bash +$ protoc --version +libprotoc 3.21.2 +``` + +### Install Protoc Dependecy for Golang +```bash +# protoc-gen-go +go install github.com/golang/protobuf/protoc-gen-go@latest +# proto (optional, execute in project dir) +go get google.golang.org/protobuf/proto@latest +# protoc-gen-grpc-gateway +go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@latest +# protoc-gen-swagger +go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger@latest +``` +### Add PATH +add to your ~/.bashrc or ~/.zshrc file +```bash +export PATH="$PATH:$GOPATH/bin" +``` +### Validate Protoc Dependency Golang Installation +```bash +~ ❯ ls $GOPATH/bin +dlv gopls protoc-gen-go protoc-gen-grpc-gateway revel +go-outline grpcurl protoc-gen-go-grpc protoc-gen-swagger +``` + +## Start Project ### Setup Project - create `proto` dir - create versioning dir and service dir `health` @@ -27,17 +83,17 @@ - create `api/v1/health/status.go` as method implment from protobuf / pb file - create `router` dir in root project - create `grpc.go` in router dir and implement NewGRPCServer and register health api service -- `go get github.com/soheilhy/cmux`, is for ? +- `go get github.com/soheilhy/cmux`, TODO: what is for ? - create `router.go` in router dir and implement IgnoreErr, this is for ignore error so can be safely ignore -- `go get golang.org/x/sync/errgroup`, is for ? +- `go get golang.org/x/sync/errgroup`, TODO: what is for ? - implement `main.go` to create grpc server from grpc.go with errgroup handler - `go run .`, run server grpc -- `go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest` +- `go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest`, this tool is - test `grpcurl -plaintext localhost:5566 list`, to show list name of services - test `grpcurl -plaintext localhost:5566 list api.gogrpc.v1.health.HealthService`, to show list name of service methods - test `grpcurl -plaintext localhost:5566 api.gogrpc.v1.health.HealthService.Status`, to test method call in grpc - result -``` +```json { "success": true, "code": "0000", @@ -50,45 +106,49 @@ ref https://github.com/grpc-ecosystem/grpc-gateway - implement `import "google/api/annotations.proto";` in proto file - changes line below in all service methods for rest compile to rest -``` +```proto service HealthService { rpc Status(google.protobuf.Empty) returns (Response) { - + option (google.api.http) = { - + get: "/api/gogrpc/v1/health/status" - + }; + option (google.api.http) = { + get: "/api/gogrpc/v1/health/status" + }; } } ``` - re - compile / re - generate proto with `compile-proto.sh` in proto dir - `go mod tidy` -- `go get "github.com/gorilla/handlers"` +- `go get "github.com/gorilla/handlers"` TODO: what is for ? - create `http.go` in router dir and implement NewHTTPServer and register health api service - register httpserver to `main.go` -``` +```go g.Go(func() error { return router.NewHTTPServer(configs, logger) }) ``` - `go run .` run grpc and http server - test `curl localhost:8080/api/v1/health/status`, reponse -``` -{"success":true,"code":"0000","desc":"SUCCESS"} +```json +{ + "success":true, + "code":"0000", + "desc":"SUCCESS" +} ``` - GENERATE API DOCS: - `mkdir swagger` - `cd proto` -- `./gen-apidoc.sh` +- `./gen-apidoc.sh`, will be generated in `swagger/docs.json` - register apidoc to http server in `http.go` implement -``` -######### +```go +///////// if configs.Config.Env != constants.EnvProduction { CreateSwagger(mux) } -########## +///////// func CreateSwagger(gwmux *http.ServeMux) { gwmux.HandleFunc("/api/health/docs.json", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "swagger/docs.json") }) } -``` \ No newline at end of file +```