Open J Proxy (OJP) 入門指南
1. 概述
在本教程中,我們將使用簡單的 Spring Boot 應用程式、本機 PostgreSQL 執行個體和在 Docker 中執行的 OJP 伺服器,逐步介紹如何開始使用Open J Proxy ( OJP )。
OJP 充當 Type 3 JDBC 驅動程式和遠端七層資料庫代理,這意味著應用程式不會直接開啟資料庫連線。相反,它們會將 JDBC 操作傳送到 OJP 伺服器,由 OJP 伺服器集中管理連線池。
首先,我們將在 Docker 中執行 PostgreSQL,然後同樣在 Docker 中啟動 OJP 伺服器。之後,我們將建立一個 Spring Boot 項目,並將其與 OJP JDBC 驅動程式連接起來。我們將確保停用本機連線池,最後,我們將實作一個簡單的 CRUD 範例,以檢驗整個流程的運作情況。
雖然我們在這裡使用了Spring Boot ,但 OJP 驅動程式可以與Quarkus 、 Micronaut ,甚至是普通的JDBC 或任何其他依賴 JDBC 的框架一起使用。
在本教程中,我們將從頭開始創建一個簡單的 Spring Boot 項目,並將其與 OJP 完全整合。
2. 工作原理(概述)
雖然本教程專注於實際集成,但簡要了解 OJP 在請求路徑中的位置會有所幫助。
使用 OJP 時,應用程式永遠不會直接連接到 PostgreSQL。相反,所有資料庫存取都透過一個簡單而強大的鍊式流程進行:
應用程式 → OJP JDBC 驅動程式 → OJP 伺服器 → PostgreSQL
當應用程式請求 JDBC 連線時,OJP 驅動程式會傳回一個virtual連線。此時不會建立任何實體資料庫連線。應用程式可以準備語句、設定參數並執行業務邏輯,而無需佔用任何資料庫資源。
只有當語句實際執行時,OJP JDBC 驅動程式才會透過 gRPC 將請求轉送給 OJP 伺服器。伺服器(而非應用程式)擁有並管理實際的資料庫連接,這些連接位於一個共享連接池中。這使得 OJP 能夠有效率地在多個應用程式實例和服務之間重複使用連線。
這種架構顯著減少了連接風暴,協調了分散式服務的訪問,並保持了資料庫負載的穩定性和可預測性。
一個很自然的問題是: OJP 伺服器如何知道要連接到哪個資料庫?
答案很簡單。當 OJP JDBC 驅動程式與伺服器建立會話時,它會發送所有必要的連接元資料——資料庫 URL、憑證和驅動程式詳細資訊。 OJP 伺服器使用這些資訊透明地建立和管理相應的後端連線。
這樣就實現了職責的清晰分離:應用程式保持簡單,而 OJP 則負責處理它應該處理的複雜性。
3. 使用 Docker 運行 PostgreSQL
首先,我們需要使用以下命令啟動 PostgreSQL 容器:
docker run --name ojp-postgres
-e POSTGRES_USER=testuser
-e POSTGRES_PASSWORD=testpassword
-e POSTGRES_DB=defaultdb
-d -p 5432:5432 postgres:17
-c max_prepared_transactions=100
這將在連接埠 5432 上建立一個本地資料庫。
4. 運行 OJP 伺服器
然後我們將使用 Docker 啟動 OJP 伺服器:
docker run --rm -d --network host rrobetti/ojp:0.3.0-beta
伺服器預設監聽連接埠1059。
5. 創建 Spring Boot 應用程式
5.1 建立演示應用程式
我們將使用標準的 Spring Boot 結構,如下例所示:
我們還需要記住移除 HikariCP ,並使用按需開啟和關閉連線的驅動程式管理資料來源,因為 OJP 處理連線池。
讓我們把這段程式碼加入pom.xml中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!-- Use OJP's remote pool instead of Hikari -->
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
然後新增OJP Type 3 JDBC 驅動程式:
<dependency>
<groupId>org.openjproxy</groupId>
<artifactId>ojp-jdbc-driver</artifactId>
<version>0.3.1-beta</version>
</dependency>
5.2. 配置 Spring Boot 以使用 OJP
我們需要編輯application.properties 文件,使其類似於下面的程式碼片段:
spring.datasource.url=jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb
spring.datasource.username=testuser
spring.datasource.password=testpassword
spring.datasource.driver-class-name=org.openjproxy.jdbc.Driver
spring.datasource.type=org.springframework.jdbc.datasource.SimpleDriverDataSource # Force Spring to create/close connections on demand.
spring.jpa.hibernate.ddl-auto=create # Tell Hibernate to create the tables automatically.
我們使用SimpleDriverDataSource ,因為連接池必須完全委託給 OJP。
spring.datasource.url用來讓 OJP JDBC 驅動程式知道 OJP 伺服器的運作位置ojp[localhost:1059]以及實際資料庫的位置。這樣可以避免外部配置,簡化整合。
6.**統籌安排**
現在,讓我們設定一些範例類別: Book實體、 BookRepository儲存庫和BookController控制器,這是 REST 服務中的常見設定。
此時,應用程式透過 OJP 發送 SQL 操作,而不是直接連接到 PostgreSQL。
由於 PostgreSQL 和 OJP 已經運行,日誌應該顯示資料來源在沒有 Hikari 的情況下初始化,並且 JDBC 操作正在透過 OJP 進行。
現在我們可以測試一下這個應用了:
curl -X POST localhost:8080/books
-H "Content-Type: application/json"
-d '{"title": "OJP Introduction", "author": "Someone"}'
我們現在已經成功運行了一個 Spring Boot 應用程序,資料庫存取透過 OJP 進行路由。
7. 結論
本教學使用了 Spring Boot,但 OJP 也同樣適用於Quarkus、Micronaut、Helidon 或普通 JDBC。
OJP 也支援多種資料庫,包括 PostgreSQL、MySQL、MariaDB、Oracle、SQL Server、IBM DB2、CockroachDB 和 H2。
以下步驟可能包括:
- 嘗試多節點 OJP 部署
- 將 OJP 與無伺服器工作負載結合使用
- 透過 gRPC 介面與非 Java 語言集成
像往常一樣,我們的程式碼可以在 GitHub 上找到。