오늘은 친숙한 Python 이라서 신난다.
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)
# 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()