首页 文章 精选 留言 我的

精选列表

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

快速建站服务 - 零门槛三分钟快速建站

阿里云云市场-精心打造明星建站产品 面对日益增多的创业公司与中小企业,拥有属于自己官网的需求十分迫切。 本次教程使用商品: 【1元/天建站】PC+手机+微信网站建设,百套精美样式,可视化简单操作 【1元/天建站】是中小企业建站首选。后台功能强大,操作简单,完全可以用SAAS平台做出定制站效果 优惠价¥3/月 立即购买 本次教程使用商品:1、修改网站内容:2、域名解析 1.登录阿里云---进入控制台 2.点击左侧“域名”---在需要解析的域名后面点击“解析”(注意:操作解析前,请先完成“实名认证”,否则会有解析不通过的情况) 3.在需要解析的域名后面点击“解析” 4.点击进入高级设置 5.点击“添加解析”,为提升网站稳定性,建议您做两条CNAME记录到后台提供的解析地址。 两条CNAME记录:"主机记录"=WWW,记录值=“解析CNAME” "主机记录"=@, 记录值=“解析CNAME” 提示:CNAME记录在后台“域名管理”---“解析与备案”查看。 如解析时提示有冲突,建议修改为:一条CNAME和一条A记录:主机记录=WWW,记录值=“解析CNAME” 主机记录=@,记录值=“解析IP” 提示:A记录(解析IP)在后台“域名管理”---“解析与备案”查看。 3、域名绑定域名绑定 1.进入后台--域名管理--点击“新增域名” 2.输入域名--点击确定 3.域名绑定成功! 4、网站发布 1.进入设计页面--点击发布(也可在后台管理界面点击“发布”) 2.确认域名后点击“发布” 网站发布成功!

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

快速认识,后端王者语言:Java

Java作为最热门的开发语言之一,长居各类排行榜的前三。所以,就算你目前不是用Java开发,你应该了解Java语言的特点,能用来做什么,以备不时之需。 Java 是一种高级、多范式编程语言,以其编译为独立于平台的字节码的能力而闻名。 它是由 Sun Microsystems 的 James Gosling 于 1990 年设计的。它的首批演示之一是 Star7 PDA,它催生了 Java 吉祥物 Duke。 如今,它是世界上最流行 的编程语言之一。它目前最主要的应用场景包括: 通过 Spring Framework 为企业开发 Web 应用程序 通过 Hadoop 开发大数据应用 为 Android 上的移动应用程序提供支持 除此之外,甚至像美国宇航局 Maestro 火星漫游者的控制器之类的东西也是通过Java实现的。 Java 的创新之处在于,它不是像 C 或 C++ 那样编译为机器代码,而是编译为可以在任何操作系统上运行而无需重新编译的字节码,这是通过使用 Java 虚拟机 (JVM) 执行代码来实现的。 它同时是一种编译语言和解释语言。计算机只需要安装 Java 运行时环境 (JRE)。对于开发人员来说,这意味着编写一次,随处运行。 它是一种强类型语言,具有类似于 C 系列的大括号语法。但是,它提供了更多高级功能,例如垃圾收集、运行时类型检查和反射。 下面直观的感受一下Java语言的! 首先,安装 Java 开发工具包或 JDK,然后创建一个以 .java 结尾的文件。 每个 Java 程序都以类名开头,该类名也应该与文件名匹配。该类需要有一个 main 方法。在方法内部,通过以类型开头、后跟名称和值来定义变量。然后我们可以使用内置系统类将其打印到标准输出。 现在因为我们在一个类的内部,所以我们将函数定义为该类的方法。 public 关键字意味着它可以在此类之外使用,而 static 意味着它是类本身的成员,而不是类的实例。然后我们提供一个类型和名称,并从中返回一个值。 您可以定义自己的自定义类,它们是对象的蓝图,然后向它们添加属性和方法。 使用 new 关键字实例化类中的对象。 它感觉非常面向对象,但已经发展到支持像匿名 lambda 方法这样的函数模式。 程序完成后,使用编译器生成一个 .class 文件,其中包含字节码。 现在使用 java 命令告诉 JVM 解释并运行该文件。 恭喜,您刚刚构建了一个企业级应用程序。如果您要学习更多Java开发内容,我的博客中有不少免费学习资料,您可以直接在线学习: Java 8教程 Java 9 - 21新特性教程 Spring Boot教程 Spring Cloud教程 另外,如果您想开拓眼界,了解和发现更多计算机领域的概念和知识,欢迎关注我在持续更新的开发者科普专栏,助你探索更多计算机领域的热门知识! 欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

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

