java vertx http_springboot-vertx
项目第一步,配置jwt
有三类算法:HS,RS,EC.
两种场景:
场景一: 如果创建token和验证token都在同一个项目中,则可以使用keystore的方式。
见 swak-test项目下的 KeyStoreTes
创建keystore 的方式:
keystore文件可以存放在classpath目录或者文件系统,配置时指定存储的路径。
keystore 加载规则:
classpath 的配置方式:直接放在src/main/resources 目录下,打包时会打进包中。
然后在代码中设置keystore 的名称即可。
文件系统:file:path 这样的配置方式。
场景二: 如果创建token和验证token需要分开使用不同的项目,则可以使用RS和EC的算法。
见 swak-test项目下的RsaTest.java、EcTest.java、RsaReadOnlyTest.java
支持公匙和私匙的配置方式。
创建token则需要配置公匙和私匙。
解密token则只需要配置公匙
keytool -genseckey -keystore D:\keystore.jceks -storetype jceks -storepass secret -keyalg HMacSHA256 -keysize 2048 -alias HS256 -keypass secret
请修改-storepass -keypass 设定的密码,这两个密码需要设置的一致
项目介绍
springboot-vertx 是基于swak 的一个演示项目,主要演示了如下部分:
基本的启动框架
api的配置方式,例如AdminApi、AnnoApi、ParamApi、UserApi。
api权限的校验,简单的权限校验方式,配置方式AppConfiguration 第 48 行代码到第 54 行代码。
参数的传递方式,详细见测试代码 ParamTest.java
返回值的使用方式,详细见测试代码 ParamTest.java
项目如何测试继承AppRunnerTest,详细见测试代码 ParamTest.java
service 的配置 UserServiceImpl
自定义的项目启动
大家都很熟悉springboot的四大特性项目依赖,自动化配置。本人也非常喜欢,但不太喜欢引入过多的start.jar来引入组件。
所以本人对spring做了一些简单的定制。将他的启动属性文件spring.factories 改为 swak.factories.
改变的方法也很简单中有详细的源码:swak-starter。所有我们熟悉的组件都放在 com.swak.config 中来自启动。
AppConfiguration.java -- 项目级别的启动配置
AppRunner.java -- 启动入口,执行main方法
执行注解com.swak.ApplicationBoot所引入的com.swak.selector.AutoConfigurationImportSelector,此类将会执行swak.factories中引入的启动配置。
如果是web环境(依赖的jar有vertx的相关类)则会实例化 ReactiveServerApplicationContext,否则会实例化 AnnotationConfigApplicationContext。
ReactiveServerApplicationContext 实例化之后会启动 ReactiveServer,vertx 开始初始化。
vertx 的启动依赖如下:(swak-vertx)
ReactiveServer -> MainVerticle -> ServiceVerticle(多个) -> HttpVerticle(一个多实例)
如上是简单的解释,后续在完善。
API的配置方式、参数处理、权限校验、返回值处理
通过注解的方式来配置,类似springmvc 的方式.注解只有:PageController、RestController、PostMapping、GetMapping简单明了。
PageController 和 RestController 没有过多的差别,只是说明此Controller是来做展示页面的。
API 中最重要的类是 HandlerAdapter, 将api的path绑定到vertx中的 Router,调用api的method,处理参数,处理返回值等。
响应式HTTP服务器的简单介绍
何为响应式,说白了就是回调,IO处理好之后回调注册的方法。这样线程就不需要等待IO完成才继续执行后续代码.
vertx 被称为java中的node.js,多线程版node.js。
swak是基于vertx做了简单的封装,让我们能像使用springmvc一样使用vertx。
响应式开发并不难,难的是需要弄清楚回调之后的代码在哪个线程中执行。以前我们开发ssm项目时,一个请求对应一个线程,从头走到尾,我们基本上不用理会当前线程是谁,执行是否需要花费很长时间。
我觉得响应式最大的特点是在请求响应这条事务中可以任意(只是比如而已)的切换线程。
例如,本例子中,Controller的执行在netty的eventloop线程中,UserServiceImpl 的执行在 vertx的work线程中。
下面简单解释下这个执行过程。vertx 的关键点其内部的 Eventbus。可以简单的把他想象成为一个map。map 的key是接口类型,value是实现类对象的封装。
Controller 调用 service 时,实际上是发送一个消息到 Eventbus,消息中包含service的接口类型,Eventbus获取相应的实现类对象并在相应线程中执行,将返回值通过Eventbus通过消息的形式返回。
具体参见 InvokerHandler 第 73 行 发送消息代码。
service 对象执行 参见 ServiceVerticle handle 部分
项目中为啥会出现这两类接口
UserService、UserServiceAsync
UserService -- 和我们做ssm时后的service接口一样,用于同步返回,一帮用于jdbc 的操作接口。
UserServiceAsync -- 异步返回版本,这个可以自动生成,但自动生成的代码返回值中的范型无法动态设置,所以现在都手动生成此异步接口。
关于开发响应式系统的一些经验
以前我们开发ssm时喜欢将系统分为三层的开发模式,Controller、service、dao。现在也一样也是三层。不同点在于Controller在eventloop线程中执行,service、dao和之前一样在work线程中执行,service、dao以前怎么开发现在也怎么开发,没变。
Controller 调用 service 通过异步发消息的方式来调用。
Controller 的 代码
@RestController(path = "/api/user", value = "userApi")
public class UserApi {
@VertxReferer
private UserServiceAsync userService;
/**
* 获取用户
*
* @param subject
* @return
*/
@GetMapping("/get")
public CompletableFuture get(Subject subject) {
return userService.get(subject.getIdAsLong()).thenApply(res -> Result.success(res));
}
}
service 的代码,和之前一样使用spring声明式事务等。
@VertxService
public class UserServiceImpl implements UserService {
@Override
public User get(Long id) {
return new User().setId(id);
}
}
java的jdbc是同步执行的,spring的事务业务依赖当前线程的,所以不要在service中切换线程。
其他一些io,例如redis,http 客户端,我都是用的基于netty的异步客户端。
相关说明后续补充...
SWAK 项目
java vertx http_springboot-vertx相关推荐
- 路由器java灯一直闪_java – Vertx的路由器问题
早上好, 我从Vertx for java开始,我想创建路由示例,所以我复制过去的行,但似乎在Router.router(顶点)中出现了问题: The type io.vertx.rxjava.cor ...
- 【java】vertx从入门到放弃——入门(四)Codec
什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以 ...
- vertx web连接超时 阻塞_Flink之基于Vertx的Mysql异步IO
导读 在流计算中,如果以事件流为主,关联一些维度信息,就需要根据每个事件中的关键信息去数据库执行一次查询.正常的思路可能是通过mapFunction以阻塞的方式查询数据库,等待数据结果返回,然后执行下 ...
- vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...
vertx rest 跨域 我是Vert.x的新手,但作为Java开发人员(辛勤工作),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途. 因此,我正在使用Ver ...
- 在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头
我是Vert.x的新手,但是作为Java开发人员(非常努力),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途. 因此,我正在使用Vert.x实现一个非常简单的R ...
- Vertx学习一:这玩意是到底是个啥
Vertx,融合Java.Ruby.Python等语言的高性能架构,架构师必读 原文链接: http://www.360doc.com/content/18/0203/14/39530679_7274 ...
- Vert.x(vertx) 创建HTTP服务
Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件.笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上, ...
- Vert.x(vertx) 连接MySQL、Oracle数据库
Vert.x提供异步访问数据库的API,可能这里有朋友会有疑惑,直接使用我们之前的熟悉的Mybatis或者Hibernate不行吗,可行,但数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程, ...
- Vert.x(vertx) 认证和授权详解(包含认证和授权在Web系统中的使用)
每个线上系统几乎都是离不开认证和授权的,Vert.x提供了灵活.简单.便捷的认证和授权的支持.Vert.x抽象出了两个核心的认证和授权的接口,一个是AuthProvider,另一个是User.通过这两 ...
- Vertx DNS解析源码
最近在生产环境碰到过多次域名解析失败的问题,有时候还是客户windowns环境报障,是时候深入了解下Vertx内部的域名解析机制了. 1.Vertx使用DNS方法 import java.util.A ...
最新文章
- python内置数据结构教程_python课程第二周 内置数据结构——列表和元组
- ITK:将高斯噪声添加到特定图像
- CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)
- vs unity shader插件_一些Shader资料
- join和group by能一块用吗_冷冻一下地球能缓解温室效应吗?| No.171
- 天正电气t20电气设定在哪_天正电气CAD布置烟感火灾探测器步骤教程
- 前端知识点整理(三)不定时更新~
- linux之自己总结学习linux的资源推荐
- 嵌入式基础认识2:shell脚本的一些简单语法规则
- 广州电子路考视频发布 2014广州电子路考考点
- 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
- SWUST OJ 480: Locker doors
- electron 修改修改应用默认图标
- CodeForces-1062E LCA,DFN,RMQ
- 谁先量子计算机谁就,G、IBM、中科院,比一比谁先实现量子计算霸权?
- Echo的树莓派学习笔记
- 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
- html页面中引入自签名证书的js web资源出现net::ERR_CERT_AUTHORITY_INVALID
- OpenNI2的下载与安装
- vue-router实现history模式配置
热门文章
- (一)图像检测中的评价指标
- Wireguard各主流平台的配置教程
- 电子开发工具箱-集成串口、网络等多个功能-E-Tool
- 【面经】中邮消费金融大数据开发二面面经
- EXCEL中如何取消显示科学计数法
- opencv3.4将图像指定区域用另一幅图像覆盖
- 8张采用1280*1024计算机,一幅分辨率为1280*1024的8:8:8的RGB彩色图像,其容量大致为...
- 线性回归-最小二乘方法代码实现
- 【阿里云镜像】配置阿里云 Composer 全量镜像
- Ubuntu systemd 禁止服务自启动