一、go 语言编写 grpc 微服务实例

本贴最后更新于 2361 天前,其中的信息可能已经时移世易

grpc

grpc 跨平台微服务框架,但是缺少服务治理的功能,服务发现给出了架子需要自己实现。

go 包下载

go get -u google.golang.org/grpc

proto 工具下载

1、下载 idl 代码生成工具

https://repo1.maven.org/maven2/com/google/protobuf/protoc/
protoc 放在环境变量的 path 中

2、下载生成 go 代码插件

go get -u github.com/golang/protobuf/protoc-gen-go

从 GoBin 目录中拷贝出来 protoc-gen-go,放在环境变量 path 中

IDL

IDL 语法,详细的请查看 Protobuf3 语言指南


例子

代码脚手架

1、编写 book.proto 文件

syntax = "proto3";  
  
// 请求书详情的参数结构  book_id 32位整形  
message BookInfoParams {  
    int32 book_id = 1;  
}  

// 书详情信息的结构   book_name字符串类型 
message BookInfo {  
    int32 book_id = 1;  
    string  book_name = 2;  
}  
  
// 请求书列表的参数结构  page、limit   32位整形
message BookListParams {  
    int32 page = 1;  
    int32 limit = 2;  
}  

// 书列表的结构    BookInfo结构数组
message BookList {  
    repeated BookInfo book_list = 1;  
}  
// 定义 获取书详情  和 书列表服务   入参出参分别为上面所定义的结构  
service BookService {  
    rpc GetBookInfo (BookInfoParams) returns (BookInfo) {}  
    rpc GetBookList (BookListParams) returns (BookList) {}  
}

2、生成对应语言 proto 代码

protoc --go_out=plugins=grpc:. book.proto

当前文件夹下会生成 book.pb.go 文件,也可以生成其它语言的代码

protoc --php_out=. book.proto

3、解决小冲突
gol 的 grpc 插件指定 context 路径 contextPkgPath = "golang.org/x/net/context"可能会与我们代码中的 context 冲突 把 book.proto 中 import"golang.org/x/net/context" 更改为 "context"

服务端代码

package main  
  
import (  
   "grpc-test/pb"  
   "net" "context" "google.golang.org/grpc"
)  
  
/**  
创建BookServer结构 实现 BookServiceServer接口  
type BookServiceServer interface {  
   GetBookInfo(context.Context, *BookInfoParams) (*BookInfo, error)
   GetBookList(context.Context, *BookListParams) (*BookList, error)
}  
*/
type BookServer struct {}  
func (s *BookServer) GetBookInfo(ctx context.Context, in *book.BookInfoParams) (*book.BookInfo, error) {  
   //请求详情时返回 书籍信息  
   b := new(book.BookInfo)  
   b.BookId = in.BookId  
   b.BookName = "21天精通php"  
   return b,nil  
}  
  
func (s *BookServer) GetBookList(ctx context.Context, in *book.BookListParams) (*book.BookList, error) {  
   //请求列表时返回 书籍列表  
   bl := new(book.BookList)  
   bl.BookList = append(bl.BookList, &book.BookInfo{BookId:1,BookName:"21天精通php"})  
   bl.BookList = append(bl.BookList, &book.BookInfo{BookId:2,BookName:"21天精通java"})  
   return bl,nil  
}  
  
func main() {  
   serviceAddress := ":50052"  
   bookServer := new(BookServer)  
   //创建tcp监听  
   ls, _ := net.Listen("tcp", serviceAddress)  
   //创建grpc服务  
   gs := grpc.NewServer()  
   //注册bookServer  
   book.RegisterBookServiceServer(gs, bookServer)  
   //启动服务  
   gs.Serve(ls)  
}

客户端代码

package main  
  
import (  
   "fmt"  
   "grpc-test/pb" "google.golang.org/grpc" 
   "context"
)  
  
func main() {  
   serviceAddress := "127.0.0.1:50052"  
   conn, err := grpc.Dial(serviceAddress, grpc.WithInsecure())  
   if err != nil {  
      panic("connect error")  
   }  
   defer conn.Close()  
   bookClient := book.NewBookServiceClient(conn)  
   bi,_:=bookClient.GetBookInfo(context.Background(),&book.BookInfoParams{BookId:1})  
   fmt.Println("获取书籍详情")  
   fmt.Println("bookId: 1", " => ", "bookName:", bi.BookName)  
  
   bl,_ := bookClient.GetBookList(context.Background(), &book.BookListParams{Page:1, Limit:10})  
   fmt.Println("获取书籍列表")  
   for _,b := range bl.BookList {  
      fmt.Println("bookId:", b.BookId, " => ", "bookName:", b.BookName)  
   }  
}

启动测试

启动 server,client

GOROOT=D:\Go #gosetup
GOPATH=D:\go\gopath #gosetup
D:\Go\bin\go.exe build -i -o C:\Users\Administrator\AppData\Local\Temp\___17110go_build_main_go.exe D:/go/gopath/src/grpc-test/client/main.go #gosetup
D:\软件\GoLand\bin\runnerw.exe C:\Users\Administrator\AppData\Local\Temp\___17110go_build_main_go.exe #gosetup
获取书籍详情
bookId: 1  =>  bookName: 21天精通php
获取书籍列表
bookId: 1  =>  bookName: 21天精通php
bookId: 2  =>  bookName: 21天精通java

Process finished with exit code 0
  • gRpc
    11 引用 • 9 回帖 • 53 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 306 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...