Leong's blog Leong's blog
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Leong Y

跑起来吧
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • docker简明教程
  • go-micro简明教程
  • grpc简明案例
    • 1、Protocol Buffers
    • 2、快速开始
      • 2.1、protobuf编写
      • 2.2、Server端编写
      • 2.2.1、引入fibonacci.proto生成的代码
      • 2.2.2、定义服务对象
      • 2.2.3、实现斐波那契计算函数
      • 2.2.4、开启服务
      • 2.2.5、完整server.go
      • 2.3、client端编写
  • Protocol Buffers学习
  • K8S
  • 容器部署
  • 微服务
leong
2024-07-03
目录

grpc简明案例

# 1、Protocol Buffers

Protocol Buffers学习

# 2、快速开始

以计算斐波那契数列作为服务快速编写一个grpc demo

目录结构:

.
├── client
├── proto
└── server
1
2
3
4

# 2.1、protobuf编写

fibonacci.proto

syntax = "proto3";

package fibonacci;

// 指定生成go文件的存放位置及其包名
option go_package = "./fibonacci";


service Fibonacci {
  rpc GetSequence(FibonacciRequest) returns (FibonacciResponse) {}
}

message FibonacciRequest {
  int32 length = 1;
}

message FibonacciResponse {
  repeated int64 sequence = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

代码生成

protoc --go_out=. --go-grpc_out=. fibonacci.proto
1

目录结构:

.
├── client
├── proto
│   ├── fibonacci
│   │   ├── fibonacci_grpc.pb.go
│   │   └── fibonacci.pb.go
│   └── fibonacci.proto
└── server
1
2
3
4
5
6
7
8

# 2.2、Server端编写

# 2.2.1、引入fibonacci.proto生成的代码

import pb ".../proto/fibonacci"
1

# 2.2.2、定义服务对象

type Server struct {
	pb.UnimplementedFibonacciServer
}
1
2
3

# 2.2.3、实现斐波那契计算函数

func (s *Server) GetSequence(ctx context.Context, req *pb.FibonacciRequest) (*pb.FibonacciResponse, error) {
	length := req.GetLength()
	sequence := make([]int64, length)
	if length > 0 {
		sequence[0] = 0
	}
	if length > 1 {
		sequence[1] = 1
	}
	for i := int32(2); i < length; i++ {
		sequence[i] = sequence[i-1] + sequence[i-2]
	}
	return &pb.FibonacciResponse{Sequence: sequence}, nil
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2.2.4、开启服务

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	
	pb.RegisterFibonacciServer(s, &Server{})
	fmt.Println("Server is running on port :50051")

	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2.2.5、完整server.go

package main

import (
	"context"
	"fmt"
	pb "[yourpath]/proto/fibonacci"
	"log"
	"net"

	"google.golang.org/grpc"
)

type Server struct {
	pb.UnimplementedFibonacciServer
}

// 斐波那契数列计算函数
func (s *Server) GetSequence(ctx context.Context, req *pb.FibonacciRequest) (*pb.FibonacciResponse, error) {
	length := req.GetLength()
	sequence := make([]int64, length)
	if length > 0 {
		sequence[0] = 0
	}
	if length > 1 {
		sequence[1] = 1
	}
	for i := int32(2); i < length; i++ {
		sequence[i] = sequence[i-1] + sequence[i-2]
	}
	return &pb.FibonacciResponse{Sequence: sequence}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	pb.RegisterFibonacciServer(s, &Server{})
	fmt.Println("Server is running on port :50051")

	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 2.3、client端编写

func main() {
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())

	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}

	defer conn.Close()
	c := pb.NewFibonacciClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()

	req := &pb.FibonacciRequest{Length: 10}
	res, err := c.GetSequence(ctx, req)
	if err != nil {
		log.Fatalf("could not get fibonacci sequence: %v", err)
	}

	fmt.Printf("Fibonacci sequence: %v\n", res.GetSequence())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2024/07/08, 18:19:51
go-micro简明教程
Protocol Buffers学习

← go-micro简明教程 Protocol Buffers学习→

最近更新
01
vue3快速上手
07-31
02
程序从加载到运行的过程
07-08
03
进程、线程、协程
07-08
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Leong Y | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式