Cách xây dựng một microservice trong Python
Thiết kế phần mềm là một giai đoạn thiết yếu trong phát triển phần mềm. Cách tiếp cận thiết kế có thể ảnh hưởng đến toàn bộ dự án và cách bạn xử lý các yêu cầu khác nhau.
Các nhà phát triển thường sử dụng kiến trúc nguyên khối, kết hợp tất cả các thành phần phần mềm vào một mô-đun duy nhất. Tuy nhiên, cách tiếp cận này có thể tỏ ra không hiệu quả, đặc biệt đối với các ứng dụng lớn hơn.
Microservices nhằm mục đích giải quyết những hạn chế này. Microservice là một ứng dụng nhỏ, theo mô-đun thực hiện các chức năng cụ thể. Không giống như các ứng dụng nguyên khối, microservice cho phép triển khai và mở rộng quy mô độc lập. Kết quả là, chúng linh hoạt hơn và dễ bảo trì hơn.
Mục Lục
Kiến trúc vi dịch vụ
Kiến trúc microservice là một phương pháp thiết kế phần mềm chia nhỏ một ứng dụng lớn thành các dịch vụ độc lập, với mỗi dịch vụ được thiết kế để giải quyết một yêu cầu kinh doanh cụ thể.
Các dịch vụ này chạy trên các tài nguyên chuyên dụng, bao gồm các phiên bản cơ sở dữ liệu riêng biệt và sức mạnh tính toán. Không giống như các hệ thống nguyên khối, các ứng dụng microservice được kết hợp lỏng lẻo để mang lại tính linh hoạt cao hơn.
Trong một hệ thống phân tán, các nút máy chủ triển khai và thực thi các ứng dụng vi dịch vụ dưới dạng các quy trình riêng biệt—giao tiếp với nhau bằng các giao thức giao tiếp như HTTP hoặc thông qua các trình trung gian tin nhắn như RabbitMQ.
Về cơ bản, cách tiếp cận kiến trúc này cho phép các dịch vụ duy trì sự độc lập của chúng với nhau trong khi hoạt động hiệu quả trong hệ thống phần mềm.
Trong hướng dẫn này, chúng tôi sẽ hướng dẫn bạn triển khai một vi dịch vụ người dùng đơn giản để quản lý dữ liệu người dùng bằng Flask và PostgreSQL
Thiết lập cơ sở dữ liệu PostgreSQL
Để bắt đầu, hãy cài đặt PostgreSQL. Nếu chưa cài đặt PostgreSQL, bạn có thể tìm hiểu cách cài đặt PostgreSQL trên Windows hoặc cách cài đặt PostgreSQL trên macOS.
Ngoài ra, bạn có thể định cấu hình phiên bản cơ sở dữ liệu PostgreSQL từ xa.
Hướng dẫn này sẽ sử dụng bậc miễn phí của Render để thiết lập cơ sở dữ liệu PostgreSQL. Thực hiện theo các bước sau để tạo phiên bản cơ sở dữ liệu PostgreSQL trên Kết xuất:
- Truy cập trang web của Render, đăng ký tài khoản và đăng nhập vào tài khoản của bạn. bảng điều khiển trang.
- Trên trang bảng điều khiển của bạn, từ danh sách các dịch vụ được hiển thị, hãy chọn dịch vụ PostgreSQL.
- Trên trang cài đặt cơ sở dữ liệu, điền vào các chi tiết cần thiết và đảm bảo chọn bậc miễn phívà cuối cùng nhấp vào Tạo nên cơ sở dữ liệu.
Tạo một Flask Microservice
- Trong thiết bị đầu cuối của bạn, tạo một thư mục mới và thay đổi nó:
mkdir flask-microservice
cd flask-microservice - Tiếp theo, cài đặt virtualenvđể tạo ra một môi trường phát triển ảo biệt lập.
pip install virtualenv - Tạo một môi trường ảo trong dự án của bạn:
virtualenv venv - Cuối cùng, kích hoạt môi trường ảo.
# Windows:
.venvScriptsactivate
# Unix or MacOS:
source venv/bin/activate
Cài đặt các gói cần thiết
- Tạo một cái mới yêu cầu.txt tập tin trong thư mục gốc và thêm các gói này:
flask
psycopg2-binary
sqlalchemy - Tiếp theo, cài đặt các gói.
pip install -r requirements.txt
Tạo một máy chủ Flask
Trong thư mục gốc, tạo một tệp mới: dịch vụ.pyvà đoạn mã sau:
- Thực hiện nhập khẩu sau:
from flask import Flask, request, jsonify
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import psycopg2 - Tạo phiên bản Flask và định cấu hình kết nối cơ sở dữ liệu.
app = Flask(__name__)engine = create_engine("postgresql+psycopg2://flask_service_fe0v_user:4785MhjfkdjfhjfjyUx67O2Nuzjchb2MQIP@dpg-chffjfjdkgfk54d6mb7860-a.oregon-postgres.render.com/flask_service_fe0v")
Sao chép URL cơ sở dữ liệu bên ngoài trên trang cài đặt cơ sở dữ liệu của Render. Chúng ta sẽ sử dụng phương thức create_engine của SQLAlchemy và Tâm lý học2 để cấu hình kết nối cơ sở dữ liệu. Đảm bảo cập nhật và thay thế URL cơ sở dữ liệu trong mã trên bằng URL của phiên bản PostgreSQL của riêng bạn phù hợp với định dạng được chỉ định ở trên. Nếu định dạng URL không chính xác, mã sẽ báo lỗi.
- Tạo một mô hình SQLAlchemy cho cơ sở dữ liệu.
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
Base.metadata.create_all(engine)
print("Table 'users' created successfully.")
Session = sessionmaker(engine)Mã định nghĩa một mô hình dữ liệu cho bảng của người dùng. Sau khi xác định mô hình, nó tạo bảng bằng cách sử dụng SQLAlchemy tạo_all phương thức lấy cơ sở dữ liệu đối tượng động cơ kết nối như một tham số. Cuối cùng, nó tạo ra một thể hiện của người tạo phiên sử dụng cùng một đối tượng công cụ để cho phép tương tác với cơ sở dữ liệu.
- Cuối cùng, xác định các tuyến API cho microservice.
@app.route("/api/user", methods=["POST"])
def create_user():
data = request.get_json()
name = data["name"]
try:
session = Session()
new_user = User(name=name)
session.add(new_user)
session.commit()
return {"id": new_user.id, "name": new_user.name, "message": f"User {name} created."}, 201
except Exception as e:
print(f"The error '{e}' occurred.")
return {"error": "An error occurred while creating the user."}, 500
@app.route("/api/user", methods=["GET"])
def get_all_users():
try:
session = Session()
users = session.query(User).all()
if users:
result = []
for user in users:
result.append({"id": user.id, "name": user.name})
return jsonify(result)
else:
return jsonify({"error": f"Users not found."}), 404
except Exception as e:
print(f"The error '{e}' occurred.")
return {"error": "An error occurred while getting all users."}, 500
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")
Kiểm tra dịch vụ vi mô
Đoạn mã trên minh họa một vi dịch vụ dữ liệu người dùng đơn giản bổ sung và tìm nạp dữ liệu từ cơ sở dữ liệu PostgreSQL. Lý tưởng nhất là vi dịch vụ phản chiếu kiến trúc API REST vì nó cho phép cách tiếp cận linh hoạt để xây dựng dịch vụ web—kiến trúc này rất phù hợp với mẫu thiết kế của vi dịch vụ.
Tuy nhiên, điều quan trọng cần lưu ý là microservice cũng có thể sử dụng các loại phương pháp thiết kế và giao thức truyền thông khác, tùy thuộc vào nhu cầu cụ thể của hệ thống.
Để kiểm tra dịch vụ, hãy khởi động máy chủ phát triển và truy cập Postman để thực hiện các yêu cầu HTTP tới các điểm cuối đã xác định.
flask --app service run
Trong Postman, thực hiện yêu cầu POST để thêm dữ liệu người dùng.
Container hóa microservice với Docker
Docker gói các ứng dụng và phần phụ thuộc của chúng trong các thùng chứa. Cách tiếp cận này hợp lý hóa quá trình phát triển, triển khai và quản lý vi dịch vụ trong môi trường sản xuất vì mỗi dịch vụ có thể hoạt động độc lập và giao tiếp với các dịch vụ khác bằng giao thức truyền thông đã định cấu hình.
Trước khi bắt đầu, trước tiên bạn cần cài đặt Docker bằng cách làm theo các bước trên trang web Docker. Sau đó, tạo hình ảnh Docker từ Dockerfile chứa các hướng dẫn cần thiết để thiết lập các phần phụ thuộc cần thiết để chạy ứng dụng trong vùng chứa.
- Tạo Dockerfile trong thư mục gốc của thư mục dự án của bạn và thêm các hướng dẫn sau:
FROM python:3.9-alpine
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "./service.py"] - Chạy lệnh bên dưới để xây dựng hình ảnh Docker.
docker build -t flask-microservice . - Cuối cùng, chạy bộ chứa Docker.
docker run -p 5000:5000 flask-microservice
Thao tác này sẽ khởi động bộ chứa Docker chạy vi dịch vụ Flask và hiển thị cổng 5000 trên bộ chứa thành cổng 8000 trên máy chủ, cho phép bạn thực hiện các yêu cầu HTTP từ trình duyệt web hoặc Người đưa thư bằng cách sử dụng URL http://localhost:5000.
Áp dụng Kiến trúc microservice
Kiến trúc microservices đã trở thành một cách tiếp cận phổ biến để phát triển các ứng dụng phần mềm mạnh mẽ và có khả năng mở rộng. Bằng cách chia ứng dụng thành các dịch vụ nhỏ, có thể triển khai độc lập, kiến trúc microservice giúp việc bảo trì và mở rộng hệ thống trở nên dễ dàng hơn.
Mặc dù kiến trúc này có những lợi ích tiềm năng, nhưng nó không phù hợp với tất cả các trường hợp sử dụng. Trong mọi trường hợp, các yêu cầu kinh doanh cụ thể của dự án sẽ ảnh hưởng chủ yếu đến phương pháp thiết kế được thông qua.