1.grpc 远程加法计算

proto安装及proto-gen安装省略

2.proto文件编写

syntax="proto3";  //指定proto3格式

package service; 

option go_package="./;service"; //go 打包的package

service Calculator{
    rpc Add(Numbers) returns (CalResult){}  //定义一个服务 参数为Numbers 结果为CalResult
}

message Numbers{   //请求参数message,有a和b
    int64 a = 1;
    int64 b = 2;
}

message CalResult{ //响应结果 CalResult
    int64 message = 1;
}

生成go格式文件
protoc -I ./proto/ ./proto/calculator.proto --go_out=plugins=grpc:service

3.服务端

package main

import (
    "context"
    "fmt"
    "grpcdemo/service"
    "net"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
)


type Server struct{} //定义一个结构体实现Add()方法

func (s *Server) Add(ctx context.Context, in *service.Numbers) (*service.CalResult, error){
    return &service.CalResult{Message: in.A + in.B},nil
}

func main(){
    lis,err := net.Listen("tcp",":8089")
    if err != nil {
        fmt.Printf("监听端口失败:%s",err)
        return
    }
    s := grpc.NewServer()
    service.RegisterCalculatorServer(s,&Server{})
    reflection.Register(s)

    err = s.Serve(lis)

    if err != nil {
        fmt.Printf("开启服务失败:%s",err)
        return
    }
}

实现的方法为
1627268397(1).png

4.客户端调用

package main

import (
    "context"
    "fmt"
    "grpcdemo/service"
    "google.golang.org/grpc"
)


func main() {
    conn, err := grpc.Dial(":8089",grpc.WithInsecure())
    if err != nil{
        fmt.Printf("连接服务器失败:%s",err)
        return
    }
    defer conn.Close()
    c := service.NewCalculatorClient(conn)
    r,err := c.Add(context.Background(),&service.Numbers{A:1,B:2})  //指定调用请求参数
    if err != nil {
        fmt.Printf("调用服务端失败:%s",err)
        return
    }
    fmt.Printf("调用成功:%d \n",r.Message)
}

5.启动服务端和客户端

go run ./server/server.go
go run ./client/client.go

1627268676(1).png

代码结构
1627268761(1).png


你若安好便是晴天
82 声望10 粉丝