iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 18
0
DevOps

遠離 DevOops系列 第 18

[Day 18] Oops!gRPC - 問題整理分享

1. 接口參數異動 +-

gRPC proto 參數 「移除」 Client + Server -

Client +

message MailRequest {
  string title = 1;
  string author = 2;
}

Server -

message MailRequest {
  string title = 1;
}

雖然還是可以互通但是,還是要跟clien端確認參數已經移除了,請不要再使用囉!

gRPC proto 參數 「新增」 Client - Server +

Client -

message MailRequest {
  string title = 1;
}

Server +

message MailRequest {
  string title = 1;
  string author = 2;
}

Server端比Client端多參數是沒問題的。

2.比較特別的案例

以下是範例

我的 Server gPRC接口 參數 MailCount float64
Client端硬帶入 map[string]flaot64 => Server端就會收到 NaN

var z float64
nan := z / z

fmt.Println(nan > 1, nan < 100, math.IsNaN(nan), (nan > 100 || nan < 0))
false false true false

NaN 怎麼判斷數值都是 false

// 若有判斷MailCount的驗證 -> 會造成整個無法判斷
if in.MailCount > 100 || in.MailCount < 0 {
	return nil, errors.New(`MailCount value error`)
}

改善方法
// 多個判斷

if math.IsNaN(in.MailCount) {
	
}

golang grpc 對接不會有這問題 因為會無法go build
其他語言ex:js就不知道了

3. Client端參數沒帶值,但Server端還是有拿到值

import "google/protobuf/wrappers.proto";
message HelloRequest {
  google.protobuf.DoubleValue mail_count = 1;
  double mail_count_default = 2;
}
	fmt.Println("in.GetMailCount", in.GetMailCount())
	fmt.Println("in.GetMailCountDefault", in.GetMailCountDefault())
in.GetMailCount <nil>
in.GetMailCountDefault 0

當你的參數是可能有0的情況下,而client端真的沒帶該參數傳輸的情況!

需要在你的proto檔案內import google/protobuf/wrappers.proto,參數使用套件包過的型態,在Server端也要判斷是否為nil

我把build出來的proto.go內的判斷是拿出來給大家看。

func (m *HelloRequest) GetMailCount() *wrappers.DoubleValue {
	if m != nil {
		return m.MailCount
	}
	return nil
}

func (m *HelloRequest) GetMailCountDefault() float64 {
	if m != nil {
		return m.MailCountDefault
	}
	return 0
}

float64來看,用wrappers的型態,當client端真的沒傳值會回傳nil,而用預設的型態會預設回傳0!

4. 注意,Client端連線使用方式需改善!

Client端連線沒複用,每次請求都建一次連線,造成連線阻塞會越建越慢,當初還以為是Server端有問題找了半天。/images/emoticon/emoticon04.gif


上一篇
[Day 17] Oops!Golang - 讓我們來抓出吃資源的兇手!
下一篇
[Day 19] Oops!gRPC - Protoc 容器化實作
系列文
遠離 DevOops30

尚未有邦友留言

立即登入留言