探索GreatADM:如何快速定义监控

引文 在数据库运维过程中,所使用的运维管理平台是否存在这样的问题: 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。 2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。 3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固化,难以应对多样化的监控需求。 4、只监控系统关键指标,屏蔽不必要的指标,优化CPU消耗、网络、采集数据量等,减少资源消耗,提升系统性能。 在数据库运维过程中,用户或者DBA经常会因为管理平台监控面板无法配置,或者监控模板固化,监控模板中没有所关注的指标项,而不得已弃用部分管理平台,进而自建监控或者基于自身业务自定义一批运维监控脚本,来实现数据库或者主机的多样化监控需求。 但这些脚本往往出自不同DBA之手,监控脚本的管理、更新和维护,以及风险评估给数据库的稳定运行带来了新的风险,而且脚本的输出结果需要DBA周期检查分析,展示上也不够直观。今天我们来看下GreatADM是如何解决上述问题的。 一、GreatADM的监控介绍 GreatADM提供灵活的自定义监控配置方法,支持通用的prometheus+grafana的规范,用户可以按照实际业务上的需求,通过配置标准的grafana面板json格式文件或者通过图形化选项配置监控采集项,手动定义dashboard面板。用户可按需灵活的配置监控面板。同时GreatADM支持用户按需调整监控数据的采集频率、监控超时阈值等,用户可按实际业务需求来定义调整,以及对应的SQL命令的调整等。 GreatADM提供不同数据库架构的监控指标和监控模板,支持采集频率、超时阈值的调整,并提供3个维度监控: 1、架构层面:数据库高可架构整体全局状态概览和复制状态、延迟、运行时长、趋势概览。 2、数据库实例:数据库实例节点层面的监控,如SQL执行情况,内存波动,网络请求,I/O负载等方面监控。 3、物理主机:数据库实例所在主机性能指标如CPU、内存、IO、磁盘用量等,可以发现数据库的性能瓶颈,及时进行优化。 针对监控采集,DBA在分析判断问题时,也可清晰了解到监控使用的SQL命令是什么,方法是否和自己的使用的SQL相同等。 如果上面的监控指标,或者面板不是你想要的,接下来我们就详细看下GreatADM如何自定义业务中,或者DBA想要的监控项,和监控面板的配置。 二、如何自定义GreatADM的监控面板 配置整体步骤如下: a、添加监控采集指标,编辑采集命令 Demo1:只监控Linux根空间用量 Demo2:监控慢日志累计增长量 b、检查采集器是否有效 c、配置监控面板 d、自定义监控完成 e、多个面板配置在同一页面 1、添加空间采集项 Demo1、【如何增加主机自定义监控项---独立监控linux根空间用量】 针对以下选项: 填写采集组名称:host_root 采集频率:300s 采集超时:5s 采集组默认是否启用:启用 添加到哪个类型数据库架构:paxos高可用复制 采集目标:数据库主机 选择任一节点:hostname 运行shell采集命令:df -Th|grep root|awk -F' ' '{print $6}'|awk -F'%' '{print $1}' 采集命令注意:监控主机,则采集语句为shell命令,目标选择主机;监控数据库,则采集语句为SQL命令,目标选择数据库。另外对应的采集器返回的结果只允许是"单项结果值",如果存在多列,多行结果,对应的采集器会报错,并且无法正常采集。 采集器添加完成之后,信息如下 查看对应的采集命令 Demo2、【如何增加数据库自定义监控项---数据库慢日志增长趋势】 针对以下选项配置方法同上: 填写采集组名称:slow_queries 采集频率:5s 采集超时:5s 采集组默认是否启用:启用 添加到哪个类型数据库架构:paxos高可用复制 采集目标:数据库实例 选择任一实例节点: 选择数据库名:paxos_600 实例节点:database_1 运行SQL采集命令:select variable_value from performance_schema.global_status where variable_name='slow_queries' 提交并查看监控项信息 使用的SQL语句 添加采集项的整体配置流程可以总结为: 1选择类型 2选择主机/数据库 3采集命令 4运行采集命令 5提交并检查 2、检查新增采集项是否有效 选择【监控告警】--子项【查询】来验证新增加的采集项是否可采集到数据,以及前端绘图是否正常 点击【使用查询】可看到对应的graph的绘制图,点击【检查】,可具体看到采集项【统计数据】,如下共采集了482行。当前因为我选择了2台主机的,因截图遮展示框盖住了另外一台的绘图。 具体【数据】可查看到时序时间对应的主机采集的磁盘数值。 登录主机和实际主机的磁盘根空间对比查看 确认对应的采集数据可以正常,无误,为可用状态。(数据库的采集项和此检查一致,这里就不在赘述了)。 接下来就可以配置grafana面板了。 3、配置监控面板 登录GreatADM的http://172.17.139.50/graph/login可直接跳转到GreatADM集成Grafana面板配置页,默认账号为admin,密码为GreatADM内置的初始密码。 选择【+】 Dashboard--添加新的【panel】 在这里Data sorce 选择【监控】 点击【指标浏览器】--搜索栏搜索采集项名称【host_root】--匹配到【node_ext_host_root_demo】--自动匹配【address标签】展示可监控的主机IP列表 选择要监控的主机【IP】--点击【使用查询】--可正常绘制监控图 调整横坐标轴的标题title【主机 "/" 根空间使用率】和纵坐标的lable描述【磁盘空间使用率(%)】 下一步针对绘图线的格式调整,点击【选项】--【图例】--【自定义(提供命名模板)】 将{{label_name}}修改为{{address}}之后,对应的主机信息就完整了 保存配置,并为Dashboard 定义名称 配置好之后的Grafana面板如下: 接下来只需要将定义好的面板的json数据配置信息,cp到greatadm的自定义监控项中,粘贴进去即可。 4、完成自定义监控面板 拷贝当前配置完成的Grafana面板的json数据,到greatadm自定义面板页面,选择【Edit】 点击【配置的齿轮图标】 选择【JSON Model】--全选--复制即可 点击GreatADM的【监控告警】---【自定义监控】--【新增监控面板】--粘贴拷贝的json文本 提交即可看到自定义的监控面板了。 同样的方式配置slow_queries的增长趋势,方法和主机监控的相同,这里就不在重复介绍了。整体效果如下2个面板针对不同的监控项做定制。 但此时有人问了,如何将面板都配置在同一页面中呢? 5、多个面板如何配置在同一页面 如果将多个面板如何配置在同一页面中展示呢,比如将慢日志增长趋势的和主机根空间配置在一起。接下来继续看。 选择 【add panel】--添加新的面板 将慢查询增长趋势,正常配置进去 调整--【选项】--【自定义】--【{{address}}:{{port}}:{{name}}】对应【数据库实例IP:端口:实例名】,配置方法完全一直。 最终在GreatADM页面点击【保存】之后,配置效果如下 验证监控效果; 慢查询增长通过:select sleep(10);select sleep(10);select sleep(10); 增加3条慢查询记录,从9条增加到12条。 磁盘空间使用dd 命令,临时创建1个10G的大文件,看根空间的使用率变化,从50%增长到55% [root@gip /]# dd if=/dev/zero of=/test_root_space bs=1024M count=10 增长趋势变化可直观的查看到,与实际数据库和主机的值匹配。表示监控项是有效可用可直观观察到变化。 三、自定义监控的使用场景和意义 为什么需要自定义监控功能解决了用户和dba现场维护数据库时的几个诉求,以及提供基于业务可定制监控的途径。其意义如下: 1、个性化监控:不同类型的实例或组件需要有不同的视角,但管理平台监控固化,而自定义监控解决了应对多样化的监控需求。自定义监控面板允许管理员选择所需的监控指标和图表,根据自己的实际需求来展示重要的数据库运行数据,提高信息关注度和有效性。 2、重点监控:针对特定的业务需求,管理员可以将自定义面板中的监控指标和图表设置为关注重点,确保数据库的关键功能和性能得到优先监控。 3、运行趋势监控:数据库管理平台自定义监控面板能够提高数据的可视化程度。使数据库性能和健康状况更容易理解和分析。通过设置预警和警报规则,自定义面板有助于及时发现潜在问题,并采取措施进行干预,确保数据库的稳定运行。 这也是GreatADM再结合诸多业务的实际运维场景,紧贴用户实际需求开发的产品,真正做到易用,好用,可灵活配置,解决实际问题为目的,为数据库的平稳运行保驾护航。 Enjoy GreatSQL :) 关于 GreatSQL GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。 相关链接: GreatSQL社区 Gitee GitHub Bilibili GreatSQL社区: 社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html 社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html (对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~) 技术交流群: 微信&QQ群: QQ群:533341697 微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

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

