”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 利用自动设置和与 Quarkus 开发服务的集成来实现高效开发

利用自动设置和与 Quarkus 开发服务的集成来实现高效开发

发布于2024-11-09
浏览:856

JPrime 2024圆满结束!!

JPrime 2024 的组织者再次竭尽全力提供多样化的主题,确保每个人都能有所收获。

然而,今天的文章并不是由 Michael Simons 的一篇关于 “Spring 和 Quarkus 中集成测试的演变” 的演讲引发的,尽管它非常有洞察力。他探索了集成测试策略,重点关注 Spring Boot 中的设置。

作者明确强调,他强调的问题在 Quarkus 中通过利用开发服务得到了有效解决(图 1)。这凸显了我对某些应用程序持怀疑态度的 Spring Boot 的另一个原因 - 它的复杂性与 Quarkus 中的简化解决方案形成鲜明对比,特别是在使用开发服务时。

Harnessing Automatic Setup and Integration with Quarkus Dev Services for Efficient Development

图 1 – JPrime 2024

目睹开发服务在新与会者中引发的惊讶是非常了不起的。然而,值得注意的是,Dev Services 并不是 Quarkus 的最新功能。相当长一段时间以来,它一直是该框架的组成部分。让我们更深入地研究 Quarkus 开发服务并探索其持久的优势。

Quarkus 开发服务

在 Quarkus 中,开发服务有助于在开发和测试模式下自动配置未配置的服务。本质上,如果您在未配置的情况下包含扩展,Quarkus 将自动启动相关服务(通常在后台使用 Testcontainers)并配置您的应用程序以有效地使用此服务。

  1. 自动服务检测和启动

    Quarkus Dev Services 可自动检测和启动必要的服务,例如数据库、消息代理和其他后端服务。此函数利用 pom.xml 或 build.gradle 中指定的应用程序依赖项。例如,添加数据库驱动程序会自动触发开发服务来启动该数据库的相应容器化实例(如果该实例尚未运行)。这里使用的技术主要涉及 Testcontainers,它允许创建通用数据库、Selenium Web 浏览器或任何其他可以在 Docker 容器中运行的轻量级、一次性实例。

  2. 动态配置注入

    一旦实例化所需的服务,Quarkus Dev Services 就会在运行时将相关服务连接详细信息动态注入到应用程序的配置中。这是在没有任何手动干预的情况下完成的,使用称为连续测试的功能将标准数据库或其他服务 URL 重新路由到自动配置的测试容器。 URL、用户凭据和其他操作参数等配置属性是无缝设置的,允许应用程序与这些服务交互,就像手动配置它们一样。

  3. 服务特定行为

    开发服务专为各种类型的服务量身定制:

    • 数据库: 自动提供根据您的应用程序需求量身定制的正在运行的数据库,无论是 PostgreSQL、MySQL、MongoDB 还是任何其他支持的数据库。开发服务确保相应的测试容器在开发过程中可用。
    • 消息系统: 对于使用 Kafka 或 AMQP 等消息系统的应用程序,Quarkus Dev Services 使用 Docker 启动必要的代理并将它们与应用程序连接。
    • 自定义开发服务: 开发人员可以通过创建利用开发服务框架的自定义 Quarkus 扩展来扩展功能。这允许针对特定项目进行定制设置,提供更大的灵活性和控制力。
  4. 网络处理和服务隔离

    Quarkus Dev Services 启动的每个服务都在其隔离的环境中运行。这对于确保不同开发测试之间不存在端口冲突、数据残留或安全问题至关重要。尽管存在这种隔离,服务仍使用 Docker 适当联网,确保它们可以根据需要相互通信,模仿真实世界的部署氛围。

  5. 生命周期管理

    Quarkus 管理这些动态配置的服务的完整生命周期。当您在开发模式下启动应用程序时,必要的服务会自动启动。当您停止 Quarkus 应用程序时,这些服务也会终止。此管理包括根据需要处理数据持久性,使开发人员能够从中断的地方继续操作,而不会出现任何设置延迟。

