首页 > 编程学习 > Vert.x - SpringBoot 整合 vertx

Vert.x - SpringBoot 整合 vertx

发布时间:2022/11/24 23:22:52

在这里插入图片描述

一、vertx

前面的文章讲解了 vertx 的简介及 vertx-web 的路由,看过的小伙伴应该对 vertx 有了一定的了解,从前面的演示来看,都是单独使用的 vertx ,对于目前的后端来说 SpringBoot 可是一个非常火热的框架,那如果将 vertx 嵌入 SpringBoot 中不是符合我们的开发习惯了。对于 SpringBoot 来说引入 vertx 就是引入一个普通的组件,并没有什么特别之处。

但是有一个非常坑的地方,就是 vertx 4.1.x 版本和SpringBoot 2.3.x 版本的整合在一起,在做文件上传时会一直卡住,当时笔者对此问题也是没有什么头绪,自己默默折腾了两天才发现,vertx 4.1.x 和 SpringBoot 2.2.X 版本整合在一起是 OK 的,而 SpringBoot 2.3.X 的需要整合 vertx.4.2.X 版本的就不会有问题了。希望后面的小伙伴不要踩坑!

下面是上篇文章的地址:

https://blog.csdn.net/qq_43692950/article/details/124073457

下面是我个人在 SpringBoot 中 引入 vertx 的处理过程。

二、SpringBoot 整合 vertx

首先新建一个 SpringBoot 项目,注意不要引入其他 web 框架。在 pom 中引入依赖,注意这里我使用的是 vertx 4.1.8 版本的,对应SpringBoot 2.2.X 。这里我的 SpringBoot 版本是 2.2.6 。

<dependency><groupId>io.vertx</groupId><artifactId>vertx-core</artifactId><version>4.1.8</version>
</dependency><dependency><groupId>io.vertx</groupId><artifactId>vertx-web</artifactId><version>4.1.8</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version>
</dependency>

下面编写 vertx 的配置类,主要声明 vertx 对象及 Router对象,对于具体的路由接口,我是放在 Verticle 中进行声明,直接使用 SpringgetBeansOfType 根据 AbstractVerticle获取所有的 Verticle 进行初始化,其中跨域、全局异常捕获、及拦截我也在该类中进行了声明:

@Slf4j
@Configuration
public class VertxConfig {@AutowiredEnvironment environment;@Beanpublic Vertx vertx() {VertxOptions options = new VertxOptions().setEventLoopPoolSize(20).setWorkerPoolSize(20);return Vertx.vertx(options);}@Beanpublic Router router(Vertx vertx) {Router router = Router.router(vertx);globalIntercept(router);globalError(router);cors(router);return router;}private Integer port() {return environment.getProperty("server.port", Integer.class, 8080);}@Beanpublic HttpServer httpServer(Vertx vertx, Router router, ApplicationContext applicationContext) {//获取所有子类Map<String, AbstractVerticle> beansOfType = applicationContext.getBeansOfType(AbstractVerticle.class);beansOfType.forEach((k, verticle) -> {vertx.deployVerticle(verticle);});return vertx.createHttpServer().requestHandler(router).listen(port(), "0.0.0.0", res -> {if (res.succeeded()) {log.info("vert.x success to listen: " + port());} else {log.info("vert.x fail:" + res.cause().getMessage());}});}//跨域处理private void cors(Router router) {router.route().handler(CorsHandler.create().addOrigin("*").allowedHeader(" x-www-form-urlencoded, Content-Type,x-requested-with").allowedMethod(HttpMethod.GET).allowedMethod(HttpMethod.POST).allowedMethod(HttpMethod.PUT).allowedMethod(HttpMethod.DELETE));}//全局异常返回private void globalError(Router router) {router.route().failureHandler(ctx -> {ctx.response().end(JSONObject.toJSONString(ResultDTO.err(ctx.failure().getMessage())));});}//全局拦截器private void globalIntercept(Router router) {router.route("/*").handler(ctx -> {ctx.response().putHeader("Content-Type", "application/json");ctx.next();});}
}

下面我又编写了一个 BaseVerticle 继承 AbstractVerticle,只是起到一个模板的作用,在该类中我就引入了一个 Router 对象,也可以做其他公共的逻辑写在这里面:

@Component
public abstract class BaseVerticle extends AbstractVerticle {@Autowiredpublic Router router;
}

下面就可以根据业务逻辑编写不同的 Verticle 了,如:

@Component
public class TestVerticle extends BaseVerticle {@Overridepublic void start() throws Exception {router.get("/getTest").handler(this::getTest);router.get("/err").handler(this::err);}private void getTest(RoutingContext ctx) {ctx.response().end(JSONObject.toJSONString(ResultDTO.ok()));}private void err(RoutingContext ctx) {int a = 1/0;}
}

下面贴出公共的返回对象:

@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class ResultDTO {private Integer code;private String message;private Object data;public static ResultDTO ok() {return new ResultDTO(200, "success", null);}public static ResultDTO err(String message) {return new ResultDTO(400, message, null);}
}

到这基本就已经整合 OK 了,启动 SpringBoot 项目,可以看到成功的日志:
在这里插入图片描述
使用PostMan访问接口:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!


本文链接:https://www.ngui.cc/zz/1443306.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000