项目第一步,配置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相关推荐

  1. 路由器java灯一直闪_java – Vertx的路由器问题

    早上好, 我从Vertx for java开始,我想创建路由示例,所以我复制过去的行,但似乎在Router.router(顶点)中出现了问题: The type io.vertx.rxjava.cor ...

  2. 【java】vertx从入门到放弃——入门(四)Codec

    什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以 ...

  3. vertx web连接超时 阻塞_Flink之基于Vertx的Mysql异步IO

    导读 在流计算中,如果以事件流为主,关联一些维度信息,就需要根据每个事件中的关键信息去数据库执行一次查询.正常的思路可能是通过mapFunction以阻塞的方式查询数据库,等待数据结果返回,然后执行下 ...

  4. vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...

    vertx rest 跨域 我是Vert.x的新手,但作为Java开发人员(辛勤工作),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途. 因此,我正在使用Ver ...

  5. 在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头

    我是Vert.x的新手,但是作为Java开发人员(非常努力),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途. 因此,我正在使用Vert.x实现一个非常简单的R ...

  6. Vertx学习一:这玩意是到底是个啥

    Vertx,融合Java.Ruby.Python等语言的高性能架构,架构师必读 原文链接: http://www.360doc.com/content/18/0203/14/39530679_7274 ...

  7. Vert.x(vertx) 创建HTTP服务

    Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件.笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上, ...

  8. Vert.x(vertx) 连接MySQL、Oracle数据库

    Vert.x提供异步访问数据库的API,可能这里有朋友会有疑惑,直接使用我们之前的熟悉的Mybatis或者Hibernate不行吗,可行,但数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程, ...

  9. Vert.x(vertx) 认证和授权详解(包含认证和授权在Web系统中的使用)

    每个线上系统几乎都是离不开认证和授权的,Vert.x提供了灵活.简单.便捷的认证和授权的支持.Vert.x抽象出了两个核心的认证和授权的接口,一个是AuthProvider,另一个是User.通过这两 ...

  10. Vertx DNS解析源码

    最近在生产环境碰到过多次域名解析失败的问题,有时候还是客户windowns环境报障,是时候深入了解下Vertx内部的域名解析机制了. 1.Vertx使用DNS方法 import java.util.A ...

最新文章

  1. python内置数据结构教程_python课程第二周 内置数据结构——列表和元组
  2. ITK:将高斯噪声添加到特定图像
  3. CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)
  4. vs unity shader插件_一些Shader资料
  5. join和group by能一块用吗_冷冻一下地球能缓解温室效应吗?| No.171
  6. 天正电气t20电气设定在哪_天正电气CAD布置烟感火灾探测器步骤教程
  7. 前端知识点整理(三)不定时更新~
  8. linux之自己总结学习linux的资源推荐
  9. 嵌入式基础认识2:shell脚本的一些简单语法规则
  10. 广州电子路考视频发布 2014广州电子路考考点
  11. 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
  12. SWUST OJ 480: Locker doors
  13. electron 修改修改应用默认图标
  14. CodeForces-1062E LCA,DFN,RMQ
  15. 谁先量子计算机谁就,G、IBM、中科院,比一比谁先实现量子计算霸权?
  16. Echo的树莓派学习笔记
  17. 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
  18. html页面中引入自签名证书的js web资源出现net::ERR_CERT_AUTHORITY_INVALID
  19. OpenNI2的下载与安装
  20. vue-router实现history模式配置

热门文章

  1. (一)图像检测中的评价指标
  2. Wireguard各主流平台的配置教程
  3. 电子开发工具箱-集成串口、网络等多个功能-E-Tool
  4. 【面经】中邮消费金融大数据开发二面面经
  5. EXCEL中如何取消显示科学计数法
  6. opencv3.4将图像指定区域用另一幅图像覆盖
  7. 8张采用1280*1024计算机,一幅分辨率为1280*1024的8:8:8的RGB彩色图像,其容量大致为...
  8. 线性回归-最小二乘方法代码实现
  9. 【阿里云镜像】配置阿里云 Composer 全量镜像
  10. Ubuntu systemd 禁止服务自启动