A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 不二晨 于 2018-7-10 10:58 编辑

proto文件:

/*
* @Title: 服务接口说明
* @Description: 接口目录
*/
service SpotDataHandler {   
rpc GetProductInfo(GetProductInfoRequest) returns (GetProductInfoResponse)
{}
//获取所有商品信息}
/**
* @Title: 统一说明
* @Description: 通用message定义
message SpotPriceInfo {   
double high = 2;//当日最高   
double low = 3;//当日最低   
double average = 4;//当日平均   
double vchange = 5;//当日涨跌   
double vchange_rate = 6;//当日涨跌幅   
int32 price_state = 7;//价格状态,0正常,1缺货,2休盘   
string renew_date = 8;//更新日期,YYYY-MM-DD格式   
string renew_time = 9;//更新时间,HH:MM:SS格式   
string price_declaration = 10;//价格说明
}
message PriceType
{   
oneof TypeEnum
{        
SpotPriceInfo spot_price = 1;//现货   
}}
message PriceInfo
{   
string product_id = 1;//产品id   
string product_name = 2;//产品名称   
string unit = 3;//单位   
repeated PriceType price_list = 4;
}
/**
* @Title: 1.获取所有分类信息
* @Description:
* @Request: GetProductInfoRequest
* @Response: GetProductInfoResponse
*/
message GetProductInfoRequest
{   
string language = 1;//cn中文,en英文
}
message ProductInfo
{   
string product_id = 1;//产品id   
string product_name = 2;//产品名称   
string spec = 3;//产品规格   
string brand_mark = 4;//品牌   
string area = 5;//地区   
string unit = 6;//单位
}
message GetProductInfoResponse
{   
message CategoryInfo
{        
int32 category_id = 1;//属性id,唯一        
string category_name = 2;//属性名称        
int32 list_order = 3;//排序id        
repeated ProductInfo products = 4;//商品列表   
}   
message ItemInfo
{        
int32 item_id = 1;//品目id,唯一        
string item_name = 2;//品目名称        
int32 list_order = 3;//排序id        
repeated CategoryInfo categories = 4;   
}   
MessageProto codeMsg = 1;   
repeated ItemInfo items = 2;
}

然后由这个proto文件生成对应的pb.go:

...type SpotDataHandlerServer interface {   

GetProductInfo(context.Context, *GetProductInfoRequest) (*GetProductInfoResponse, error)
}...

服务端:

//实现pb.go中interface定义的方法

func (s *SpotDataHandler) GetProductInfo(c context.Context, req *spot.GetProductInfoRequest) (*spot.GetProductInfoResponse, error) {   
// check param   
switch strings.ToLower(req.Language) {   
case SpotDataHandler_Language_CN:   
case SpotDataHandler_Language_EN:   
default:        
req.Language = SpotDataHandler_Language_CN    }   
var itemInfoList []*spot.GetProductInfoResponse_ItemInfo   
for _, item := range memory.GetItemListNoLimit() {        
if item.Id <= 0 {            continue        }        var categoryList []*spot.GetProductInfoResponse_CategoryInfo      
for _, tagId := range memory.GetTagIdsByItem(item.Id) {            relation := memory.GetRealtionByTagId(tagId)            
if relation == nil {                continue            }            cat := memory.GetCategoryTag(relation.CategoryId)            
if cat == nil {                continue            }            var proudctList []*spot.ProductInfo           
for _, productId := range memory.GetProductIdsByTagId(tagId) {                productDetail := memory.GetProductInfoNoLimit(productId)               
if productDetail == nil {                    continue                }               
if productDetail.PriceType > constant.Price_Type_Premium {                    continue                }               
name := productDetail.ProductName               
spec := productDetail.Spec               
brand := productDetail.BrandMark               
unit := productDetail.Unit               
area := productDetail.Area               
if strings.ToLower(req.Language) == SpotDataHandler_Language_EN {                    productDetailEn, err := cache.GRedis[cache.REDIS.CacheGetEnProductDetailByID(productId)                    
if err != nil {                        productDetailEn, err = db.DBGetEnProductDetailByProductID(productId)                        
if err != nil {                            logger.Warnning(err)                           
continue                        }                        
go command.LoadEnProducts(constant.PROGRAM_ENV_EN)                    
}                    
name = productDetailEn.ProductName                    
spec = productDetailEn.Spec                    
brand = ""                    
unit = productDetailEn.Unit                    
area = ""               
}               
proudctList = append(proudctList, &spot.ProductInfo{                    
ProductId:   productId,                    
ProductName: name,                    
Spec:        spec,                    
BrandMark:   brand,                    
Unit:        unit,                    
Area:        area,               
})            
}            
if len(proudctList) == 0 {                continue            }            categoryList = append(categoryList, &spot.GetProductInfoResponse_CategoryInfo{               
CategoryId:   int32(cat.Id),                C
ategoryName: cat.CategoryName,               
ListOrder:    int32(cat.ListOrder),               
Products:     proudctList,            
})        }      
if len(categoryList) == 0 {            continue        }        
itemInfoList = append(itemInfoList, &spot.GetProductInfoResponse_ItemInf
o{            
ItemId:     int32(item.Id),            
ItemName:   item.ItemName,            
ListOrder:  int32(item.ListOrder),           
Categories: categoryList,        })    }   
return &spot.GetProductInfoResponse{        
CodeMsg: &spot.MessageProto{            
Code: protocol.RESPONSE_CODE_SUCCESS,            
Msg:  protocol.RESPONSE_MSG_SUCCESS,        },        
Items: itemInfoList,    },
nil
}

客户端:

func initSpotGRPCConn() {   

// Set up a connection to the server.   
logger.Debug("connect GRPC service", common.GetConfigs().API.SpotCenterGRPC)   
conn, err := grpc.Dial(common.GetConfigs().API.SpotCenterGRPC, grpc.WithInsecure(), grpc.WithReadBufferSize(10*1024*1024), grpc.WithWriteBufferSize(1*1024*1024))   
if err != nil {        
log.Fatalf("did not connect: %v", err)   
}   
DefaultSpotDataConn = conn   
logger.Debug("init spot api")   
DefaultSpotDataClient = spot.NewSpotDataHandlerClient(DefaultSpotDataConn)}func getSpotItems(pr *spot.GetProductInfoRequest) ([]*spot.GetProductInfoResponse_ItemInfo, error)
{   
con, _ := context.WithTimeout(context.Background(), time.Second*utility.TIME_OUT)   
replay, err := invoke.DefaultSpotDataClient.GetProductInfo(con, pr)   
if err != nil
{        
return nil, err   
}   
if replay.CodeMsg == nil
{
      
return nil, utility.NewError(utility.ERROR_RPC_CODE, utility.ERROR_MSG_RPC_DATA_NULL)   


}
   
// success == 0   
if replay.CodeMsg.Code != utility.SMMSPOT_DATABASE_SUCCESS
{
        
return nil, utility.NewError(utility.ERROR_RPC_CODE, replay.CodeMsg.Msg)
    }   
if replay.Items == nil
{        
return nil, utility.NewError(utility.ERROR_RPC_CODE, utility.ERROR_MSG_RPC_DATA_NULL)   
}   
return replay.Items, nil}


【转载】原文地址:https://blog.csdn.net/jeffrey11223/article/details/80946121



3 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马