天天看點

134、gRPC實作推薦系統用戶端和服務端編寫用戶端補全服務端

編寫用戶端

在toutiao-backend/common/rpc目錄下建立client.py

import grpc
import reco_pb2
import reco_pb2_grpc
import time


def feed_articles(stub):
    # 建構rpc調用的調用參數
    user_request = reco_pb2.UserRequest()
    user_request.user_id = '1'
    user_request.channel_id = 1
    user_request.article_num = 10
    user_request.time_stamp = round(time.time()*1000)

    # 通過stub進行方法調用,并接收調用傳回值
    ret = stub.user_recommend(user_request)
    print('ret={}'.format(ret))

def run():
    """
    rpc用戶端調用的方法
    """
    # 使用with語句連接配接rpc伺服器
    with grpc.insecure_channel('127.0.0.1:8888') as channel:
        # 建立調用rpc遠端服務的輔助對象stub
        stub = reco_pb2_grpc.UserRecommendStub(channel)
        # 通過stub進行rpc調用
        feed_articles(stub)

if __name__ == '__main__':
    run()
           

補全服務端

為了友善看到效果,我們編寫補全服務端代碼。

注意:此處實際推薦的代碼在後續推薦系統課程中會涉及到

在toutiao-backend/common/rpc目錄下建立server.py檔案

import reco_pb2
import reco_pb2_grpc
import grpc
from concurrent.futures import ThreadPoolExecutor
import time


# rpc接口定義中服務對應成Python的類
class UserRecommendService(reco_pb2_grpc.UserRecommendServicer):

    # 在接口定義的同名方法中補全,被調用時應該執行的邏輯
    def user_recommend(self, request, context):
        # request是調用的請求資料對象
        user_id = request.user_id
        channel_id = request.channel_id
        article_num = request.article_num
        time_stamp = request.time_stamp

        response = reco_pb2.ArticleResponse()
        response.exposure = 'exposure param'
        response.time_stamp = round(time.time()*1000)
        recommends = []
        for i in range(article_num):
            article = reco_pb2.Article()
            article.track.click = 'click param {}'.format(i+1)
            article.track.collect = 'collect param {}'.format(i+1)
            article.track.share = 'share param {}'.format(i+1)
            article.track.read = 'read param {}'.format(i+1)
            article.article_id = i+1
            recommends.append(article)
        response.recommends.extend(recommends)

        # 最終要傳回一個調用結果
        return response


def serve():
    """
    rpc服務端啟動方法
    """
    # 建立一個rpc伺服器
    server = grpc.server(ThreadPoolExecutor(max_workers=10))

    # 向伺服器中添加被調用的服務方法
    reco_pb2_grpc.add_UserRecommendServicer_to_server(UserRecommendService(), server)

    # 微伺服器綁定ip位址和端口
    server.add_insecure_port('127.0.0.1:8888')

    # 啟動rpc服務
    server.start()

    # start()不會阻塞,此處需要加上循環睡眠 防止程式退出
    while True:
        time.sleep(10)


if __name__ == '__main__':
    serve()
           
rpc