9、gRPC

技术9、gRPC 9、gRPC之前 protobuf 时安装过,不需安装快速开启 grpc 服务
新建目录 testGrpc 。以及testGrpc/service 和testGrpc/clientte

9、gRPC

之前原蟾蜍时安装过,不需安装

快速开启 grpc 服务

新建目录testGrpc。以及testGrpc/服务和测试grpc/客户端

testGrpc下新建你好,普罗托

语法=' proto3

包tempPackageName

选项go _ package=' gins start/testGrpc/service/hello package ';//生成在服务文件夹下,包名为helloPackage

//问候语服务定义。

服务迎宾员{

//发送问候

rpc SayHello (HelloRequest)返回(HelloReply) {}

}

//包含用户名的请求消息。

消息HelloRequest {

字符串名称=1;

}

//包含问候语的响应消息

消息HelloReply {

字符串消息=1;

}

//生成普通结构文件

//protocol-go _ out=client-go _ opt=path=source _ relative grpc。样机

//生成grpc文件

//协议-go-grpc _ out=服务-go-grpc _ opt=路径=source _ relative grpc。proto/若是。表示当前目录

//- go-grpc_out=service //定义输出路径

//-go-grpc _ opt=path=source _ relative//定义输入路径

//grpc.proto /定义需要编译的文件

//两种文件一起生成

//协议-go _ out=.-go _ opt=path=source _ relative \

//- go-grpc_out=.-go-grpc _ opt=path=source _ relative \

//grpc.proto

执行命令在当前文件夹生成文件

协议-外出=.-go _ opt=path=source _ relative \

- go-grpc_out=.-go-grpc _ opt=path=source _ relative \

grpc.proto

在服务下新建main.go

包装主体

导入(

上下文

google.golang.org/grpc

日志

"净"

Pb项目/testGrpc '

)

//在hello_grpc.pb.go里面找到迎宾服务器接口

//键入迎宾服务器接口{

////发送问候

//SayHello(上下文。上下文,*HelloRequest) (*HelloReply,错误)

//mustemembedunimplectdreeterserver()

//}

//根据格式,实现接口

//服务器用于实现你好。迎宾服务器.

类型服务器结构{

铅。未实现的问候服务器

}

//说Hello实现你好.迎宾服务器

func (s *server) SayHello(ctx上下文。上下文,单位为*pb .HelloRequest) (*pb .HelloReply,错误){ 0

//日志Printf('接收到: %v ',in .GetName())

返回铅.helloreplay {

消息:"你好"。GetName(),

},零

}

func main(){ 0

//监听传输控制协议的50051 端口

lis,err :=净值。监听(“tcp”,“localhost:50051”)

如果出错!=零

日志。宿命论('未能列出: %v ',错误)//监听发生错误就打印出来,随后退出

}

//初始化服务

s :=grpc .新闻服务器()

//注册服务

pb.RegisterGreeterServer(s, server{})
log.Printf("server listening at %v", lis.Addr()) // 一些无关紧要的打印信息
// 开启服务
err = s.Serve(lis)
if err != nil {
log.Fatalf("failed to serve: %v", err)
}
}

启动服务端

go run service/main.go

在 client 下新建main.go

