创建gRPC服务端并运行

创建proto文件

grpc入门

 

 

syntax="proto3";

package services;
 

message  ProdRequest {
    int32 prod_id =1;   //传入的商品ID
}
message ProdResponse{
    int32 prod_stock=1;//商品库存
}

service ProdService {
    rpc GetProdStock (ProdRequest) returns (ProdResponse);
}

 

生成文件:

protoc --go_out=plugins=grpc:../services     Prod.proto

创建实现方法

grpc入门

 

 

package services

import (
    "context"
)

type ProdService struct {

}

func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {

      return &ProdResponse{ProdStock:20},nil
}

创建服务

package main

import (
    "google.golang.org/grpc"
    "grpcpro/services"
    "net"
)

func main()  {
    rpcServer:=grpc.NewServer()
    services.RegisterProdServiceServer(rpcServer,new(services.ProdService))

    lis,_:=net.Listen("tcp",":8081")

    rpcServer.Serve(lis)


}

grpc入门

 

 

go run server.go 运行服务....

 

 

创建客户端调用

我们依然 安装相关 库 安装 go get google.golang.org/grpc

 

 

 

自签证书、服务加入证书验证(选学)

  

进入这个网址 http://slproweb.com/products/Win32OpenSSL.html

grpc入门

 

 

进入 bin目录

1、执行openssl
2、执行 genrsa -des3 -out server.key 2048(会生成server.key,私钥文件)
3、创建证书请求:req -new -key server.key -out server.csr(会生成server.csr)
  其中common name 也就是域名:我填的是jtthink.com
 
4、删除密码 rsa -in server.key -out server_no_passwd.key
5、执行x509 -req -days 365 -in server.csr -signkey server_no_passwd.key -out server.crt
  (会生成server.crt)

 自此自签证书完成

 

grpc入门

 

 

加入证书代码:服务端

creds, err := credentials.NewServerTLSFromFile("keys/server.crt", "keys/server_no_passwd.key")
    if err != nil {
        log.Fatal(err)
    }
    rpcServer:=grpc.NewServer(grpc.Creds(creds))

加入证书代码:客户端

creds, err := credentials.NewClientTLSFromFile("keys/server.crt", "jtthink.com")
    if err != nil {
           log.Fatal(err)
  }
    conn,err:=grpc.Dial(":8081",grpc.WithTransportCredentials(creds))

 

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "gweb.jtthink.com/services"
    "log"
)

func main(){
    creds, err := credentials.NewClientTLSFromFile("keys/server.crt", "jtthink.com")
    if err != nil {
        log.Fatal(err)
    }
    conn,err:=grpc.Dial(":8081",grpc.WithTransportCredentials(creds))
    if err!=nil{
        log.Fatal(err)
    }
    defer conn.Close()

    prodClient:=services.NewProdServiceClient(conn)
    prodRes,err:=prodClient.GetProdStock(context.Background(),
        &services.ProdRequest{ProdId:12})
    if err!=nil{
        log.Fatal(err)
    }
    fmt.Println(prodRes.ProdStock)
}
main.go 客户端

相关文章: