quarkus实战之三:开发模式(Development mode)
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 前文咱们曾提到过几种启动方式,有一种用maven命令启动的,可以进入开发模式,命令如下:
mvn quarkus:dev
- 当时只提到此模式能看到详细系统信息,并未展开说明更多信息,实际上,此模式下还有很多实用的功能
- 作为《quarkus实战》系列的第三篇,今天咱们一起来学习开发模式(Development mode),这是quarkus为开发者准备的实用工具
关于开发模式(Development mode)
- 开发模式是quarkus框架提供的内置工具(built-in),可直接使用
- 开发模式提供以下功能:
- 系统信息:即前文提到过的,查看对象和配置、修改配置、操作单元测试等功能
- 热部署:修改java代码、资源文件、配置文件等类型的文件后,会立即生效
- 断点:这是常用功能就不多说了,稍后直接操作
- 接下来实际体验上述功能,用的是《quarkus实战之二:体验HelloWorld》一文中创建的demo工程
系统信息
- 访问http://localhost:8080/q/dev/,可以看到丰富的系统信息,该地址只在dev模式有效:
热部署
- 热部署是日常开发的常用功能,回顾demo中的HobbyResource.java,如下所示,非常简单:
package com.bolingcavalry;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;
@Path("/actions")
public class HobbyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy " + LocalDateTime.now();
}
}
- 为了演示修改配置可以立即生效的效果,把代码改成下面这样,注意注解ConfigProperty的作用是将指定配置的值注入修饰的成员变量中:
package com.bolingcavalry;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;
@Path("/actions")
public class HobbyResource {
@ConfigProperty(name = "greeting.message")
String message;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy " + LocalDateTime.now() + " " + message;
}
}
- 打开文件application.properties,增加一个配置:
# 这是一个自定义属性
greeting.message=message from configuration
- 用命令mvn quarkus:dev将应用以开发模式启动,用浏览器访问http://localhost:8080/actions,响应如下图,符合预期,配置的属性可以被正常使用:
- 现在去修改代码,如下图红框:
- 再把文件application.properties中的配置也改了,我这里改成了abcdef
- 再去刷新页面,如下图所示,代码和配置的修改都生效了:
- 以上就是热部署了,接下来去看另一个实用的功能:断点
断点
打断点、单步调试等都是Java程序员的日常操作,就不做介绍了,直接聊聊quarkus上如何操作吧
在开发模式下,断点功能是默认开启的,不过为了安全起见,quarkus断点只监听了localhost网卡,端口是5005
在代码中打个断点,如下图,我这里用的是IDEA:
- 在IDEA上新增一个断点,操作如下图:
如下图所示,确认端口号正确:
配置完成后,点击下图红框中的按钮即可发起断点请求:
如果应用正常监听,应该能立即连接成功,如下图:
刷新浏览器,请求会立即停留在断点位置,一切都是熟悉的样子,可以像以前一样查看变量和堆栈,也可以做单步执行和条件断点等操作:
以上是通过localhost:5005进行本地调试的操作步骤,如果另外一台电脑想连接到到这个quarkus应用进行远程调式,是连接不成功的,因为quarkus应用启动后监听的是localhost这块网卡,为了能够让其他电脑上的IDEA远程连接到这个应用,我们需要给启动命令增加一个参数,令其监听本机所有网卡,支持远程debug的完整启动命令如下,另外,debug参数可以指定端口:
mvn quarkus:dev -DdebugHost=0.0.0.0 -Ddebug=5006
- 启动后控制台输出信息如下图,红框中显示监听的端口是5006:
- 当前电脑的IP是192.168.50.221,所以将断点的地址从localhost:5005改为192.168.50.221:5006,如下图:
- 再尝试连接断点,如下所示,新的IP+端口连接成功:
- 因为连接是基于IP+端口的,您完全可以在A电脑上运行应用,在B电脑上用IDEA远程连接A电脑进行断点操作
热部署的局限性
- 前面的操作:在A电脑用mvn quarkus:dev -DdebugHost=0.0.0.0 -Ddebug=5006命令启动应用,在B电脑上用IDEA连接到A电脑上进行热部署操作,虽然也算是远程,但聪明的您应该看出了弊端:A电脑上必须有源码
- 很多时候,我们热部署是为了处理特定问题,而出现问题的电脑可能是测试环境,甚至生产环境,这些地方是不会有源码和maven的,此时mvn quarkus:dev命令就行不通了,那又该如何处理呢?放弃热部署的便利,只能改一次代码部署一次吗?
- 好在quarkus已经考虑到这种情况,为我们准备了远程热部署方案,下一篇文章会详细介绍和操作
欢迎关注博客园:程序员欣宸
quarkus实战之三:开发模式(Development mode)的更多相关文章
- [原创].NET 分布式架构开发实战之三 数据访问深入一点的思考
原文:[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考 .NET 分布式架构开发实战之三 数据访问深入一点的思考 前言:首先,感谢园子里的朋友对文章的支持,感谢大家,希望本系列的文章能 ...
- 关于测试驱动的开发模式以及实战部分,建议看《Python Web开发测试驱动方法》这本书
关于测试驱动的开发模式以及实战部分,建议看<Python Web开发测试驱动方法>这本书
- 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
C# 很早就有了MVVM的开发模式,Android手机中的MVVM一直到去年Google的I\O大会上才推出,姗姗来迟.MVVM这中开发模式的优点自不必多说,可以实现视图和逻辑代码的解耦,而且,按照G ...
- IPD体系向敏捷开发模式转型实施成功的四个关键因素
文/杨学明 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Development)是当前国内外企业产品研发管理的最常用的3种模式.随着创新环境的快速发展,许多企业都会 ...
- Flink的sink实战之三:cassandra3
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- XP+devOps开发模式与scrum敏捷开发对比,docker虚拟化
XP+devOps开发模式与scrum敏捷开发对比,docker虚拟化 我们现在用的就是典型的XP+devOps模式,已经放弃scrum了 现在还很多公司弄docker虚拟化docker非常复杂,当然 ...
- weblogic开发模式与生产模式介绍
weblogic开发模式与生产模式介绍 开发模式:该模式启用自动部署 生产模式:该模式关闭自动部署 weblogic server 三种部署方法:自动部署.控制台部署.命令部署 自动部署:当其处于启用 ...
- 小团队git开发模式
实验室要使用Git进行代码管理,但是git非常复杂,各种开发模式也是层出不穷.作为新手的偶们很是发囧啊!!网上搜了一下,发现很多并不适合我们小团队运作(它本身就是为Linux内核管理而开发的分布式代码 ...
- 有关 Hybrid 开发模式实践总结
前言 随着公司业务不断发展,移动开发项目越来越多,项目任务时间紧,我们内部开发流程是以项目为导向,有别于一般公司对产品不断迭代的做法,但移动端开发人员资源有限,需要在不同项目之间做业务场景切换开发,就 ...
- 异常驱动的开发(Exception-Driven Development)
你的网站或应用程序存在哪些问题?如果你在等着用户来告诉你,那么你只能看到所有的问题中已经暴露的那极小的一部分.要知道,那只是"冰山一角"! 而且,如果你真的是在守株待兔,我不得不很 ...
随机推荐
- 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介 观察者模式(Observer Pattern)是一种行为型模式.它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 观察者模式使用三个类S ...
- python_7 退出、结束循环和嵌套循环
一.查缺补漏 1. end=' 任意值 ' 表示换行,任意值会显示在换行前,不写默认换行 2. input() 用户键盘输入 默认输入str类型,如要和int类型比较需要强制类型转换二.退出.结束循环 ...
- springCloud Alibaba服务的注册与发现之eureka搭建
1.创建eureka微服务模块.导入maven依赖. <dependency> <groupId>org.springframework.cloud</groupId&g ...
- 从 API 网关聊到 API 管理
在 API 管理中,通常会有这些痛点: 1.企业不清楚到底有多少个API,无法形成API资产管理等问题. 2.API在不同集群的生命周期问题. 3.API运行状态监控和告警问题. 4.API请求限流. ...
- [Pytorch框架] 4.1 Fine tuning 模型微调
文章目录 4.1 Fine tuning 模型微调 4.1.1 什么是微调 为什么要微调 迁移学习 Transfer Learning 二者关系 4.1.2 如何微调 4.1.3 注意事项 4.1.3 ...
- Unity开发Hololens2—交互发布配置
Unity开发Hololens2-交互发布配置 环境配置 unity2021.3.15f visual studio 2019 pro MRTK 2.8.3 OpenXR 1.8.0 Hololens ...
- 【Javascript】Array 数组对象
一.数组介绍 数组是一种复合数据类型 在数组可以存储多个不同类型的数据,任何类型的值都可以成为数组中的元素 创建数组时尽量要确保数组中存储的数据的类型是相同的 数组中存储的是有序的数据 数组中的每个数 ...
- 【H5】Emmet 指令 HTML
Emmet操作指南 HTML篇 生成带有内容的标签 标签名{内容}可以生成带有内容的标签 div{abc} <div>abc</div> 生成带有属性的标签 生成带有class ...
- 2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?
福哥答案2021-01-06: [答案来自此链接:](https://www.zhihu.com/question/438078173)首先提出假设:考虑一下这几个问题:手机号码都是数字吗?都是中国的 ...
- 深入 Hyperf:HTTP 服务启动时发生了什么?
当我们创建 Hyperf 项目之后,只需要在终端执行 php bin/hyperf.php start 启动命令,等上几秒钟,就可以看到终端输出的 Worker 进程已启动,HTTP 服务监听在 95 ...