设为首页 收藏本站
查看: 1776|回复: 0

[经验分享] grpc gateway 使用以及docker compose 集成

[复制链接]

尚未签到

发表于 2018-9-21 08:58:03 | 显示全部楼层 |阅读模式
a. 项目结构  ├── Dockerfile
  ├── Gopkg.lock
  ├── Gopkg.toml
  ├── README.md
  ├── docker-compose.yml
  ├── main.go
  ├── pb
  │   └── echoservice.proto
  ├── rpcserver
  │   ├── Dockerfile
  │   ├── Gopkg.lock
  │   ├── Gopkg.toml
  │   ├── main.go
  ├── service
  │   └── pb
  │       ├── echoservice.pb.go
  │       └── echoservice.pb.gw.go
  b. probu编写(pb/echoservice.proto)
  syntax="proto3";
  package echoservice;
  option go_package="echoservice";
  import "google/api/annotations.proto";
  service EchoService {
  rpc Echo(EchoMessage) returns (EchoResponse) {
  option (google.api.http) = {
  post: "/v1/echo"
  body: "*"
  };
  }
  }
  message EchoMessage{
  string message=1;
  }
  message EchoResponse{
  string message=1;
  }
  c. 生成gRPC stub以及gateway code
  protoc -I/usr/local/include -I. \
  -I$GOPATH/src \
  -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
  --go_out=plugins=grpc:./service \
  pb/echoservice.prot
  protoc -I/usr/local/include -I. \
  -I$GOPATH/src \
  -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
  --grpc-gateway_out=logtostderr=true:./service \
  pb/echoservice.prot
  d. 实现grpc server
  rpcserver/main.go
  package main
  import "context"
  import pb "github.com/rongfengliang/restyapp/service/pb"
  import grpc "google.golang.org/grpc"
  import "net"
  import "log"
  type server struct{}
  func (s *server) Echo(ctx context.Context, in *pb.EchoMessage) (*pb.EchoResponse, error) {
  return &pb.EchoResponse{
  Message: in.Message,
  }, nil
  }
  func main() {
  lis, err := net.Listen("tcp", "0.0.0.0:9000")
  if err != nil {
  log.Fatal("some wrong")
  }
  s := grpc.NewServer()
  pb.RegisterEchoServiceServer(s, &server{})
  if err := s.Serve(lis); err != nil {
  log.Fatal("some wrong")
  }
  }
  e. rpcserver dockerfile
  # build stage
  FROM golang:1.9-alpine AS build-env
  RUN apk --no-cache add build-base git bzr mercurial gcc
  ENV D=/go/src/github.com/rongfengliang/restyapp
  ADD . $D
  RUN cd $D && go build -o rpcserver && cp rpcserver /tmp/
  FROM alpine:latest
  WORKDIR /app
  EXPOSE 9000
  COPY --from=build-env /tmp/rpcserver /app/rpcserver
  CMD ["./rpcserver"]
  f. gateway code
  package main
  import (
  "context"
  "flag"
  "net/http"
  "github.com/golang/glog"
  "github.com/grpc-ecosystem/grpc-gateway/runtime"
  gw "github.com/rongfengliang/restyapp/service/pb"
  grpc "google.golang.org/grpc"
  )
  var (
  echoEndpoint = flag.String("echo_endpoint", "rpcserver:9000", "endpoint of YourService")
  )
  func run2() error {
  ctx := context.Background()
  ctx, cancel := context.WithCancel(ctx)
  defer cancel()
  mux := runtime.NewServeMux()
  opts := []grpc.DialOption{grpc.WithInsecure()}
  err := gw.RegisterEchoServiceHandlerFromEndpoint(ctx, mux, *echoEndpoint, opts)
  if err != nil {
  return err
  }
  return http.ListenAndServe(":8089", mux)
  }
  func main() {
  flag.Parse()
  defer glog.Flush()
  if err := run2(); err != nil {
  glog.Fatal(err)
  }
  }
  g. gateway dockerfile
  # build stage
  FROM golang:1.9-alpine AS build-env
  RUN apk --no-cache add build-base git bzr mercurial gcc
  ENV D=/go/src/github.com/rongfengliang/restyapp
  ADD . $D
  RUN cd $D && go build -o gwserver && cp gwserver /tmp/
  FROM alpine:latest
  WORKDIR /app
  EXPOSE 8089
  COPY --from=build-env /tmp/gwserver /app/gwserver
  CMD ["./gwserver"]
  h. docker-compose file
  version: '3'
  services:
  rpcserver:
  image: rpcserver
  build:
  context: ./rpcserver
  gwserver:
  image: gwserver
  ports:
  - 8089:8089
  build:
  context: .
  depends_on:
  - rpcserver
  备注:构建使用了docker stage 依赖使用vendor 方式,简单依赖的处理


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-599193-1-1.html 上篇帖子: log4go的输出优化 下篇帖子: Mindoc搭建流程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表