多服务

多服务:

// 指定当前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成功")
}
posted @ 2023-09-26 17:27  CrryG_GPC  阅读(33)  评论(0)    收藏  举报