不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • python基础

  • python模块

  • django

  • flask

  • SYL

  • Celery

  • 微服务

    • 01.grpc基本使用
    • 02.grpc_flask
      • 01.grpc-flask-test项目说明
        • 1.1 项目结构
        • 1.2 运行项目
      • 02.项目文件
        • 2.1 protos/recommendations.proto
        • 2.2 grpc服务端
        • 2.2.1 grpc-server/server.py
        • 2.2.2 grpc-server/recommendations.py
        • 2.3 grpc客户端
        • 2.3.1 grpc-client/app.py
        • 2.3.2 grpc-client/controllers/marketplace.py
    • 03.nacos_python封装
  • python
  • 微服务
xiaonaiqiang
2021-12-14
目录

02.grpc_flask

# 01.grpc-flask-test项目说明

  • 项目案例地址 (opens new window)

# 1.1 项目结构

# 1.2 运行项目

  • 生成 protoc文件
# 指定文件夹生成
cd protos
python3 -m grpc_tools.protoc -Iprotos --python_out=compiles --grpc_python_out=compiles protos/recommendations.proto
1
2
3
  • 安装包

python3 -m pip install -r requirements.txt


- `启动grpc 服务端`

```bash
cd grpc-server
python3 server.py
# server will start localhost:50051
1
2
3
4
5
6
7
  • 启动 grpc客户端
cd grpc-client
python3 app.py
# flask server will start ```localhost:5000```
1
2
3
  • http://127.0.0.1:5000/ 谷歌浏览器
{
  "recommendations": [
    {
      "id": 1, 
      "title": "The Maltese Falcon"
    }, 
    {
      "id": 3, 
      "title": "The Hound of the Baskervilles"
    }, 
    {
      "id": 2, 
      "title": "Murder on the Orient Express"
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 02.项目文件

# 2.1 protos/recommendations.proto

cd protos
python3 -m grpc_tools.protoc -Iprotos --python_out=compiles --grpc_python_out=compiles protos/recommendations.proto
1
2
syntax = "proto3";

enum BookCategory {
    MYSTERY = 0;
    SCIENCE_FICTION = 1;
    SELF_HELP = 2;
}

message RecommendationsRequest {
    int32 user_id = 1;
    BookCategory category = 2;
    int32 max_results = 3;
}

message BookRecommendations {
    int32 id = 1;
    string title = 2;
}

message RecommendationsResponse {
    repeated BookRecommendations recommendations = 1;
}

service Recommendations {
    rpc Recommend (RecommendationsRequest) returns (RecommendationsResponse) {}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 2.2 grpc服务端

# 2.2.1 grpc-server/server.py

import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

import time
import grpc
import random
import logging
from signal import signal, SIGTERM, SIGINT
from concurrent import futures
from recommendations import books_by_category
from protos.recommendations import recommendations_pb2, recommendations_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class RecommendationsService(recommendations_pb2_grpc.RecommendationsServicer):
    def Recommend(self, request, context):
        # books_by_category --> 模拟从数据库取数据
        if request.category not in books_by_category:
            context.abort(grpc.StatusCode.NOT_FOUND, "Category not found")
        books_for_category = books_by_category[request.category]
        num_results = min(request.max_results, len(books_for_category))
        books_to_recommend = random.sample(books_for_category, num_results)
        return recommendations_pb2.RecommendationsResponse(recommendations=books_to_recommend)


# Server setup and starting
def serve():
    # 通过并发库,将服务端放到多进程池里运行
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    # add_XxxServicer_to_server用于把实现的类和grpcAPI调用注册起来
    recommendations_pb2_grpc.add_RecommendationsServicer_to_server(RecommendationsService(), server)
    print("Starting server. Listening on port 50051.")
    server.add_insecure_port("127.0.0.1:50001")
    server.start()

    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        logging.debug('GRPC stop')
        server.stop(0)
    # 当server服务退出才会调用这里,然后执行下面函数
    def handle_sigterm(*_):
        all_rpcs_done_event = server.stop(30)
        all_rpcs_done_event.wait(30)
        print("Shut down gracefully")

    signal(SIGTERM, handle_sigterm)
    signal(SIGINT, handle_sigterm)
    server.wait_for_termination()


if __name__ == '__main__':
    logging.basicConfig()
    serve()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# 2.2.2 grpc-server/recommendations.py

# recommendations.py
from protos.recommendations.recommendations_pb2 import (
    BookCategory,
    BookRecommendations
)

books_by_category = {
    BookCategory.MYSTERY: [
        BookRecommendations(id=1, title="The Maltese Falcon"),
        BookRecommendations(id=2, title="Murder on the Orient Express"),
        BookRecommendations(id=3, title="The Hound of the Baskervilles"),
    ],
    BookCategory.SCIENCE_FICTION: [
        BookRecommendations(id=4, title="The Hitchhiker's Guide to the Galaxy"),
        BookRecommendations(id=5, title="Ender's Game"),
        BookRecommendations(id=6, title="The Dune Chronicles"),
    ],

    BookCategory.SELF_HELP: [
        BookRecommendations(id=7, title="The 7 Habits of Highly Effective People"),
        BookRecommendations(id=8, title="How to Win Friends and Influence People"),
        BookRecommendations(id=9, title="Man's Search for Meaning"),
    ],

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 2.3 grpc客户端

# 2.3.1 grpc-client/app.py

import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

from controllers.marketplace import app


if __name__ == "__main__":
    app.run(debug=True)
1
2
3
4
5
6
7
8
9
10

# 2.3.2 grpc-client/controllers/marketplace.py

import json
import os
import grpc
from flask import Flask, render_template, jsonify
from protos.recommendations.recommendations_pb2 import RecommendationsRequest, BookCategory
from protos.recommendations.recommendations_pb2_grpc import RecommendationsStub
from google.protobuf.json_format import MessageToJson


app = Flask(__name__)

recommendations_host = os.getenv("RECOMMENDATIONS_HOST", "localhost")
recommendations_channel = grpc.insecure_channel(
    f"{recommendations_host}:50051"
)
recommendations_client = RecommendationsStub(recommendations_channel)


@app.route("/")
def home_page():
    recommendations_request = RecommendationsRequest(
        user_id=1, category=BookCategory.MYSTERY, max_results=3
    )
    recommendations_response = recommendations_client.Recommend(
        recommendations_request
    )
    serialized = json.loads(MessageToJson(recommendations_response))
    return jsonify(serialized)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
上次更新: 2024/3/13 15:35:10
01.grpc基本使用
03.nacos_python封装

← 01.grpc基本使用 03.nacos_python封装→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式