package main
import (
    "context"
    "google.golang.org/grpc"
    "log"
    pb "project/testGrpc"
    "time"
)
func main() {
    // 开始请求服务端
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    // 请求结束后就自动关闭连接
    defer conn.Close()
    // 初始化客户端连接
    c := pb.NewGreeterClient(conn)
    // Contact the server and print out its response.
    //name := defaultName
    //if len(os.Args)  1 {
    //    name = os.Args[1]
    //}
    // 创建一个子节点的context,1秒后自动超时
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    // 发送请求体,返回内容
    r, err := c.SayHello(ctx, pb.HelloRequest{Name: "好家伙"})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

客户端开始连接测试

go run client/main.go

GRPC Gateway 实现

在主目录新建 hello.yaml

type: google.api.Service
config_version: 3
http:
  rules:
    - selector: tempPackageName.Greeter.SayHello
      get: /haha/{name}

创建 .bat 快捷键 (最后一行是生成gateway)

protoc --go_out=. --go_opt=paths=source_relative hello.proto
protoc --go-grpc_out=. --go-grpc_opt=paths=source_relative  hello.proto
protoc --grpc-gateway_out=. --grpc-gateway_opt=paths=source_relative,grpc_api_configuration=hello.yaml hello.proto

调用生成

./gen.bat

在 service/main.go 里面

package main
import (
    "context"
    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    "google.golang.org/grpc"
    "log"
    "net"
    "net/http"
    pb "project/testGrpc"
)
type server struct {
    pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return pb.HelloReply{
        Message: "Hello "+ in.GetName(),
    }, nil
}
func main() {
    // 新增 grpc gateway
    go grpcGateWay()
    // 监听 tcp 的 8088 端口
    lis, err := net.Listen("tcp", "localhost:50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err) // 监听发生错误就打印出来,随后退出
    }
    // 初始化服务
    s := grpc.NewServer()
    // 注册服务
    pb.RegisterGreeterServer(s, server{})
    log.Printf("server listening at %v", lis.Addr()) // 一些无关紧要的打印信息
    // 开启服务
    err = s.Serve(lis)
    if err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}
func grpcGateWay() {
    // 生成没有具体内容的上下文
    c := context.Background()
    // 给它新增退出功能
    c, cancel := context.WithCancel(c)
    defer cancel()
    mux := runtime.NewServeMux()
    // 注册 grpc 服务
    err := pb.RegisterGreeterHandlerFromEndpoint(
        c,
        mux,
        ":50051",
        []grpc.DialOption{grpc.WithInsecure()},
    )
    if err != nil {
        log.Fatalf("can not start grpc gateway:%v",err)
    }
    // 监听端口中的 HTTP 请求,监听到就按照 .yaml 的内容进行分发
    err = http.ListenAndServe(":8080",mux)
    if err != nil {
        log.Fatalf("can not start grpc gateway:%v",err)
    }
}

起服务后,浏览器访问

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/134426.html

(0)

相关推荐

  • Hive怎么优化查询效率

    技术Hive怎么优化查询效率这篇文章将为大家详细讲解有关Hive怎么优化查询效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1,开启FetchTask一个简单的查询语句,是指一个没

    攻略 2021年12月10日
  • Visual Studio 2005 SP1如何安装

    技术Visual Studio 2005 SP1如何安装小编给大家分享一下Visual Studio 2005 SP1如何安装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获

    攻略 2021年11月25日
  • 怎么画中国地图,晚清中国地图是如何绘制的

    技术怎么画中国地图,晚清中国地图是如何绘制的清朝的地图绘制有三种方法,第一种是传统绘制法,以“计里画方”法(方里网法)为主怎么画中国地图;第二种是西方经纬网法;第三种是双重网格法。“计里画方”法,实质是地图投影中的方格投

    生活 2021年11月1日
  • 抖音买10个赞自助下单平台,免费抖音下单网站?

    技术抖音买10个赞自助下单平台,免费抖音下单网站?抖音业务自助下单刷平台为明星、网红和企业提供抖音刷粉丝,抖音买粉丝,抖音买赞,抖音刷赞,抖音刷粉,抖音权限开通,抖音上热门等抖音服务,我们不同于其他网站,我们只做效率快的

    测评 2021年11月11日
  • 容斥问题公式,四个集合的容斥原理公式怎么解决

    技术容斥问题公式,四个集合的容斥原理公式怎么解决用|A|表示集合A的基数,也即集合A中元素的个数。则有|A∪B∪C∪D|=|A|+|B|+|C|+|D|-|A∩B|-|A∩C|-|A∩D|-|B∩C|-|B∩D|-|C∩

    生活 2021年10月26日
  • 形容种类多的成语,形容品种多的四字成语有哪些

    技术形容种类多的成语,形容品种多的四字成语有哪些形容种类多的成语   1形容种类多的成语、无穷无尽:穷:完。没有止境,没有限度。   
    2、不可胜举:指无法一一枚举,极言其多。   
    3、眼花缭乱:缭乱:纷乱。看着复杂纷

    生活 2021年10月24日