多服务
多服务:
// 指定当前proto语法的版本,有2和3
syntax = "proto3";
//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录
//name 表示生成的go文件所属的包名
option go_package = "../service";
// 指定等会儿文件生成出来的pakage
package service;
message ProductRequest{
int32 prod_id = 1;
}
message ProductResponse{
int32 prod_stock = 1;
}
//定义服务主题
service ProdService {
// 定义方法
rpc look(ProductRequest) returns(ProductResponse);
}
service {
rpc Buy(ProductRequest) returns(ProductResponse);
}
服务端
package main
import (
"duoservice/service"
"fmt"
"google.golang.org/grpc"
"log"
"net"
)
func main() {
rpcService := grpc.NewServer()
service.RegisterProdServiceServer(rpcService, &service.ProdService{})
service.RegisterVideoServiceServer(rpcService, &service.VideoService{})
conn, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(" 启动监听出错", err)
}
err = rpcService.Serve(conn)
if err != nil {
log.Fatal("启动gRpc服务出错", err)
}
fmt.Println("启动gRpc成功")
}
客户端:
package main
import (
"context"
"duoservice/service"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
addr := ":8080"
conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal("服务端连接出错:", err)
}
defer conn.Close()
VideoClient := service.NewVideoServiceClient(conn)
buy, err := VideoClient.Buy(context.Background(), &service.ProductRequest{ProdId: 1})
if err != nil {
log.Fatal("Buy出错:", err)
}
fmt.Println("Buy:", buy.ProdStock)
Prodclient := service.NewProdServiceClient(conn)
look, err := Prodclient.Look(context.Background(), &service.ProductRequest{ProdId: 2})
if err != nil {
log.Fatal("Look出错:", err)
}
fmt.Println("Look:", look.ProdStock)
}
多个proto文件
当项目大起来之后,会有很多个 service,rpc,message
我们会将不同服务放在不同的 proto 文件中
还可以放一些公共的 proto 文件
对于这方面的资料,可以说全网的正确资料真的相当少
其实本质就是生成 go 文件,需要在一个包内
common.proto:公共的proto文件
// 指定当前proto语法的版本,有2和3
syntax = "proto3";
//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录
//name 表示生成的go文件所属的包名
option go_package = "../proto";
// 指定等会儿文件生成出来的pakage
package proto;
// 公共的proto
message Request {
string name = 1;
}
message Response{
string name = 1;
}
video.proto
// 指定当前proto语法的版本,有2和3
syntax = "proto3";
//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录
//name 表示生成的go文件所属的包名
option go_package = "../proto";
// 指定等会儿文件生成出来的pakage
package proto;
import "common.proto";
service VideoService {
rpc Look(Request) returns(Response);
}
order.proto
// 指定当前proto语法的版本,有2和3
syntax = "proto3";
//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录
//name 表示生成的go文件所属的包名
option go_package = "../proto";
// 指定等会儿文件生成出来的pakage
package proto;
import "common.proto";
service OrderService {
rpc Buy(Request) returns(Response);
}
注意:
- 如果有import,必须加上package
- import和package必须相同
客户端:
package main
import (
"context"
"duoservice/proto"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
addr := ":8080"
conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal("服务端连接出错:", err)
}
defer conn.Close()
//VideoClient := service.NewVideoServiceClient(conn)
VideoClient := proto.NewVideoServiceClient(conn)
video, err := VideoClient.Look(context.Background(), &proto.Request{Name: "张三"})
if err != nil {
log.Fatal("VideoLook出错:", err)
}
fmt.Println("Look:", video.Name)
orderService := proto.NewOrderServiceClient(conn)
order, err := orderService.Buy(context.Background(), &proto.Request{Name: "李四"})
if err != nil {
log.Fatal("OrderBuy出错:", err)
}
fmt.Println("Buy:", order.Name)
//buy, err := VideoClient.Buy(context.Background(), &service.ProductRequest{ProdId: 1})
//if err != nil {
// log.Fatal("Buy出错:", err)
//}
//fmt.Println("Buy:", buy.ProdStock)
//Prodclient := service.NewProdServiceClient(conn)
//look, err := Prodclient.Look(context.Background(), &service.ProductRequest{ProdId: 2})
//if err != nil {
// log.Fatal("Look出错:", err)
//}
//fmt.Println("Look:", look.ProdStock)
}
服务端:
package main
import (
"duoservice/proto"
"fmt"
"google.golang.org/grpc"
"log"
"net"
)
func main() {
rpcService := grpc.NewServer()
proto.RegisterVideoServiceServer(rpcService, &proto.VideoService{})
proto.RegisterOrderServiceServer(rpcService, &proto.OrderService{})
//service.RegisterProdServiceServer(rpcService, &service.ProdService{})
//service.RegisterVideoServiceServer(rpcService, &service.VideoService{})
conn, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(" 启动监听出错", err)
}
err = rpcService.Serve(conn)
if err != nil {
log.Fatal("启动gRpc服务出错", err)
}
fmt.Println("启动gRpc成功")
}

浙公网安备 33010602011771号