Hero Image
[架構] 多層式架構(Multi-layer Architecture)

中文多層架構的層可翻作 layer 或 tier,兩者主要的差別在於 layer 指程式邏輯在應用程式的位置;而 tier 指 layer 在系統上實際部屬執行的位址,屬於物理層級的指涉。這一篇的層說的是 layer,談如何在軟體層面利用分層 (layer) 妥善安排程式碼,以 multi-layer 撰寫程式碼能將複雜的邏輯隔離開達成關注點分離(SoC, Separation of concerns),好處有: 降低耦合:程式拆成各司其職的單元,降低彼此耦合,增加程式單元彈性(擴展性)、複用性。 易於維護:多層式架構中程式碼各司其職,容易定位問題發生點、而非從整個應用程式邏輯找。 敏捷開發:程式可快速回應需求修改(理由與易於維護類似,但是在開發時獲得的好處)。 平行開發:解耦的程式有助於降低協作併版衝突。 分層 三層式架構 一般來說最常用的三層式架構組成為: 表現層 (PL; Presentation Layer):ASP 內就是 Controller 結尾。 商業邏輯繩 (BLL; Business Logic Layer):又稱為 Service Layer,命名習慣是 Service、Helper 結尾。 資料存取層(DAL; Data Access Layer):命名習慣是 Repo 結尾。 另外有人將 Domain、Common 稱為一層,但這個部分其實不太像層,因為會被每一層引用,在架構上呈現比較不像層那樣扁平,裡面包含: Model、Entity、DTO(Data transfer object) 或 Value Object,這裡只有屬性沒有方法。 四層式架構 為了降低 PL 與 BL 之間的耦合,有時會在 Business Logic Layer(BLL) 上再疊一層 Service Layer(SL),作為 Presentation Layer 與 Business Layer 的中介層,這時 Business Logic Layer 的命名就不以 Serviece 結尾,通常較大型專案才需要如此分法。 而 SL 和 BLL 的差別在於商業邏輯精細度,一個SL操作 (coarse-grained operation) 通常包含複數BL操作 (fine-grained operation)。

Hero Image
[Keycloak] docker 安裝

採用的映象檔是 bitnami/keycloak ,因為我需要使用網址來區分服務(同一個 port 的情況下),所以採取反向代理的方式,一方面讓之後要部屬其他應用、加上憑證、等等操作都交給 nginx 比較方便。 建立 docker 網路 mynetwork,如果設定其他名稱,以下步驟再自行調整對應。 docker create network mynetwork 建立 docker-compose 環境 keycloak/.env KEYCLOCK_IMAGE=bitnami/keycloak:23.0.3 KEYCLOAK_DATABASE_VENDOR=postgresql KEYCLOAK_DATABASE_PORT=5432 KEYCLOAK_DATABASE_USER=keycloak KEYCLOAK_DATABASE_PASSWORD=password KEYCLOAK_DATABASE_NAME=keycloak KEYCLOAK_ADMIN_USER=admin KEYCLOAK_ADMIN_PASSWORD=admin keycloak/docker-compose.yml version: '3' volumes: postgres_data: driver: local services: keycloak_db: image: postgres restart: always volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: ${KEYCLOAK_DATABASE_NAME} POSTGRES_USER: ${KEYCLOAK_DATABASE_USER} POSTGRES_PASSWORD: ${KEYCLOAK_DATABASE_PASSWORD} networks: - mynetwork keycloak: image: ${KEYCLOCK_IMAGE} environment: KEYCLOAK_DATABASE_VENDOR: ${KEYCLOAK_DATABASE_VENDOR} KEYCLOAK_DATABASE_HOST: keycloak_db KEYCLOAK_DATABASE_PORT: ${KEYCLOAK_DATABASE_PORT} KEYCLOAK_DATABASE_NAME: ${KEYCLOAK_DATABASE_NAME} KEYCLOAK_DATABASE_USER: ${KEYCLOAK_DATABASE_USER} KEYCLOAK_DATABASE_PASSWORD: ${KEYCLOAK_DATABASE_PASSWORD} KEYCLOAK_DATABASE_SCHEMA: public KEYCLOAK_ADMIN_USER: ${KEYCLOAK_ADMIN_USER} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} KEYCLOAK_ENABLE_HEALTH_ENDPOINTS: 'true' KEYCLOAK_ENABLE_STATISTICS: 'true' KC_PROXY: edge KC_PROXY_ADDRESS_FORWARDING: 'true' KC_HTTP_ENABLED: 'true' restart: unless-stopped networks: - mynetwork depends_on: - keycloak_db networks: mynetwork: external: true 建立 nginx/nginx.conf,這裡我把 keycloak.docker.vm 給 keycloak,裡面有一些設置 ssl 用得到的區塊放置在註解。