首页 文章 精选 留言 我的

精选列表

搜索[快速],共10012篇文章
优秀的个人博客,低调大师

Spring Boot 快速迁移至 Quarkus

Quarkus 是一个目前非常火的 Java 应用开发框架,定位是轻量级的微服务框架。,Quarkus 提供了优秀的容器化整合能力,相较于传统开发框架(Spring Boot)有着更快的启动速度、更小的内存消耗、更短的服务响应。 本文将演示将 SpringBoot 迁移至 Quarkus Spring Boot 示例程序 使用 JPA 完成 数据库的增删改查操作,基础代码如下 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> jpa crud public interface DemoUserDao extends CrudRepository<DemoUser, Long> { } 迁移至 Quarkus quarkus-bom 管理了全部 quarkus 插件 maven 依赖的版本信息,引入后所有依赖不需要再定义版本。 <dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-bom</artifactId> <version>1.10.5.Final</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 迁移 spring-web 、spring-jpa 至 quarkus 技术栈。 <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-data-jpa</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-web</artifactId> </dependency> 配置文件调整 (还是在 application.yml) quarkus.datasource.db-kind=mysql quarkus.datasource.jdbc.driver=com.mysql.cj.jdbc.Driver quarkus.datasource.username=root quarkus.datasource.password=root quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/pig_demo?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE Main 方法调整为 实现 QuarkusApplication ,且需要通过 Quarkus.waitForExit() 保持服务运行。 @QuarkusMain public class SimpleApplication implements QuarkusApplication { public static void main(String[] args) { Quarkus.run(SimpleApplication.class,args); } @Override public int run(String... args) { Quarkus.waitForExit(); return 0; } } 启动运行 main 方法启动, 输出 Quarkus banner __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2021-01-12 22:31:46,341 INFO [io.qua.arc.pro.BeanProcessor] (build-21) Found unrecommended usage of private members (use package-private instead) in application beans: - @Inject field com.example.simple.controller.DemoController#userDao 2021-01-12 22:31:48,702 INFO [io.quarkus] (Quarkus Main Thread) Quarkus 1.10.5.Final on JVM started in 4.613s. Listening on: http://localhost:8080 2021-01-12 22:31:48,703 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. 2021-01-12 22:31:48,703 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, mutiny, narayana-jta, resteasy, resteasy-jackson, smallrye-context-propagation, spring-data-jpa, spring-di, spring-web] 非常重要的是输出了当前已经安装的功能 Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, mutiny, narayana-jta, resteasy, resteasy-jackson, smallrye-context-propagation, spring-data-jpa, spring-di, spring-web] 【扩展】 actuator 监控迁移 添加以下依赖 <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-health</artifactId> </dependency> 指定访问监控断点路径 quarkus.smallrye-health.root-path=/actuator/health 访问监控检查断点测试 curl http://localhost:8080/actuator/health { "status": "UP", "checks": [ { "name": "Database connections health check", "status": "UP" } ] }⏎ 【扩展】Flyway 迁移 添加 quarkus flyway 插件 <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-flyway</artifactId> </dependency> 指定插件启动策略即可 quarkus.flyway.migrate-at-start=true >>> 源码 https://gitee.com/log4j/pig,欢迎署名转载 <<<

优秀的个人博客,低调大师

快速读懂 JS 原型链

