개요

오늘은 친숙한 Python 이라서 신난다.

오늘은 친숙한 Python 이라서 신난다.

gRPC-Python 개발

gRPC-Gateway

Gateway 서버로 예전에 사용해봤던 Flask로 개발 당첨! 많은 블로그를 참고해서 만들어보자.. + chatGPT

# gateway.py
from flask import Flask, request, jsonify
from flask_cors import CORS
import grpc
import auth_pb2
import auth_pb2_grpc
import board_pb2
import board_pb2_grpc

app = Flask(__name__)
CORS(app)

def get_auth_grpc_server():
    channel = grpc.insecure_channel('localhost:8082')
    auth_grpc_server = auth_pb2_grpc.AuthServiceStub(channel)
    return auth_grpc_server

def get_board_grpc_server():
    channel = grpc.insecure_channel('localhost:8081')
    board_grpc_server = board_pb2_grpc.BoardServiceStub(channel)
    return board_grpc_server

@app.route('/v1/register', methods=['POST'])
def register():
    data = request.get_json()
    auth_grpc_server = get_auth_grpc_server()

    grpc_request = auth_pb2.RegisterRequest(username=data['username'], password=data['password'])
    response = auth_grpc_server.Register(grpc_request)

    return jsonify(success=response.success, message=response.message)

@app.route('/v1/login', methods=['POST'])
def login():
    data = request.get_json()
    auth_grpc_server = get_auth_grpc_server()

    grpc_request = auth_pb2.LoginRequest(username=data['username'], password=data['password'])
    response = auth_grpc_server.Login(grpc_request)

    return jsonify(success=response.success, token=response.token, message=response.message)

@app.route('/v1/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    board_grpc_server = get_board_grpc_server()

    grpc_request = board_pb2.PostRequest(title=data['title'], content=data['content'], token=data['token'])
    response = board_grpc_server.CreatePost(grpc_request)

    return jsonify(success=response.success, message=response.message)

@app.route('/v1/posts', methods=['GET'])
def get_posts():
    board_grpc_server = get_board_grpc_server()

    grpc_request = board_pb2.Empty()
    response = board_grpc_server.GetPosts(grpc_request)

    posts = [{"title": post.title, "content": post.content, "username": post.username} for post in response.posts]
    return jsonify(posts=posts)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)


gRPC-BoardService

# board_service.py
import grpc
from concurrent import futures
import board_pb2
import board_pb2_grpc
import auth_pb2
import auth_pb2_grpc

# 들어오는 Post 담는 배열
posts = []

class BoardService(board_pb2_grpc.BoardServiceServicer):
    def __init__(self):
        self.auth_channel = grpc.insecure_channel('localhost:8082')
        self.auth_grpc_server = auth_pb2_grpc.AuthServiceStub(self.auth_channel)

    def CreatePost(self, request, context):
        verify_request = auth_pb2.VerifyTokenRequest(token=request.token)
        verify_response = self.auth_grpc_server.VerifyToken(verify_request)

        if not verify_response.valid:
            return board_pb2.PostResponse(success=False, message=verify_response.message)

        post = {"title": request.title, "content": request.content, "username": verify_response.username}
        posts.append(post)
        return board_pb2.PostResponse(success=True, message="게시글 생성 완료!")
    
    def GetPosts(self, request, context):
        response = board_pb2.PostsResponse()
        for post in posts:
            response.posts.add(title=post['title'], content=post['content'], username=post['username'])
        return response

def serve_board():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    board_pb2_grpc.add_BoardServiceServicer_to_server(BoardService(), server)
    server.add_insecure_port('[::]:8081')
    server.start()
    print("gRPC-BoardService 실행")
    server.wait_for_termination()

if __name__ == "__main__":
    serve_board()

gRPC-AuthService