CakePHP 4.4.8,PHP 快速开发框架

CakePHP 是一个运用了诸如 ActiveRecord、Association Data Mapping、Front Controller 和 MVC(model–view–controller) 等著名设计模式的开源 Web 框架,它以 Ruby on Rails 的概念为模型,并在 MIT 许可下进行分发。 CakePHP 4.4.8 现已发布,这是 4.4 分支的维护版本,修复了几个社区报告的问题。 在如何处理代理标头方面,将 ServerRequest::scheme() 和 Uri::getScheme() 对齐 改进旧的 PaginatorInterface 别名的兼容性 修复了在没有名称或表的情况下创建表类,并调用 getAlias() 时的无限循环 改进 assertMailSentWith 与数组值的比较 修复了 sortDefault 和 directionDefault 不适用于多分页的问题 改进的类型提示和 API 文档 更新公告:https://github.com/cakephp/cakephp/releases/tag/4.4.8

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

如何快速上手 angular.js

摘要:angular.js 准确的来说,应该不是一个框架,是一个 js 库,一个依赖于 jQuery 的进一步封装,去除繁琐的 DOM 操作,使用数据驱动的 MVC 模块化库。 哎,很难受,连续两个大坑,都被我碰上了,以前没有写过 angular,还以为 angular 就是跟 vue, react 一样的框架,没想到 angular.js 跟 angular2 ,竟然没有半毛钱关系,我是服了。竟然是一个老古董项目。 只能退一步想了,先把基础地基打好了,后面再深入框架原理。 还是按照三大步骤: what: 什么是 angular.js why: 为什么要使用 angular.js how: 如何使用 angular.js 什么是 angular.js angular.js 准确的来说,应该不是一个框架,是一个 js 库,一个依赖于 jQuery 的进一步封装,去除繁琐的 DOM 操作,使用数据驱动的 MVC 模块化库。 这里扯到 MVC 这个词语,也不是很清楚,我自己的理解 M 其实就是 Module 模块,一个 .html 就是一个模块, V 其实就是我们 .html 里面那些 DOM 元素, C 就是我们用来操作 V 那些 js 脚本。 我大概画了一个简单的草图: 不知道对不对,如果不对,恳请各位大佬,提出宝贵的建议,让我有更大的提升,谢谢。 为什么要使用 angular.js 额,我必须要吐槽一下,为毛还要使用 angular.js,为毛不使用 angular2,好歹让我入门 ts 也好啊,好了,既来之,则安之。 用这个 js 库的一个关键原因就是因为可以去除繁琐的 DOM 操作。 使用数据驱动视图的方式,进行开发,非常高效。 如何使用 angular.js ng-app 加载一个入口应用模块 var app = angular.module('ngApp', []); 有点类似,Vue 项目的 let app = new Vue(); ng-init 初始化数据, <div ng-app="ngApp" ng-init="message='hello world'"></div> 有点类似 Vue 中的 data() 属性。 ng-controller 控制器 <div ng-app="ngApp" ng-init="message='hello world'" ng-controller="ngController"></div> <script type="text/javascript"> var app = angular.module('ngApp', []) var controller app.controller('ngController', function($scopr) {}) </script> ng-bind 数据绑定 有点类似 Vue 中的 v-bind ng-model 数据双向绑定 有点类似 Vue 中的 v-model <input type="text" ng-model="message"> ng-repeat 数据循环 有点类似 Vue 中的 v-for <div ng-app="" ng-init="names=['Jani','Hege','Kai']"> <p>使用 ng-repeat 来循环数组</p> <ul> <li ng-repeat="x in names"> {{ x }} </li> </ul> </div> ng-if 为HTML增加选择功能,只有在表达式值为true时,当前元素才添加到DOM树 有点类似 Vue 中的 v-if ng-show 有点类似 v-show ng-src 有点类似 :src ng-click 有点类似 @click ng-style 有点类似 :style ng-class 有点类似 :class ng-show/ng-hide 有点类似 jq 的中 show(),hide() ng-disabled 有点类似 :disabled ng-checked 有点类似 :checked $scope 有点类似 Vue 中的 data() 属性 filter 过滤器,有点类似 Vue 中的 filter $scope.$watch 有点类似 Vue 中的 watch 属性 今天就先到这里吧,其实应该是有些先入为主了,因为其实 Vue 是学了 angular.js 的思想的。 这里有一个很重要的思考方式就是迁移思考。 点击关注,第一时间了解华为云新鲜技术~

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