最近参加了公司内部技术分享,分享同学提到了 Js 原型链的问题,并从 V8 的视角展开发散,刷新了我之前对原型链的认识,听完后决定重学一下原型链,巩固一下基础。 理解原型链 深入原型链 总结与思考 理解原型链 Js 中的原型链是一个比较有意思的话题,它采用了一套巧妙的方法,解决了 Js 中的继承问题。 按我的理解,原型链可以拆分成: 原型(prototype) 链( __proto__) 原型(prototype) 原型(prototype)是一个普通的对象,它为构造函数的实例共享了属性和方法。在所有的实例中,引用到的原型都是同一个对象。 例如: functionStudent(name){this.name=name;this.study=function(){console.log("studyjs");};}//创建2个实例conststudent1=newStudent("xiaoming");conststudent2=newStudent("xiaohong");student1.study();student2.study(); 上面的代码中,我们创建了 2 个 Student 实例,每个实例都有一个 study 方法,用来打印 "study js"。 这样写会有个问题:2 个实例中的 study 方法都是独立的,虽然功能相同,但在系统中占用的是 2 份内存,如果我创建 100 个 Student 实例,就得占用 100 份内存,这样算下去,将会造成大量的内存浪费。 所以 Js 创造了 prototype。 functionStudent(name){this.name=name;}Student.prototype.study=function(){console.log("studyjs");};//创建2个实例conststudent1=newStudent("xiaoming");conststudent2=newStudent("xiaohong");student1.study();student2.study(); 使用 prototype 之后, study 方法存放在 Student 的原型中,内存中只会存放一份,所有 Student 实例都会共享它,内存问题就迎刃而解了。 但这里还存在一个问题。 为什么 student1 能够访问到 Student 原型上的属性和方法? 答案在 __proto__ 中,我们接着往下看。 链(__proto__) 链(__proto__)可以理解为一个指针,它是实例对象中的一个属性,指向了构造函数的原型(prototype)。 我们来看一个案例: functionStudent(name){this.name=name;}Student.prototype.study=function(){console.log("studyjs");};conststudent=newStudent("xiaoming");student.study();//studyjsconsole.log(student.__proto__===Student.prototype);//true 从打印结果可以得出:函数实例的 __proto__ 指向了构造函数的 prototype,上文中遗留的问题也就解决了。 但很多同学可能有这个疑问。 为什么调用 student.study 时,访问到的却是 Student.prototype.study 呢? 答案在原型链中,我们接着往下看。 原型链 原型链指的是:一个实例对象,在调用属性或方法时,会依次从实例本身、构造函数原型、构造函数原型的原型... 上去寻找,查看是否有对应的属性或方法。这样的寻找方式就好像一个链条一样,从实例对象,一直找到 Object.prototype ,专业上称之为原型链。 还是来看一个案例: functionStudent(name){this.name=name;}Student.prototype.study=function(){console.log("studyjs");};conststudent=newStudent("xiaoming");student.study();// study js。//在实例中没找到,在构造函数的原型上找到了。//实际调用的是:student.__proto__.say 也就是 Student.prototype.say。student.toString();//"[objectObject]"//在实例中没找到。//在构造函数的原型上也没找到。//在构造函数的原型的原型上找到了。//实际调用的是 student.__proto__.__proto__.toString 也就是 Object.prototype.toString。 可以看到, __proto__ 就像一个链一样,串联起了实例对象和原型。 同样,上面代码中还会存在以下疑问。 为什么 Student.prototype.__proto__ 是 Object.prototype? 这里提供一个推导步骤: 先找 __proto__ 前面的对象,也就是 Student.prototype 的构造函数。 判断 Student.prototype 类型, typeof Student.prototype 是 object。 object 的构造函数是 Object。 得出 Student.prototype 的构造函数是 Object。 所以 Student.prototype.__proto__ 是 Object.prototype。 这个推导方法很实用,除了自定义构造函数对象之外,其他对象都可以推导出正确答案。 原型链常见问题 原型链中的问题很多,这里再列举几个常见的问题。 Function.__proto__ 是什么? 找 Function 的构造函数。 判断 Function 类型, typeof Function 是 function。 函数类型的构造函数就是 Function。 得出 Function 的构造函数是 Function。 所以 Function.__proto__ = Function.prototype。 Number.__proto__ 是什么? 这里只是稍微变了一下,很多同学就不知道了,其实和上面的问题是一样的。 找 Number 的构造函数。 判断 Number 类型, typeof Number 是 function。 函数类型的构造函数就是 Function。 得出 Number 的构造函数是 Function。 所以 Number.__proto__ = Function.prototype。 Object.prototype.__proto__ 是什么? 这是个特例,如果按照常理去推导,Object.prototype.__proto__ 是 Object.prototype,但这是不对的,这样下去原型链就在 Object 处无限循环了。 为了解决这个问题,Js 的造物主就直接在规定了 Object.prototype.__proto__ 为 null,打破了原型链的无线循环。 明白了这些问题之后,看一下这张经典的图,我们应该都能理解了。 深入原型链 介绍完传统的原型链判断,我们再从 V8 的层面理解一下。 V8 是怎么创建对象的 Js 代码在执行时,会被 V8 引擎解析,这时 V8 会用不同的模板来处理 Js 中的对象和函数。 例如: ObjectTemplate 用来创建对象 FunctionTemplate 用来创建函数 PrototypeTemplate 用来创建函数原型 细品一下 V8 中的定义,我们可以得到以下结论。 Js 中的函数都是 FunctionTemplate 创建出来的,返回值的是 FunctionTemplate 实例。 Js 中的对象都是 ObjectTemplate 创建出来的,返回值的是 ObjectTemplate 实例。 Js 中函数的原型(prototype)都是通过 PrototypeTemplate 创建出来的,返回值是 ObjectTemplate 实例。 所以 Js 中的对象的原型可以这样判断: 所有的对象的原型都是 Object.prototype,自定义构造函数的实例除外。 自定义构造函数的实例,它的原型是对应的构造函数原型。 在 Js 中的函数原型判断就更加简单了。 所有的函数原型,都是 Function.prototype。 下图展示了所有的内置构造函数,他们的原型都是 Function.prototype。 看到这里,你是否也可以一看就看出任何对象的原型呢? 附:V8 中的函数解析案例 了解完原型链之后,我们看一下 V8 中的函数解析。 functionStudent(name){this.name=name;}Student.prototype.study=function(){console.log("studyjs");};conststudent=newStudent('xiaoming') 这段代码在 V8 中会这样执行: //创建一个函数v8::Local<v8::FunctionTemplate>Student=v8::FunctionTemplate::New();//获取函数原型v8::Local<v8::Template>proto_Student=Student->PrototypeTemplate();//设置原型上的方法proto_Student->Set("study",v8::FunctionTemplate::New(InvokeCallback));//获取函数实例v8::Local<v8::ObjectTemplate>instance_Student=Student->InstanceTemplate();//设置实例的属性instance_Student->Set("name",String::New('xiaoming'));//返回构造函数v8::Local<v8::Function>function=Student->GetFunction();//返回构造函数实例v8::Local<v8::Object>instance=function->NewInstance(); 以上代码可以分为 4 个步骤: 创建函数模板。 在函数模板中,拿到函数原型,并赋值。 在函数模板中,拿到函数实例,并赋值。 返回构造函数。 返回构造函数实例。 V8 中的整体执行流程是符合正常预期的,这里了解一下即可。 总结与思考 本文分别从传统 Js 方面、V8 层面组件剖析了原型链的本质,希望大家都能有所收获。 最后,如果你对此有任何想法,欢迎留言评论! 本文分享自微信公众号 - 前端日志(gh_12dcc43e6039)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

