update readme

2/grpc-gateway
ajikamaludin 2 years ago
parent a2196f975e
commit 083e24c670
Signed by: ajikamaludin
GPG Key ID: 476C9A2B4B794EBB

@ -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")
})
}
```
```

Loading…
Cancel
Save