高效 SIEM 用例快速指南

成功设置安全运营中心 (SOC) 的环节之一是定义 SIEM 用例。 用例能够在安全分析师和威胁监控目标上提供帮助和支持。什么是用例?用例可以是 SIEM 工具中多个技术规则的组合,也可以是多个规则中的操作组合,具体视需求而定。用例能够将业务威胁转换为 SIEM 技术规则,然后检测可能的威胁并将警报发送给 SOC。建立和定义正确的用例有助于区分真实警报和误报。用例还会根据当前或历史活动来给出建议操作,这些活动可能就是进行中或未来攻击的一部分。了解如何设置 SIEM 用例及其对 SOC 的帮助。 部分 SIEM 用例 首先要注意,我们可以在各种用例之间建立关联。从本质上讲,单独采用用例的效果不佳。用例的组合输入或操作链将决定传入攻击的复杂性或类型。 所有用例都有三个主要的组成部分: ·规则,用于根据目标事件检测和触发警报 ·逻辑,定义如何考虑事件或规则 ·操作,确定在满足逻辑或条件时需要执行的操作。 如何构建 SIEM 用例? 在开始选择用例之前,务必为其确定一个框架。 1.选择工具,选择一个可以设计和映射用例框架的工具。决定使用何种框架后,开始确定优先级并集中处理对团队财务、声誉和数据有影响的业务威胁和风险。 2.考虑攻击类别。这意味着定义可能会产生影响的商业威胁,比如网络钓鱼、数据提取等。将适用的每种攻击类型链接到一个或多个商业威胁。最终,我们将得到一张图,显示业务风险与攻击之间的关系。 3.创建另一种关系:通过创建另一种关系来指定化解攻击的途径和方式。确定列出的攻击类型,并将其置于所选框架中。举例来说,我们可以将外部扫描攻击归于框架内的侦察/目标之中。 4.在两种关系之间建立联系:即业务威胁和攻击的关系,以及攻击和框架的关系。 在此基础上,您可以将这些关系编入 SIEM 用例。已识别的业务威胁将会是高级别用例。我们可以进一步将其细分为低级别用例。每个高级别用例中可以嵌套两三个用例。一般在用例如何适用于多个业务威胁/高级别用例的情况下,我们总会发现一些重叠。举例来说,如果已有“数据丢失”这个高级别用例,嵌套在数据丢失用例中的低级别用例将是服务器泄密、从服务器导出数据以及服务器上未经授权的管理员活动。 每个低级别用例都会与某些攻击类型之间有逻辑连接,进而辅助定义技术规则。每个低级别用例可能都适合多个规则,而且一个规则可能与多个低级别用例有关。我们有必要通过定义其结构来展示连接情况,因为这将进一步定义要使技术规则生效所需的日志源。 SIEM 用例生命周期 图片由 IBM 提供 在 SIEM 用例的生命周期中,用例有多个输入点。这取决于将数据馈送到用例的源头。在 SOC 的日常操作过程中,用例将通过 1 级或 2 级 SOC 分析师获取输入信息。这些输入信息中的大部分均归因于误报检测。如果 SOC 内配备威胁搜捕和情报功能,则将根据当前用例未检测到的流量或其在威胁情报输入信息中识别的新威胁来输入信息。 根据 1 级和 2 级 SOC 分析师发现的误报,我们可以通过修改用例来减少 SIEM 平台生成的不良警报。SIEM 管理员或用例工程师还将通过识别半匹配事件、生成的重复警报数和其他标准来研究用例的效率。 用例管理 和任何其他应用或产品一样,用例必须不时地加以管理和维护,方可确保其有效性。用例要经历多个阶段才能完成从计划到部署的周期: 图片由 IBM 提供 定义/审核需求:在设置 SIEM 用例之前,我们要先考虑业务威胁和风险。有关如何构建用例,请参见上述章节。 识别数据源:明确目标数据后,我们紧接着就是要考虑如何找到这些数据。攻击是根据攻击源定义的。 内接/外接数据源:开始将识别的数据/日志源集成到 SIEM 中。这可能需要在源头进行一些配置,具体视配置的 SIEM 而定。这其中还可能需要对防火墙进行一些更改,以确保数据源与 SIEM 之间进行通信。 设计/审核逻辑:在获得数据/日志之后,我们就可以查看日志并确定检测攻击所需的内容(事件字段)。构建此逻辑/规则的重要因素是识别正确的事件字段以执行关联或聚合。 定义基线:在用例/规则中,定义阈值/基线以聚合类似事件。 测试和调优:我们必须对用例中定义的逻辑和基线进行测试。根据测试结果,我们需要进行调整以确保降低噪声。 基于成效进行优化:根据测试,优化基线以检测攻击。 监控性能:在生产中部署用例并开始监控性能和生成的警报,以检查误报和总体运行状况。 用例框架 我们可以采用多种框架来构建 SIEM 用例。在本例中,我们来了解一下两种最有效的框架:MITRE ATT&CK 和 Lockheed Martin Cyber Kill Chain。这两种框架都包含两个部分:攻击前和攻击后。攻击前包括与目标选择和发现漏洞相关的所有用例/规则。攻击后则涉及与交付、执行、连接和提取相关的用例/规则。 图片由 IBM 提供 SIEM 用例是确保 SOC 处于最佳状态的重要环节。这些用例可以确定是已检测到还是已错失网络内的攻击,以及我们可以在什么阶段检测到传入威胁。SOC 分析师的专业程度也会因定义的用例不同而有所差异。用例的优化和完善程度越高,检测和分析的质量也就越高。 作者简介 Asheesh Kumar IBM Security 安全架构师、咨询师,从事网络安全领域工作的安全架构师兼顾问。 *立即前往 IBM安全专家问诊互动专区,掌握 SIEM最新安全技术趋势。 历史精彩文章推荐 >>> *2021 SIEM 必看趋势:如何选择安全分析提供商 *SOC 2.0 时代:更强大、更安全的安全运营团队的构建指南 关于 IBM Security>>> IBM Security 是 IBM 的信息安全解决方案及服务部门,具有多年深耕全球和本地各行各业客户的经验。IBM Security 在全球守护95%的全球五百强企业和组织的信息安全,客户覆盖金融、医疗、汽车、科技、电信、航空等行业公司及集团,包括50家全球最大的金融和银行机构中的49家、15家最大的医疗机构中的14家,15家全球最大科技企业中的14家等。IBM Security 在 Gartner、Forrester、IDC 和其他机构发布的12份不同的分析报告中,有12项技术解决方案被列为领导者,在产业中跻身首列。 【责任编辑:贺鑫 TEL:(010)68476606】

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

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源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。