做一個處理用戶信息的微服務
客戶端通過用戶名,可以從服務端查詢用戶的基本信息
gRPC
proto
user.proto 定義客戶端請求、服務端響應的數據格式
user.pb.go 自動生成的,為數據交互提供的函數
server.go 微服務服務端
client.go 微服務客戶端
1. 編寫proto文件
// 版本號
syntax = "proto3";
// 指定生成 user.pb.go的包名
package proto;
// 定義客戶端請求的數據格式
message UserRequest{
// 定義請求參數
string name = 1;
}
// 定義服務端相應的額數據格式
message UserResponse{
//定義響應參數
int32 id = 1;
string name = 2;
int32 age = 3;
// 字段修飾符
// repeated表示可變數組,類似於切片類型
repeated string hobby = 4;
}
// 相當於接口
// service 定義開放調用的額服務
service UserInfoService{
//相當於接口內的方法
// 定義請求參數為UserRequest,響應參數為UserResponse
rpc GetUserInfo(UserRequest) returns (UserResponse){}
}
2. 生成.go文件
- pycharm 中打開命令行,輸入命令生成接口文件:
protoc -I . --go_out=plugins=grpc:. ./user.proto

3.編寫服務端
package main
import (
"context"
"fmt"
pb "go-micro/my-micro/gRPC/proto"
"google.golang.org/grpc"
"net"
)
// 定義服務端實現約定的接口
type UserInfoService struct {
}
var u = UserInfoService{}
// 實現服務端需要首先的接口
func (s *UserInfoService) GetUserInfo(ctx context.Context, req *pb.UserRequest) (resp *pb.UserResponse, err error) {
name := req.Name
// 在數據庫查用戶信息
if name == "zhangsan" {
resp = &pb.UserResponse{
Id: 1,
Name: name,
Age: 22,
//切片字段
Hobby: []string{"Sing", "run", "basketball"},
}
}
err = nil
return
}
func main() {
// 1. 監聽
addr := "127.0.0.1:8080"
lis, err := net.Listen("tcp", addr)
if err != nil {
fmt.Printf("監聽異常:%s\n", err)
}
fmt.Printf("開始監聽:%s\n", addr)
// 2.實例化gRPC
s := grpc.NewServer()
// 3.在gRPC上注冊微服務
// 第二個參數類型需要接口類型的變量
pb.RegisterUserInfoServiceServer(s,&u)
// 4.啟動gRPC服務
s.Serve(lis)
}
4. 編寫客戶端
package main
import (
"context"
"fmt"
pb "go-micro/my-micro/gRPC/proto"
"google.golang.org/grpc"
)
func main() {
// 1. 創建與gRPC服務端的連接
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
fmt.Printf("連接異常:%s\n", err)
}
defer conn.Close()
// 2. 實例化gRPC客戶端
client := pb.NewUserInfoServiceClient(conn)
// 3. 組裝參數
req := new(pb.UserRequest)
req.Name = "zhangsan"
// 4. 調用接口
resp, err := client.GetUserInfo(context.Background(), req)
if err != nil {
fmt.Printf("響應異常:%s\n", err)
}
fmt.Printf("響應結果: %v\n", resp)
}