用法示例

假设您正在 Quarkus 中使用 PostgreSQL 数据库。如果没有检测到现有的 PostgreSQL 配置,Quarkus 将启动 PostgreSQL Docker 容器并自动连接您的应用程序。

这些服务在开发和测试模式下默认启用,但如有必要,可以通过 application.properties:
禁用

quarkus.datasource.devservices.enabled=false

让我们扩展一下 Quarkus 使用 PostgreSQL 数据库的场景,以及开发服务如何以最小的麻烦来促进这一点。

如果 Quarkus 检测到没有 PostgreSQL 配置处于活动状态(未运行或未显式配置),它将自动使用 Docker 启动 PostgreSQL 容器。这是通过开发服务在幕后设置的。

要通过 ORM 层与数据库交互,请考虑使用 Quarkus Panache,它简化了 Hibernate ORM 操作。以下是如何设置您的环境:

  1. 添加依赖项

    首先,在 pom.xml 中包含必要的依赖项:

    io.quarkusquarkus-hibernate-orm-panacheio.quarkusquarkus-jdbc-postgresql
  2. 定义实体

    接下来,定义您的实体,例如 CityEntity:

    @Entity
    @Table(name = "cities")
    public class CityEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @Column(name = "public_id")
    private String publicId;
    
    @OneToOne
    private StateEntity state;
    
    @Column(nullable = false, name = "created_at")
    private Instant createdAt;
    
    @Column(nullable = false, name = "last_modified")
    private Instant lastModified;
    
    @PrePersist
    protected void onCreate() {
     createdAt = Instant.now();
     lastModified = createdAt;
    }
    
    @PreUpdate
    protected void onUpdate() {
     lastModified = Instant.now();
    }
    }
    
  3. 创建存储库

    实现将直接与数据库交互的存储库:

    @ApplicationScoped
    public class CityRepository implements 
    PanacheRepository {
    }
    
  4. 服务层

    定义使用存储库的服务层:

    @ApplicationScoped
    public class CityServiceImpl implements CityService {
    
      @Inject
      CityRepository cityRepository;
    
      @Override
      public long countCities() {
       return cityRepository.count();
      }
    }
    
    public interface CityService {
     long countCities();
    }
    
  5. 资源端点

    @Path("/cities")
    @Tag(name = "City Resource", description = "City APIs")
    public class CityResource {
    
      @Inject
      CityService cityService;
    
      @GET
      @Path("/count")
      @Operation(summary = "Get the total number of cities", 
       description = "Returns the total count of cities in the 
       system.")
      @APIResponse(responseCode = "200", description = "Successful 
      response", content = @Content(mediaType = "application/json", 
      schema = @Schema(implementation = Long.class)))
      public long count() {
       return cityService.countCities();
      }
     }
    

当您运行 Quarkus 应用程序 (mvn quarkus:dev) 时,观察 PostgreSQL 容器的自动启动情况(图 2)。这种无缝集成体现了 Quarkus 开发服务的强大功能,通过自动配置和连接设置到应用程序所需的外部服务,使开发和测试变得更加简单。

Harnessing Automatic Setup and Integration with Quarkus Dev Services for Efficient Development

图 2 – 应用程序日志

平台开发服务

Quarkus Dev Services 通过处理各种服务的配置和管理来简化开发和测试阶段,使开发人员能够更加专注于实际应用程序。 Quarkus 支持广泛的开发服务,包括:

  • AMQP
  • Apicurio 注册表
  • 数据库
  • 卡夫卡
  • 钥匙斗篷
  • Kubernetes
  • MongoDB
  • RabbitMQ
  • 脉冲星
  • Redis
  • 金库
  • 无限跨度
  • Elasticsearch
  • 可观察性
  • Neo4j
  • WireMock
  • 麦克克斯
  • 钥匙斗篷
  • 还有更多,每一个都旨在无缝增强您的开发环境

结论

