Kiến trúc lục giác (hoặc “cổng và bộ điều hợp”) là một mẫu kiến trúc phần mềm phổ biến mà bạn có thể áp dụng khi xây dựng ứng dụng Go của mình. Sử dụng nó, bạn có thể cải thiện khả năng mở rộng, khả năng bảo trì và khả năng kiểm tra của ứng dụng.
Kiến trúc này giúp tách logic nghiệp vụ khỏi các phụ thuộc và cơ sở hạ tầng bên ngoài, giúp ứng dụng của bạn trở nên linh hoạt và dễ bảo trì hơn.
Kiến trúc hình lục giác là gì?
Kiến trúc hình lục giác chia các ứng dụng thành ba lớp chính:
- Các Lớp ứng dụng chứa logic cốt lõi của ứng dụng độc lập với mọi phụ thuộc của bên thứ ba. Lớp ứng dụng phải chứa logic nghiệp vụ, mô hình miền và dịch vụ ứng dụng của bạn.
- Các Lớp cổng và bộ điều hợp chứa các bộ điều hợp tương tác với các ứng dụng hiện có. Cổng là giao diện xác định các hoạt động cho ứng dụng của bạn, trong khi bộ điều hợp là triển khai của giao diện. Bộ điều hợp có thể là cơ sở dữ liệu, API HTTP, trình trung chuyển thông báo hoặc bất kỳ hệ thống bên ngoài nào khác.
- Lớp cơ sở hạ tầng chứa việc thực hiện các bộ điều hợp. Lớp cơ sở hạ tầng nên bao gồm cơ sở dữ liệu, môi giới thông báo và các hệ thống bên ngoài khác.
Ưu điểm của việc sử dụng kiến trúc lục giác
Kiến trúc hình lục giác phổ biến vì những ưu điểm sau mà nó mang lại.
Khả năng mở rộng và khả năng bảo trì của dự án
Việc phân chia các ứng dụng của bạn cho phép tạo ra một cơ sở mã theo mô-đun và tách rời giúp dễ dàng mở rộng quy mô và bảo trì ứng dụng của bạn.
Bạn có thể xóa bộ điều hợp mà không ảnh hưởng đến logic lõi và sửa đổi logic lõi mà không ảnh hưởng đến bộ điều hợp. Điều này có nghĩa là bạn có thể dễ dàng thay thế bộ điều hợp mà không cần viết lại toàn bộ ứng dụng của mình.
Khả năng kiểm tra và dễ dàng tích hợp
Kiến trúc hình lục giác thúc đẩy khả năng kiểm tra vì bạn có thể viết các bài kiểm tra đơn vị cho logic cốt lõi mà không cần giả định các phụ thuộc bên ngoài. Bạn có thể sử dụng các bản sao kiểm tra, chẳng hạn như hàng giả hoặc sơ khai, mà không cần phải thiết lập cơ sở dữ liệu hoặc trình môi giới tin nhắn.
Kiến trúc lục giác cũng giúp việc tích hợp ứng dụng của bạn với các hệ thống khác trở nên dễ dàng. Vì bộ điều hợp tách biệt với logic lõi nên bạn có thể sử dụng lại chúng trong các ứng dụng khác hoặc cho vi dịch vụ. Bạn cũng có thể hiển thị các API của cổng ứng dụng của mình để sử dụng trong các hệ thống khác.
Tính linh hoạt và khả năng thích ứng với các yêu cầu thay đổi
Kiến trúc hình lục giác cung cấp tính linh hoạt và khả năng thích ứng với các yêu cầu thay đổi. Vì logic cốt lõi độc lập với bộ điều hợp nên bạn có thể dễ dàng sửa đổi hoặc mở rộng chức năng của ứng dụng mà không ảnh hưởng đến bộ điều hợp.
Bạn có thể phát triển ứng dụng của mình theo thời gian, gắn bó với các hệ thống bên ngoài cụ thể.
Đi và kiến trúc lục giác
Về cốt lõi, kiến trúc lục giác là về việc tách logic nghiệp vụ cốt lõi của ứng dụng khỏi cơ sở hạ tầng để bạn có thể hoán đổi các thành phần phụ thuộc mà không ảnh hưởng đến logic cốt lõi của ứng dụng, giúp việc bảo trì và kiểm tra ứng dụng dễ dàng hơn.
Ứng dụng Go lục giác điển hình sử dụng bốn thư mục chính: cmd, nội bộ, pkgVà người bán.
Các cmd thư mục chứa các ứng dụng chính cho dự án. Mã bạn viết ở đây thường sẽ gọi các hàm từ tệp trong pkg và thư mục nội bộ.
Các nội bộ thư mục phải chứa mã ứng dụng riêng mà bạn không muốn người dùng nhập vào ứng dụng của họ. Trình biên dịch Go thực thi mẫu bố cục bên trong và bạn có thể có bao nhiêu thư mục nội bộ trong các thư mục khác tùy thích. Bạn không bị giới hạn ở thư mục nội bộ cấp cao nhất.
Các pkg thư mục phải chứa mã thư viện mà bạn muốn các ứng dụng bên ngoài nhập và sử dụng. Mặc dù sử dụng pkg thư mục là thông lệ, nó không được chấp nhận hoặc thi hành trên toàn cầu.
Các người bán thư mục phải chứa các phụ thuộc ứng dụng (được quản lý thủ công hoặc tự động). Bạn có thể dùng đi nhà cung cấp mod lệnh để tạo một /người bán thư mục để tận dụng các chức năng mà Go cung cấp cho các nhà cung cấp.
Triển khai Kiến trúc lục giác trong Go
Cấu trúc tệp dự án của bạn rất quan trọng khi triển khai kiến trúc lục giác bằng bất kỳ ngôn ngữ nào, kể cả Go.
Đây là cấu trúc tệp ví dụ để triển khai Kiến trúc lục giác trong Go:
.
├── cmd
│ └── http
│ └── main.go
├── internal
│ ├── adapters
│ │ ├── api
│ │ │ └── api_adapter.go
│ │ └── database
│ │ └── db_adapter.go
│ ├── app
│ │ ├── domain
│ │ │ ├── entity1.go
│ │ │ └── entity2.go
│ │ ├── ports
│ │ │ ├── input
│ │ │ │ ├── input_port1.go
│ │ │ │ └── input_port2.go
│ │ │ └── output
│ │ │ ├── output_port1.go
│ │ │ └── output_port2.go
│ │ └── usecases
│ │ ├── usecase1.go
│ │ └── usecase2.go
├── pkg
│ ├── input
│ │ ├── input1.go
│ │ └── input2.go
│ └── output
│ ├── output1.go
│ └── output2.go
└── vendor
├── module1
│ ├── file1.go
│ └── file2.go
└── module2
├── file1.go
└── file2.go
Các pkg thư mục chứa các cổng đầu vào và đầu ra của ứng dụng của bạn trong ví dụ này. Bạn sẽ xác định giao diện cho các cổng đầu vào và đầu ra trong các tệp này.
Các nội bộ thư mục chứa miền ứng dụng và các trường hợp sử dụng. Bạn sẽ viết logic nghiệp vụ của ứng dụng trong các tệp này.
Các bộ điều hợp thư mục chứa mã cơ sở hạ tầng kết nối ứng dụng của bạn với cơ sở dữ liệu và API.
Thiết lập cấu trúc tệp kiến trúc lục giác
Việc thiết lập cấu trúc tệp kiến trúc lục giác cho dự án của bạn có thể phức tạp, nhưng bạn có thể viết một tập lệnh bash để tự động hóa quá trình tạo thư mục.
Chạy lệnh này trong thư mục làm việc của dự án của bạn để tạo tập lệnh bash, lục giác.shvà cấp quyền đọc, viết và thực thi cho nó:
touch hexagonal.sh && chmod 777 hexagonal.sh
Nhập mã bash này vào lục giác.sh để tạo cấu trúc tệp trong thư mục làm việc hiện tại của bạn:
#!/bin/bash
mkdir cmd internal pkg vendor
mkdir cmd/http
mkdir internal/adapters internal/app internal/app/domain internal/app/ports internal/app/ports/input internal/app/ports/output internal/app/usecases
mkdir internal/adapters/api internal/adapters/database
mkdir internal/app/ports/input internal/app/ports/output
mkdir vendor/module1 vendor/module2
echo "Directory structure created successfully."
Bạn có thể chạy tập lệnh bash này bằng lệnh sau:
./hexagonal.sh
Chương trình bash tạo các thư mục và thư mục con để bạn có thể tiến hành tạo tệp và viết logic nghiệp vụ cho ứng dụng của mình.
Kiến trúc hình lục giác thuận tiện cho việc xây dựng các ứng dụng phức tạp
Việc triển khai kiến trúc lục giác có thể tốn thời gian, nhưng lợi ích lớn hơn chi phí về lâu dài. Bằng cách tách các mối quan tâm và làm cho mã của bạn có tính mô-đun hơn, bạn có thể dễ dàng bảo trì và kiểm tra các ứng dụng của mình.
Có nhiều mẫu kiến trúc khác, mỗi mẫu đều có ưu và nhược điểm để xây dựng các ứng dụng hiệu quả, linh hoạt. Chúng bao gồm kiến trúc MVC (model, view, controller) phổ biến để tạo các ứng dụng web.