iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0

在上一篇我們已經有定義.proto的描述檔,並且已生成對應.pb.go檔,所以接下來需以描述檔為基礎,來實現服務端的具體功能。

Server啟動

type ServerService struct{}
var UserData sync.Map

func main() {
	lis, err := net.Listen("tcp", ":8081")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterMyprotoServiceServer(s, &ServerService{})
	reflection.Register(s)

	if err := s.Serve(lis); err != nil {
		log.Fatal("grpc.Serve Error: ", err)
		return
	}
}

解說一下上面程式

  • 監聽指定的port(8081)
  • 首先需定義一個ServerService的建構體,讓gRPC Server可以實作註冊,這樣可以在收到請求時,將任務轉接到對應的處理邏輯。
  • reflection.Register在gRPC上註冊反射服務。

實作Proto功能

由於在描述檔有定義三個接口(AddUser、LoginUser、UsersList),所以需在Server端實現對應的function。

// rpc AddUser(UserRequest) returns (UserResponse){}
func (s *ServerService) AddUser(ctx context.Context, in *pb.UserRequest) (*pb.UserResponse, error) {
	var result string = "error"
	_, ok := UserData.Load(in.UserName)
	if !ok {
		UserData.Store(in.UserName, in.UserPwd)
		result = "ok"
	}
	return &pb.UserResponse{
		Result: result,
	}, nil
}
// rpc LoginUser(UserRequest) returns (UserResponse){}
func (s *ServerService) LoginUser(ctx context.Context, in *pb.UserRequest) (*pb.UserResponse, error) {
	var result string = "error"
	pwd, ok := UserData.Load(in.UserName)
	if ok {
		if in.UserPwd == pwd {
			result = "ok"
		}
	}
	return &pb.UserResponse{
		Result: result,
	}, nil
}
// rpc UsersList(UsersListRequest) returns (UsersListResponse){}
func (s *ServerService) UsersList(ctx context.Context, in *pb.UsersListRequest) (*pb.UsersListResponse, error) {
	var users []string
	f := func(k, v interface{}) bool {
		var name string
		name = k.(string)
		fmt.Println(k, v)
		users = append(users, name)
		return true
	}
	UserData.Range(f)
	return &pb.UsersListResponse{
		Result:   "ok",
		UserName: users,
	}, nil
}

以上就完成gRPC Server實作。


上一篇
Day5 gRPC (1) ProtoBuf
下一篇
Day7 gRPC (3) Client
系列文
微服務系統建置與監控30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言