Quarkus 开发服务代表了开发人员在开发和测试阶段如何设置和集成外部服务的范式转变。环境设置的自动化不仅加速了开发过程,还减少了配置错误的可能性,使团队更容易专注于创建强大的、功能丰富的应用程序。

Quarkus 开发服务的突出优势之一是强调开发人员的生产力。通过消除手动管理服务依赖项的需要,开发人员可以立即开始处理业务逻辑和应用程序功能。这种简化的工作流程在微服务架构中特别有益,其中多个服务可能需要同时开发和集成

总之,采用 Quarkus 开发服务可以显着影响您的开发团队的效率和项目成果。 Quarkus 的简单性和强大功能鼓励实验,
更快的迭代,最终加快开发周期。这种技术杠杆是现代企业在数字时代蓬勃发展所需要的。

版本声明 本文转载于:https://dev.to/yanev/harnessing-automatic-setup-and-integration-with-quarkus-dev-services-for-efficient-development-27m2?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09
  • 如何避免 Go 模板中 HTML 和 JSON 的意外转义?
    如何避免 Go 模板中 HTML 和 JSON 的意外转义?
    在 Go 模板中转义 HTML 和 JSON在 Go 模板中,正确处理 HTML 和 JSON 以防止意外转义至关重要。考虑以下模板:<some_html> {{ .SomeOtherHTML }} </some_html>如果您希望输出只是 ,那么您可能会遇到 < 和 &...
    编程 发布于2024-11-09
  • 为什么 useState 在严格模式下渲染组件两次?
    为什么 useState 在严格模式下渲染组件两次?
    理解useState中的双重渲染在React中,useState钩子通常用于管理组件状态。但是,在某些条件下,您可能会注意到使用 useState 呈现的组件对于每次状态更新都会呈现两次。这种行为让许多未启用严格模式的开发人员感到困惑。为什么会出现这种情况?严格模式的作用与未启用严格模式的假设相反,...
    编程 发布于2024-11-09
  • Flex 项目是块级还是 Flex 级?深入研究 CSS 布局
    Flex 项目是块级还是 Flex 级?深入研究 CSS 布局
    Flex 项目令人困惑的本质:块级还是 Flex 级别?Flex 项目是否是块级的问题一直是CSS 开发者之间的争论。 CSS 灵活框布局模块级别 1 规定 Flex 项目位于 Flex 级别,而不是块级别。然而,后面的部分表明弹性项目的显示值是“块化的”。这就提出了一个问题:Flex 项目到底是块...
    编程 发布于2024-11-09
  • 如何在不使用 Sudo 的情况下在 macOS 上安装 Python 包时修复权限错误?
    如何在不使用 Sudo 的情况下在 macOS 上安装 Python 包时修复权限错误?
    排查 macOS 上 Pip 的权限错误尝试在 Mac 上安装 Python 包时,您可能会遇到与写入日志文件或站点包相关的权限错误目录。这些错误可能会令人沮丧,特别是如果您想在当前用户帐户下安装软件包而不使用 sudo。权限错误的根本原因默认情况下,Pip 会尝试在系统中安装软件包-wide Py...
    编程 发布于2024-11-09
  • 如何在 Go 中自动执行外部命令输入:绕过“登录”等命令的用户交互的指南
    如何在 Go 中自动执行外部命令输入:绕过“登录”等命令的用户交互的指南
    Go 自动化外部命令输入在 Go 中,执行外部命令并管理其输入和输出是一项常见任务。但是,在处理提示用户输入的命令(例如“登录”)时,以编程方式自动执行这些输入可能具有挑战性。解决此问题的一种方法是直接写入命令的标准输入(stdin) )使用字节缓冲区。让我们深入研究提供的解决方案:login :=...
    编程 发布于2024-11-09
  • 如何在 CSS 中为多个父级中的特定 n 个子级设置样式
    如何在 CSS 中为多个父级中的特定 n 个子级设置样式
    跨多个父级设置特定第 n 个子级的样式使用第 n 个子级选择器设置嵌套元素的样式时,需要注意的是,选择器在单父上下文中运行。当针对多个父级中的特定子元素时,这可能会带来挑战。问题:考虑以下标记:<div class="foo"> <ul> ...
    编程 发布于2024-11-09
  • 如何使用字符串插值将 CSS 属性设置为 SASS 中的 mixin 值?
    如何使用字符串插值将 CSS 属性设置为 SASS 中的 mixin 值?
    将 SASS Mixin 值设置为 CSS 属性创建通用边距/填充 mixin 时,可能需要将 CSS 属性设置为 mixin 值。为此,需要使用字符串插值。CSS 属性的字符串插值要使用变量作为 CSS 属性名称,需要字符串插值 (#{$var})。示例以下 mixin 演示了如何使用字符串插值设...
    编程 发布于2024-11-09
  • MUI TextField:构建变体、颜色和样式
    MUI TextField:构建变体、颜色和样式
    The mui textfield is a fundamental component in Material-UI, designed to capture user inputs efficiently and stylishly. This guide explores its build ...
    编程 发布于2024-11-09
  • 在 Java 中如何安全地将 Long 转换为 Int?
    在 Java 中如何安全地将 Long 转换为 Int?
    在 Java 中安全地将 Long 转换为 Int:一个全面的解决方案在 Java 中使用数字类型时,确保转换至关重要操作不会导致数据丢失。当将 long 值转换为 int 时,这一点尤其重要,因为 long 的精度可能超过 int。Java 8:简化流程Java 8 之前的版本,安全地将 long...
    编程 发布于2024-11-09
  • 如何修复集成 Authorize.net 支付网关时出现“调用未定义函数curl_init()”错误?
    如何修复集成 Authorize.net 支付网关时出现“调用未定义函数curl_init()”错误?
    未定义的函数:curl_init()在实现Authorize.net的支付网关的上下文中,您可能会遇到错误“调用未定义”函数curl_init()”。这表明您的系统上未正确配置或安装 PHP curl 扩展。Windows 操作系统对于 Windows 用户,请验证您的 php.ini 文件中的以下...
    编程 发布于2024-11-09
  • Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化
    Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化
    介绍 Next.js 长期以来一直是构建服务器渲染 React 应用程序的流行选择。凭借其对服务器端渲染 (SSR) 的内置支持,开发人员可以创建动态、SEO 友好的应用程序。然而,Next.js 13 中 App Router 的引入以及 Next.js 14 中的改进显着简化和...
    编程 发布于2024-11-09
  • CSS 中的垂直对齐实际上是如何工作的?
    CSS 中的垂直对齐实际上是如何工作的?
    CSS 中的垂直对齐:了解细微差别vertical-align 属性允许您将内联元素垂直放置在其父元素中。然而,除非您掌握基本原理,否则它的行为可能是不可预测的。内联元素和高度Vertical-align 仅影响内联元素。 和 等元素是块级元素,不受影响。对于没有固有行高的内联元素,例如 和 ...
    编程 发布于2024-11-09
  • Astra 项目:多模式人工智能的新时代
    Astra 项目:多模式人工智能的新时代
    Astra 项目由 Google DeepMind 开发,代表了多模式人工智能发展的突破性一步。与依赖单一输入类型(例如文本或图像)的传统人工智能系统不同,Project Astra 将多种形式的数据(包括视觉、听觉和文本输入)集成到一个有凝聚力的交互式人工智能体验中。这种方法旨在创建一个更直观、反...
    编程 发布于2024-11-09
  • 为什么我的 HTML 输出显示为纯文本而不是渲染?
    为什么我的 HTML 输出显示为纯文本而不是渲染?
    HTML 输出解释为纯文本而不是作为 HTML 接收这里的问题涉及 HTML 输出呈现为纯文本的场景被解析为正确的 HTML。提供了基本的 Go 实现,但呈现的输出在 pre 标记内显示逐字 HTML 代码。要纠正此问题,必须设置 Content-Type 标头以指定响应为 HTML。这可确保浏览器...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3