![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iY5gTZ3ETNzUGM4YGZ1EWMxEmY1gjMkJmYwMTO4EGOx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
前沿
上回講到服務發現,也完成了服務發現的基礎建構。下面就要确定各個微服務之間的通訊協定了。
總的來說,初步分為幾個微服務,分為api,recall,filter,rank,先把這幾個微服務之間的通信協定定下來,再将裡面每一個子產品做完整。
先上github倉庫:github倉庫
第一版本簡單架構
api_server對外提供http服務,推薦系統内部則采用grpc通信。這圖确實有點醜,後面找點能看的。。。
通信協定
api_server調用recall_server protobuff
syntax = "proto3";
import "errmsg.proto";
package api;
option go_package = "go_server/src/lib/proto/api";
// 包括人口學特征,一些上下文特征等,後面會一直透傳這些特征。
message RecReq {
string trace_id = 1;
string user_id = 2;
string gender = 3;
int32 age = 4;
string app_version = 5;
string network = 6;
int32 page_num = 7;
int32 page_size = 8;
}
message RecRespItems {
string item_id = 1;
string params = 2;
}
message RecResp {
errmsg.ErrMsg err = 1;
repeated RecRespItems items = 2;
}
service Rec {
rpc Rec (RecReq) returns (RecResp) {}
}
recall_server調用filter_server
syntax = "proto3";
import "errmsg.proto";
import "recall.proto";
package filter;
option go_package = "go_server/src/lib/proto/filter";
message HistoryFilterReq {
string user_id = 1;
recall.RecallResp recallResp = 2;
}
message HistoryFilterResp {
errmsg.ErrMsg err = 1;
recall.RecallResp recallResp = 2;
}
message HistoryAddReq {
string user_id = 1;
int32 history_action = 2;
repeated string item_ids = 3;
}
message HistoryAddResp {
errmsg.ErrMsg err = 1;
}
service Filter {
rpc HistoryFilter (HistoryFilterReq) returns (HistoryFilterResp) {}
rpc HistoryAdd (HistoryAddReq) returns (HistoryAddResp) {}
}
api_server調用rank_server
syntax = "proto3";
import "api.proto";
import "recall.proto";
import "errmsg.proto";
package rank;
option go_package = "go_server/src/lib/proto/rank";
message RankReq {
api.RecReq req = 1;
recall.RecallResp recallResp = 2;
string bucket = 3;
}
message RankResp {
errmsg.ErrMsg err = 1;
repeated recall.RecallRespItems items = 2;
}
service Rank {
rpc Rank (RankReq) returns (RankResp) {}
}
需要注意的點
其中go_package參數,需要加上go_server字首,不然編譯後,會有一點小問題,在go mod包管理下,pb檔案裡import的路徑會不對,同時需要在Makefile裡加一些小改動,具體看github倉庫吧。
跑一下
起4個視窗,啟動etcd,将4個微服務啟動,進入etcd docker容器,可以看到服務已經注冊成功。
➜ ~ docker exec -it etcd /bin/sh
# etcdctl get --prefix ""
/etcd/test/filter_server/192.168.31.71:59270
192.168.31.71:59270
/etcd/test/rank_server/192.168.31.71:59275
192.168.31.71:59275
/etcd/test/recall_server/192.168.31.71:59280
192.168.31.71:59280
簡單調用一下,傳回結果符合預期,沒問題。
➜ ~ curl -d '{"user_id":"jinfeng"}' "http://127.0.0.1:20019/rec"
{"items":[{"item_id":"item_id1"},{"item_id":"item_id2"}]}
後面就可以加一些簡單的召回了,下周搞起,奧利給!