Quarkus数据库开发与微服务客户端使用全解析
发布时间: 2025-08-11 17:06:01 阅读量: 2 订阅数: 4 


Quarkus快速入门与实战指南
### Quarkus数据库开发与微服务客户端使用全解析
#### 1. 简化数据库开发
在数据库开发中,有多种方法可以选择,这里主要介绍数据仓库方法。数据仓库方法使用 `AccountRepository` 作为数据访问方法的中介,它与 JPA 的 `EntityManager` 有相似之处,但也存在关键差异。在过去十多年里,Spring 框架推广了数据仓库方法,Martin Fowler 也在相关架构模式中概述了这种方法。
要实现数据仓库方法,需要添加以下依赖:
```xml
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
```
这个依赖与主动记录方法所需的依赖相同,这使得在两种方法之间切换很方便,甚至可以在同一个应用程序的不同场景中分别使用这两种方法。
以下是数据仓库方法中 `Account` 实体的代码:
```java
@Entity
public class Account {
@Id
@GeneratedValue
private Long id;
private Long accountNumber;
private Long customerNumber;
private String customerName;
private BigDecimal balance;
private AccountStatus accountStatus = AccountStatus.OPEN;
...
}
```
需要注意的是,为了简洁起见,上述代码中省略了 getter 和 setter 方法、通用对象方法以及 `equals` 和 `hashcode` 方法。这个代码与 JPA 的代码很相似,主要区别在于没有 `@NamedQuery` 注解,并且主键的默认 ID 生成过程不同。
接下来是仓库类的代码:
```java
@ApplicationScoped
public class AccountRepository implements PanacheRepository<Account> {
public Account findByAccountNumber(Long accountNumber) {
return find("accountNumber = ?1", accountNumber).firstResult();
}
}
```
与主动记录方法一样,父类包含了查找和检索实例的便捷方法。
下面是 JAX - RS 资源的代码:
```java
public class AccountResource {
@Inject
AccountRepository accountRepository;
@GET
public List<Account> allAccounts() {
return accountRepository.listAll();
}
@GET
@Path("/{acctNumber}")
public Account getAccount(@PathParam("acctNumber") Long accountNumber) {
Account account = accountRepository.findByAccountNumber(accountNumber);
return account;
}
@POST
@Transactional
public Response createAccount(Account account) {
accountRepository.persist(account);
return Response.status(201).entity(account).build();
}
@PUT
@Path("{accountNumber}/withdrawal")
@Transactional
public Account withdrawal(@PathParam("accountNumber") Long accountNumber,
String amount) {
Account entity = accountRepository.findByAccountNumber(accountNumber);
entity.withdrawFunds(new BigDecimal(amount));
return entity;
}
}
```
`AccountResourceTest` 类可以从 JPA 示例中复制,因为两种方法使用的实体都有 getter 和 setter 方法。可以在 `/chapter4/data - repository/` 目录下使用以下命令运行测试:
```bash
mvn clean install
```
不同数据库访问方法有不同的特点,以下是 JPA、主动记录和数据仓库三种方法的对比:
| 方法 | 优点 | 缺点 |
| ---- | ---- | ---- |
| JPA | 便于现有 Java EE 和 Jakarta EE 应用程序迁移;可以使用 `@NamedQuery` 定义自定义查询 | 需要手动创建主键字段;查询需要实际的 SQL;非主键搜索需要 SQL 或 `@NamedQuery` |
| 主动记录 | 不需要为所有字段提供 getter 和 setter 方法;使用数据库进行测试比过去更容易 | 数据访问层与对象耦合,不使用数据库进行测试困难;违反单一职责原则和关注点分离原则 |
| 数据仓库 | 清晰分离数据访问和业务逻辑,便于独立测试 | 需要手动创建主键字段;没有自定义方法时,类为空,可能看起来不寻常 |
#### 2. 部署到 Kubernetes
当 `Account` 服务有了数据库后,就可以将其部署到 Kubernetes 中。在此之前,需要先部署一个 PostgreSQL 实例供其使用。
##### 2.1 部署 PostgreSQL
部署 PostgreSQL 到 Kubernetes 需要完成以下步骤:
1. 创建一个包含编码后的用户名和密码的 Kubernetes Secret,这个 Secret 将用于创建 PostgreSQL 数据库和 Quarkus 中的数据源配置。
2. 部署 PostgreSQL 数据库。
具体操作如下:
首先,确保 Minikube 已经启动,如果没有启动,可以使用以下命令启动:
```bash
minikube start
```
在每个将部署到 Minikube 的终端窗口中,需要运行以下命令,因为 Minikube 使用其内部的 Docker 来构建镜像:
```bash
eval $(minikube -p minikube docker - env)
```
Minikube 启动后,创建 Secret:
```bash
kubectl create secret generic db - credentials \
--from - literal = username = quarkus_banking \
--from - literal = password = quarkus_banking
```
如果使用的 Minikube 实例与之前的章节相同,需要先执行以下命令删除之前的 Secret:
```bash
kubectl delete secret generic db - credentials
```
创建好 Secret 后,启动 PostgreSQL 数据库实例,这需要一个 Kubernetes Deployment 和 Service。切换到 `/chapter4/` 目录并运行以下命令:
```bash
kubectl apply - f postgresql_kubernetes.yml
```
如果成功,终端会显示 Deployment 和 Service 已创建的消息。
##### 2.2 打包和部署
这里以主动记录示例为例进行部署。在打包应用程序之前,需要进行一些更改,因为应用程序将从 Kubernetes Secrets 中读取数据库配置。在 `pom.xml` 中添加以下依赖:
```xml
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-config</artifactId>
</dependency>
```
这个依赖使应用程序能够读取 Kubernetes ConfigMaps 和 Secrets。为了让应用程序知道从哪里读取信息,还需要在 `application.properties` 中添加以下额外属性:
```properties
%prod.quarkus.kubernetes-config.enabled = true
%prod.quarkus.kubernetes-config.secrets.enabled = true
%prod.quarkus.kubernetes-config.secrets = db - credentials
```
`%prod.` 前缀确保这些设置在开发和测试期间不被使用。
同时,还需要修改 `application.properties` 中的数据源信息以适应 Kubernetes:
```properties
%prod.quarkus.datasource.username = ${username}
%prod.quarkus.datasource.password = ${password}
%prod.quarkus.datasource.jdbc.url = jdbc:postgresql://postgres.default:5432/
quarkus_banking
```
完成这些更改后,就可以构建镜像并将其部署到 Kubernetes 中:
```bash
mvn clean package - Dquarkus.kubernetes.deploy = true
```
部署 `Account` 服务后,可以使用以下命令查看所有服务的详细信息:
```bash
minikube service list
```
输出结果如下:
| NAMESPACE | NAME | TARGET PORT |
0
0
相关推荐