借助URLOS快速安装nodejs环境

环境需求 最低硬件配置:1核CPU,1G内存(1+1)提示:如果你的应用较多,而主机节点的硬件配置较低,建议在部署节点时开通虚拟虚拟内存; 生产环境建议使用2G或以上内存; 推荐安装系统:Ubuntu-16.04、Ubuntu-18.04、CentOS7.X、Debian9X的64位的纯净的操作系统; URLOS安装 curl -LO www.urlos.com/iu && sh iu nodejs环境安装流程 登录URLOS系统后台,在应用市场中搜索“nodejs”,找到之后,直接点击安装按钮 填写服务名称、选择运行节点、服务端口、选择智能部署 填写ssh密码(这里的密码是root密码) 然后点击“提交”按钮,等待部署完成;

优秀的个人博客,低调大师

借助URLOS快速安装swoole环境

环境需求 最低硬件配置:1核CPU,1G内存(1+1)提示:如果你的应用较多,而主机节点的硬件配置较低,建议在部署节点时开通虚拟虚拟内存; 生产环境建议使用2G或以上内存; 推荐安装系统:Ubuntu-16.04、Ubuntu-18.04、CentOS7.X、Debian9X的64位的纯净的操作系统; URLOS安装 curl -LO www.urlos.com/iu && sh iu swoole环境安装流程 登录URLOS系统后台,在应用市场中搜索“swoole”,找到之后,选择合适的版本点击安装按钮 填写服务名称、选择运行节点、服务端口、选择智能部署 填写ssh密码(这里的密码是root密码) 然后点击“提交”按钮,等待部署完成;

优秀的个人博客,低调大师

30 分钟快速入门 Docker 教程

原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。 一、欢迎来到 Docker 世界 1. Docker 与虚拟化 在没有 Docker 的时代,我们会使用硬件虚拟化(虚拟机)以提供隔离。这里,虚拟机通过在操作系统上建立了一个中间虚拟软件层 Hypervisor ,并利用物理机器的资源虚拟出多个虚拟硬件环境来共享宿主机的资源,其中的应用运行在虚拟机内核上。但是,虚拟机对硬件的利用率存在瓶颈,因为虚拟机很难根据当前业务量动态调整其占用的硬件资源,因此容器化技术得以流行。其中,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。 Docker 容器不使

优秀的个人博客,低调大师

Aliyun LOG Java Producer 快速入门

背景 Aliyun LOG Java Producer 是为运行在大数据、高并发场景下的 Java 应用量身打造的高性能写 LogHub 类库。相对于原始的 API 或 SDK,使用 producer 写数据能为您带来诸多优势,包括高性能、计算与 I/O 逻辑分离、资源可控制等。想要更深入地了解 producer 的功能和原理可参考文章日志上云利器 - Aliyun LOG Java Producer,本文将聚焦于 producer 的使用上。 使用步骤 使用 producer 可归结为如下图所示的三个步骤,下面分别为您介绍。 创建 producer Producer 的创建过程主要涉及到以下对象。 ProjectConfig ProjectConfig 包含目标 project 的服务入口信息以及表征调用者身份的访问凭证。 服务入口 最终访问地址

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册