Giter Club home page Giter Club logo

grpc-example's Introduction

grpc-example

快速开始

  1. 运行代码

    git clone [email protected]:WeCanRun/grpc-example.git
    make
  2. 访问 swagger-ui 首页

    http://localhost:9001/swagger-ui/
  3. 输入swagger文档地址, 点击 Explore

    http://localhost:9001/swagger/all.swagger.json

步骤

  1. 版本信息
    libprotoc 3.21.5
    protoc-gen-go v1.28.1
    protoc-gen-go-grpc 1.1.0
  2. 定义 proto 文件 proto/*.proto
  3. 生成 grpc 代码
    protoc -I . -I ../../googleapis/googleapis  --go_out ./ --go_opt paths=source_relative --go-grpc_out=require_unimplemented_servers=false:./ --go-grpc_opt paths=source_relative  proto/*.proto
  4. 创建 grpc 服务器,并注册相关服务 cmd/server/server.go
  5. 修改 proto 文件,加入 grpc-gatway 相关配置
  6. 生成 grpc-gateway 相关代码
    protoc -I . -I ../../googleapis/googleapis  --grpc-gateway_out . --grpc-gateway_opt logtostderr=true --grpc-gateway_opt paths=source_relative --grpc-gateway_opt generate_unbound_methods=true  proto/*.proto
  7. 使用 protoc-gen-openapiv2 生成 swagger 文档
    protoc -I . -I ../../googleapis/googleapis --openapiv2_out ./docs --openapiv2_opt use_go_templates=true  --openapiv2_opt logtostderr=true  --openapiv2_opt  allow_merge=true,merge_file_name=all   proto/*.proto
  8. 增加 swagger 路由
    mkdir third_patry && cd third_patry && git clone [email protected]:swagger-api/swagger-ui.git
    mkdir swagger && cp -r swagger-ui/dist/* swagger/ && rm -rf swagger-ui/
    
    go get -u github.com/go-bindata/go-bindata/...
    go get -u github.com/elazarl/go-bindata-assetfs/...
    
    go-bindata --nocompress -pkg swagger -o pkg/swagger/data.go third_party/swagger/...
     func serveSwaggerFile() func(w http.ResponseWriter, r *http.Request) {
     	return func(w http.ResponseWriter, r *http.Request) {
     		log.Println("start serveSwaggerFile")
     
     		if !strings.HasSuffix(r.URL.Path, "swagger.json") {
     			log.Printf("Not Found: %s", r.URL.Path)
     			http.NotFound(w, r)
     			return
     		}
     
     		p := strings.TrimPrefix(r.URL.Path, "/swagger/")
     		p = path.Join("docs/", p)
     
     		log.Printf("Serving swagger-file: %s", p)
     
     		http.ServeFile(w, r, p)
     	}
     }
     
     func serveSwaggerUI(mux *http.ServeMux) {
         fileServer := http.FileServer(&assetfs.AssetFS{
             Asset:    swagger.Asset,
             AssetDir: swagger.AssetDir,
             Prefix:   "third_party/swagger",
         })
         prefix := "/swagger-ui/"
         mux.Handle(prefix, http.StripPrefix(prefix, fileServer))
     }
  9. 增加拦截器
     func AccessInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo,
         handler grpc.UnaryHandler) (interface{}, error) {
     
         requestLog := "access request log: method: %s, begin_time: %d, request: %v"
         begin := time.Now().Unix()
         log.Printf(requestLog, info.FullMethod, begin, req)
     
         resp, err := handler(ctx, req)
         end := time.Now().Unix()
     
         respLog := "access response log: method: %s, begin_time: %d, end_time: %d, spend_time: %d, response: %v"
         log.Printf(respLog, info.FullMethod, begin, end, end - begin, resp)
     
         return resp, err
     }
     func NewGrpcServer() *grpc.Server {
         opts := []grpc.ServerOption{
             grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
                 middleware.AccessInterceptor,
                 grpc_ctxtags.UnaryServerInterceptor(),
                 grpc_opentracing.UnaryServerInterceptor(),
                 grpc_recovery.UnaryServerInterceptor(),
             )),
         }
     
         server := grpc.NewServer(opts...)
     
         // 注册服务
         pb.RegisterSearchServiceServer(server, service.NewSearch())
         pb.RegisterPubSubServiceServer(server, service.NewPubSub())
         reflection.Register(server)
     
         return server
     }
  10. 使用 metadata 自定义认证
  11. 链路追踪 jaeger

参考

https://github.com/grpc-ecosystem/grpc-gateway

https://www.cnblogs.com/yisany/p/14875488.html

grpc-example's People

Contributors

wecanrun avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.