前沿
上回讲到服务发现,也完成了服务发现的基础构建。下面就要确定各个微服务之间的通讯协议了。
总的来说,初步分为几个微服务,分为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"}]}
后面就可以加一些简单的召回了,下周搞起,奥利给!