- 博客(60)
- 收藏
- 关注
原创 Vert.x,应用监控 - 全链路跟踪,基于Zipkin
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),能够收集服务间调用的时序数据,提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来,通过trace id,就能够直接定位到这次调用链路,并且可以根据服务名、标签、响应时间等进行查询,找出哪些耗时比较长的链路节点。当用户发起一次调用时,Zipkin的客户端(Brave)会在入口处为整条调用链路生成一个全局唯一的trace id, 一个trace id代表一个完整的调用链。
2024-11-08 18:51:24 754
原创 Vert.x,应用监控 - 基于Micrometer / Prometheus
Micrometer为市场上主流的监控(子)系统提供了一个简单的"门面",目前Micrometer支持的监控系统包括:Atlas, Datadog, Graphite, Ganglia, Influx, JMX, and Prometheus. Micrometer实现了运行指标监控的一个门面设计模式(Facade Pattern),你可以用SLF4J来理解Micrometer,只不过slf4j用于管理程序日志,而micrometer用于管理程序运行指标。
2024-11-07 17:10:34 570
原创 Vert.x,认证与授权 - 基于OAuth 2的身份认证
OAuth2也称为"第三方登录"。即使用第三方网站进行身份认证。并获取其在第三方网站的身份数据。OAuth2是一种被广泛使用的身份认证方式,网上的介绍的文章也很多,大家可以参考阮一峰写的3篇介绍文档(https://www.ruanyifeng.com/blog/2019/04/oauth_design.html)。
2024-11-05 13:07:45 769
原创 Vert.x,认证与授权 - 基于JWT的身份认证
JSON Web Token(JWT)是一种用于安全传输(JSON格式)信息的开放标准(RFC7519),JWT常用于身份验证和信息交换,JWT通过数字签名确保信息的安全性和完整性。JWT可以使用对称密钥(HMAC算法),也可以使用非对称加密的密钥对(RSA或ECDSA)对要传递的信息进行签名和验证。推荐使用非对称加密算法进行签名,这种方式更安全(有利于保护密钥),非对称方式只有在生成JWT时候需要私钥加签,验证JWT时候只需要公钥。
2024-11-01 11:35:39 821
原创 Vert.x,认证与授权 - 基于Session的身份认证
认证逻辑非常简单:取出用户提交的用户名和密码,与服务器保存的用户名密码进行比对,如果一致就通过身份认证,并生成用户服务器权限(User)对象,绑定到RoutingContext,返回登录成功信息给浏览器;基于会话的身份认证,因为登录信息存放在服务器会话,所以不能跨服务器/域(目前已有多种成熟的解决共享session方案,如通过Redis),当服务器重启后,所有用户需要重新登录。访问管理源页面(/hr/admin.html),如果未登录,则跳转登录页面,如果当前是user登录,会提示没有权限。
2024-10-22 09:37:01 382
原创 Vert.x,认证与授权 - HTTP基本认证
要使用Vert.x auth我们需要实现的两个核心接口是AuthenticationProvider和User。AuthenticationProvider用于告诉系统如何进行身份认证,AuthorizationProvider用于告诉系统如何进行授权,User实例是用户对应权限的载体(authorisation of users),是AuthorizationProvider接口方法authenticate返回的(异步)结果。
2024-10-21 14:27:32 820
原创 Vert.x,Web - Web
这是学习案例的前端部分。前端使用layui UI框架,使用其layui table组件实现员工信息增删改操作。Http Server前端也设计成一个Verticle,启动一个Http server,监听8080端口,实现代码如下:public class HrWebServer extends AbstractVerticle { private static final Logger LOGGER = Logger.getLogger(HrWebServer.class.getName());
2024-10-15 16:11:49 1234
原创 Vert.x,Web - Restful API
假设我们要设计一个人力资源(HR)系统,要实现对员工信息的增删改查。我们将前端和后端设计成两个Verticle,这样可以实现灵活的部署,可以将前端和后端部署在一个JVM上,也可以部署到不同的JVM或者不同的服务器上。use hr;
2024-10-14 17:15:37 980
原创 Vert.x,Web - 静态资源/模板
Vert.x-Web带有开箱即用的处理器(StaticHandler),用于处理静态Web资源(.html, .css, .js, …), 因此可以非常轻松地编写静态Web服务器。默认静态文件目录为类路径下的webroot目录,对于maven的项目,按规范放在src/main/resources/webroot下,但可以配置。例如:</</</stylemargin-top18px;
2024-10-11 09:58:37 787
原创 Vert.x,Web - Router
Vert.x-Web是用于构建Web应用程序的一系列模块,可以用来构建经典的服务端Web应用, RESTful应用, 实时的(服务端推送)Web应用,或任何您所能想到的Web应用类型。Vert.x Web的设计是强大的,非侵入式的,并且是完全可插拔的,可以只使用您需要的部分。Vert.x Web不是一个Web容器。要使用Vert.x Web,需要添加"vertx-web"依赖:</</</</
2024-10-10 11:07:33 722
原创 Vert.x,Databases
Vert.x提供了数据库相关模块(扩展包),方便我们通过异步方式访问数据库。数据库扩展主要包括:响应式数据库客户端(vertx-xxx-client)和通用JDBC客户端(vertx-jdbc-client)。响应式数据库客户端是事件驱动和非阻塞的,可以仅仅使用一条线程来处理大量的数据库连接。专注于可伸缩性和低开销。这些客户端还内置连接池,提供了更简单易用的API。
2024-09-27 19:31:22 545 1
原创 Vert.x,Core - Verticle and Event Bus
Verticle是由Vert.x部署和运行的代码块。Verticle实例可使用任意Vert.x支持的编程语言编写,可以将Verticle想成Actor Model中的Actor。可以将Verticle理解成一个可以独立热部署的组件(模块),一个应用程序通常是由在同一个Vert.x实例中同时运行的多个Verticle实例组合而成。不同的Verticle实例通过向Event Bus(后面会介绍)上发送消息来相互通信。
2024-09-26 17:18:01 994
原创 Vert.x,Core - Future
在同步编程(synchronous programming)中,当调用一个方法,方法的调用者(线程)需要一直等待,直到方法结果返回。而在异步编程(asynchronous programming)中,通过异步方法,方法的调用者不需要等待结果返回,当结果就绪时候会通知我们。Vert.x的提供的API大都是异步的,调用并不需要等结果返回。假设一个业务逻辑需要A() -> B() -> C() -> D() 这4个调用来完成,他们调用有向后顺序,后一个调用依赖前一个调用的结果。
2024-09-23 17:05:46 656
原创 Vert.x,Core - 黄金法则
Vert.x的核心Java API被我们称为Vert.x Core, 提供了Vert.x底层功能。对于Maven项目可以通过以下方式添加依赖:
2024-09-21 16:42:03 803
原创 Vert.x, 简介
Vert.x是Eclipse基金会下的一个开源项目,基于Eclipse Public License(EPL)2.0和Apache License 2.0双重许可,是一个基于JVM的用于构建响应式(reactive)应用程序的工具包。Vert.x基于Netty,但不仅仅局限于开发可扩展的高性能网络服务器和客户端。
2024-09-18 18:54:41 905
原创 通过Java调用OceanBase云平台API
最近由于工作原因又开始捣鼓OceanBase,OceanBase云平台(OCP)提供了强大的管理和监控功能,而且对外开放API接口,可以将部分监控整合到自己的平台,所以写了个Java调用OCP API的demo做为自己的技术储备,也想分享给大家。也因为最近对Eclipse Vertx和异步编程非常兴趣,所以案例使用是Vertx的WebClient,而非Apache HttpClient, 不过,不管用什么库,原理是相似的。
2024-07-05 15:44:46 1356
原创 为“自研”的KV数据库编写JDBC驱动
所以我们需要在META-INF/services/目录里创建一个以服务接口命名的文件, 文件名为"java.sql.Driver"的文件, 该文件内容为接口实现类: ‘org.littlestar.propsjdbc.Driver’。一觉醒来,受到梦的启发,自研了一套K/V数据库系统,因为"客户"一直催促我提供数据库的JDBC驱动,无奈之下,只好花费一个上午的时间为用户编写一个。经过"客户"专家组评审,这套数据库系统测试符合预期,达到了业界领先水平,喜提6000w马内,实现人生财富自由。
2024-04-02 15:39:08 334
原创 MySQL新的版本发布模型 - 创新版本和长支持版本
2023年7月18日,MySQL发布了最新数据库服务器版本8.1.0,其中变化最大的是MySQL采用了新的版本发布模型。除了包含缺陷修复,还可能包含已经稳定的新特性。新模型可以让MySQL更快的引入型特性,但是频繁的变化对与用户来说是个挑战,对于一个稳定的生产系统,我们通常需要的是缺陷修复,而不是引入变化。这种模型有一个缺点: 新特性只在大版本发布,而大版本发布周期通常很长(通常2年),虽然保持了版本稳定,但新特性发布比较慢。
2023-08-15 11:29:13 1241
原创 InnoDB文件物理结构解析7 - FIL_PAGE_SDI
其中一个重要的改变就是,从8.0版本开始,MySQL废弃了.frm文件(还包括.par,.TRN,.TRG, .isl,db.opt,ddl_log.log ),MySQL使用字典信息序列化格式(serialized form)来存储数据字典,这部分数据称为serialized dictionary information (SDI),MySQL将SDI存放对应表的表空间中,并引入新的Page如:FIL_PAGE_SDI来存放SDI的数据。语句获取film表的DDL语句。视图获取表元数据信息。
2023-08-14 19:17:10 382
原创 InnoDB文件物理结构解析6 - FIL_PAGE_INDEX
InnoDB中,非主键索引(组合索引)字段是允许包含空值的。记录内容中,最前面部分存放索引的字段,后面接着索引字段值对应的主键值,记录内容不包含DB_TRX_ID和DB_ROLL_PTR伪字段。由输出可以看到,InnoDB索引,记录的是索引值对应的主键值,而不是行记录的地址,这与Oracle数据库的索引是不同的,或许与InnoDB是索引组织表有关,行记录存储在主键中。索引深度level>0时,根据非叶子节点内的值范围找叶子节点,再根据所在叶节点中找到对应的主键值,然后根据主键"回表",找到对应行记录。
2023-08-14 17:25:13 294
原创 InnoDB文件物理结构解析5 - FIL_PAGE_INDEX
如果执行的是"truncate sakila.film",该方法是无效的,因为整个ibd文件的存储空间会被"重置"(文件会变小,没有page(14)),全表删除(“delete from sakila.film”)通常不会,但也有特例,当一个表的数据量非常小(索引深度小于1),所有的行都在一个(Leaf) Page时,观察到全表删除和truncate一样,整个页的记录数据会被清掉(置为00),可以通过hexdump确认。程序输出和我们预想的一样,记录虽然被delete语句删除了,但是数据还是保留在页内的。
2023-08-14 17:16:33 210
原创 InnoDB文件物理结构解析4 - FIL_PAGE_INDEX
null-bitmap前面是variable-field-lengths部分,该部分是可变长字段的长度列表,该列表也是可变长的,要读取同样需要先确定列表的长度。当你的一个表,只有几行数据时,那么你可以观察到page(4)的page_level=0,这是一个Clustered Key Leaf Page,表所有的行记录都存储在该页内,当你不断往里面插入数据,该页无法容纳所有记录时,page(4)的会变成Clustered Key Non-Leaf Page,原来page(4)中的数据会分散到其它的叶节点内。
2023-08-11 18:14:58 293
原创 InnoDB文件物理结构解析3 - FIL_PAGE_INDEX
infimum的Next Record Offset是一个指针,指向的是下一条记录的位置,这个下一条记录位置到底是什么位置?因为案例的page(4)的page_level=1,也就是说存放的是非叶子节点,所以记录类型都是REC_STATUS_NODE_PTR,我们可以看到最后一条记录指向的位置(next_pos)为112,通过System_Records的结构图,可知这是supermum记录的"Next Record Offset(2 bytes)"位置,说明记录到此遍历完成。
2023-08-11 17:53:31 238
原创 解析InnoDB(.ibd)存储结构
一直都对innodb的文件结构非常感兴趣 , 最近又翻了翻Jeremy Cole关于InnoDB的文章(https://blog.jcole.us/2013/01/03/the-basics-of-innodb-space-file-layout/), 手又痒痒, 用Java写了一个解析innodb数据文件(.ibd)文件的小程序, 可以对.ibd的基本存储单位页(Page)的页头页和页尾进行解析。想做为一个开始, 后续如果有精力且资料充足的情况下, 会把逐步将innodb主要的Page都解析出来。
2023-06-15 11:14:20 839
原创 Linux进程打开文件数限制(nofile)
ulimit是Linux内建的命令可以用于限制用户的系统资源使用。其中的nofile(ulimit -n)限制当前用户允许打开的最大文件数(open files), 最近因为要监控系统中每个用户的资源使用情况,做了一些测试在这里做个记录,希望可以帮助有需要的朋友。
2023-04-10 17:21:52 3132
原创 基于AIX的Oracle RAC (11.2)操作系统安装建议
很久不装小鸡不搞AIX了,最近因为工作需要又整了一份,分享给大家参考,希望还有人用得到;-)
2022-09-07 09:47:41 1020
原创 Spring基础入门10 - 微服务与Restfull API
微服务架构是一种软件架构模式/风格, 并不是某个具体的框架和技术。微服务架构提倡将大的系统构建成一系列按业务功能划分的, 可独立运行的, 自治微服务(子系统)。各个服务彼此之间职责明确, 分工协作。在传统的单体式架构中, 所有的模块代码存放在一个应用中, 所有的数据存则放在一个数据库中。在这种模式下,随着需求的不断增加, 业务功能增加到一定程度,单体应用变得越来越庞大和臃肿,可维护性逐渐降低,灵活性降低,代码发布频率越来越慢,新功能交付效率也变得越来越低下。微服务架构可以帮助我们克服旧架构所面临的挑战,
2022-03-25 16:39:41 2201
原创 Spring基础入门9 - 使用Spring Boot编写Web应用
关于WebApplicationTypeSpring的主要开发场景是Web应用,我们将上例改成一个Web应用, 我们首先通过Sping Tools插件添加一个"Spring Web"依赖。添加完成后,插件在pom.xml文件添加了"spring-boot-starter-web"依赖,并在resources目录下创建了"static"和"templates"子目录。这时我们的代码不做任何修改,再运行一次我们的程序,程序不再像之前一样自动退出,通过程序输出, 程序启动了一个嵌入的Tomcat Web服务
2022-03-17 16:08:17 715
原创 Spring基础入门7 - JPA/Hibernate
1. 数据访问层 (DAO模式)通常我们的应用都要使用数据,涉及到大量的数据存取, 对于企业级应用,数据存放在关系型数据库是最常用的方案。前文提到Spring MVC将前端展现与业务逻辑分离,为了让程序结构更清晰,我们还会将数据访问从业务逻辑中也分离出来,做为一个数据访问层(持久化数据层)。这样我们就获得了一个J2EE经典的三层架构: 表现层 - 业务逻辑层 - 数据访问层。数据访问层通常使用的DAO模式进行封装,DAO模式主要包括三部分:DAO接口: 对需要的数据库操作的接口,提供外部(业务逻
2022-02-08 16:38:28 1052
原创 Spring基础入门6 - Spring JDBC
JDBC(Java DataBase Connectivity)是一套Java访问关系型数据库的标准, JDBC只定义接口,具体实现由各个厂商(框架)负责。 Spring使用的是javax.sql.DataSource接口获取数据库连接, DataSource代表一个数据源(获取数据库工厂),相较于直接通过java.sql.Driver获取数据库连接(通常是通过DriverManager根据SPI规范查找Drive实现, 并调用匹配的Driver创建连接),DataSource最大的优势就是可以实现连接池。
2022-01-28 18:59:33 1269
原创 Spring基础入门5 - Spring MVC
1. Spring MVC简介1.1. MVC设计模式MVC(Model View Controller),是一种设计模式。所有设计模式归的目的根结底都是解耦,MVC模式也不例外, 那么MVC模式要解的是什么耦合呢? MVC的设计意图是要将前展示与业务逻辑分离出来。在Spring MVC,将Web应用程序抽象成职责不同3种角色:Model, View和Controller。Controller层不会负责具体的页面渲染(不包含页面如何展示的代码), 而是接收用户的URL请求(POST/GET),执行业务
2022-01-27 17:29:44 484
原创 Spring基础入门4 - Spring MVC
前面章节学习了Spring框架的IoC和AoP, 接下了学习使用Spring开发J2EE Web应用程序。一个J2EE Web应用程序需要符合J2EE的相关规范, 并部署运行在符合J2EE规范的容器中, 如(Apache Tomcat)。本文将简单的介绍Eclipse Web应用开发环境的构建。开发环境:JDK 8+Eclipse IDE for Enterprise Java and Web DevelopersApache Tomcat 9.X开发工具建议使用Eclipse for J2E
2022-01-24 11:49:34 311
原创 Spring基础入门3 - AoP
上文我们一起学习了Spring IoC控制反转,下面我们继续学习一下AoP(Aspect Orient Programming), 面向切面编程。AoP同样是一种设计思想,AoP要达到的效果是,在不修改源代码的前提下,为系统中的业务组件添加某种功能增强。AoP实现分为:静态AoP和动态AoP。静态AoP在编译阶段对程序源代码进行修改, 生成了静态的静态AoP代理类, 来实现增强功能的织入;动态AOP在运行阶段对动态生成代理对象(使用JDK动态代理或CGlib动态地生成AoP代理类), 来实现增强功能
2022-01-21 10:10:29 317
原创 Spring基础入门2 - IoC容器
在上文介绍了Spring IoC容器的基本用法,下面做一个稍微复杂点的例子,学习以下Spring的IoC和AoP的“实际”使用。我们假设有一个在线商城OnlineStore, 在线商城需要提供一些银行相关服务。(假设)因为银行服务的实现是容易变化的,后续可能会变更不同的服务提供商(实现),所以在设计上我们需要将银行服务抽象为接口BankingService,这样OnlineStore依赖的是稳定的接口,而不是具体变化的实现, 实现了解耦。package org.littlestar.learning.pa
2022-01-20 10:52:48 229
原创 Spring基础入门1 - IoC容器
1. Spring简介Spring是一个开源, 一站式的, 轻量级的Java企业应用开发框架。Spring框架是一个企业应用开发框架, 简单来说就是开发服务器端应用的框架;Spring是轻量级的框架, 与传统的EJB类似, Spring框架也是采用容器来管理应用对象(Bean), 但是从大小与开销两方面而言Spring都是轻量的, 完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布;Spring是一站式(full-stack)的框架, Spring非常全面, 无缝整合了各种优秀开源
2022-01-20 09:55:35 291
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人