关于Vertx的介绍在官方文档可以查看 https://vertx-china.github.io/docs/。网上也有许多介绍,这里就直接上项目。

一:使用idea搭建gradle项目。添加相关vertx包。

二:定义消息传递协议

这里就使用json字符串传递消息,定义mId为区分消息的标识.

上传参数
{
"mId": 101
}

返回信息也是json,mId区分消息,code标识状态

{
"mId": 101,
"code": 200
}

三:加入日志文件

日志打印使用slg4j,在gradle文件中已经加上了,还需要个xml文件。新建文件log4j2.xml文件在resources文件夹下

<configuration status="info">
<properties>
<property name="LOG_HOME">logs</property>
<property name="FILE_NAME">success-info</property>
<property name="ERROR_NAME">error-info</property>
</properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- ThresholdFilter相当于拦截器.info以上的命令不会被拦截. -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<pattern>
%highlight{[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n}
</pattern>
</PatternLayout>
</Console> <RollingFile name="Error" fileName="${LOG_HOME}/${ERROR_NAME}.log"
filePattern="${LOG_HOME}/${ERROR_NAME}-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss.SSS} %-5level %class.%M() %L - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="300MB"/>
</Policies>
</RollingFile> <RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class.%M() %L - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="300MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="Error" />
</root> <Logger name="self" level="info" additivity="false">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="Error"/>
</Logger>
</loggers>
</configuration>

四:新建文件 HttpServerVerticle

package com.webser.verticle;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.IOException;
import java.util.concurrent.TimeUnit; public class HttpServerVerticle extends AbstractVerticle {
private final Logger logger = LoggerFactory.getLogger(HttpServerVerticle.class);
private HttpServer httpServer; @Override
public void start(Promise<Void> startPromise) throws Exception {
HttpServerOptions options = new HttpServerOptions()
.setIdleTimeout(10000)
.setIdleTimeoutUnit(TimeUnit.MILLISECONDS)
.setTcpKeepAlive(true); httpServer = vertx.createHttpServer(options);
httpServer.exceptionHandler( it -> {
if(it instanceof IOException){
logger.error("\n ---network io error:"+it.getMessage());
return;
}
logger.error("\n ---net error:"+it.getMessage());
}); httpServer.requestHandler(req -> {
HttpServerResponse resp = req.response().setStatusCode(200);
resp.putHeader("content-type", "application/json");
resp.putHeader("connection", "Keep-Alive"); JsonObject js = new JsonObject().put("ke","demos");
resp.end(js.encode());
}); httpServer.listen(8888,"127.0.0.1",res -> {
if (res.succeeded()) {
startPromise.complete();
logger.info("HTTP server started on port 8888");
} else {
startPromise.fail(res.cause());
logger.error(res.cause().getMessage());
}
});
} @Override
public void stop(){
httpServer.close();
logger.error(" AppLogin Server stop ------");
}
}

五:部署verticle。在OnlineServer主函数中部署新建的httpserververticle文件。

package com.webser;

import com.webser.verticle.HttpServerVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class OnlineServer {
private static final Logger logger = LoggerFactory.getLogger(OnlineServer.class); public static void main(String[] args){
VertxOptions vertxOptions = new VertxOptions();
Vertx vertx = Vertx.vertx(vertxOptions); //部署http服务器
vertx.deployVerticle(HttpServerVerticle.class.getName(),
new DeploymentOptions().setInstances(VertxOptions.DEFAULT_EVENT_LOOP_POOL_SIZE), res -> {
if(res.succeeded()){
logger.warn("服务端部署成功----");
}else {
logger.error("服务端部署失败---" + res.cause());
}
});
}
}

六,运行测试

项目github地址:https://github.com/fotocj007/VertxWebApi

 

Vertx 实现webapi实战项目(一)的更多相关文章

  1. C# WebApi+Task+WebSocket实战项目演练(四)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  2. ASP.NET WebAPI数据传输安全HTTPS实战项目演练

    一.课程介绍 HTTPS是互联网 Web 大势所趋,各大网站都已陆续部署了 HTTPS .  全站HTTPS时代,加密用户与网站间的交互访问,在客户端浏览器和Web服务器之间建立安全加密通道,一般情况 ...

  3. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

    前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...

  4. .NET WebApi 实战第五讲之EntityFramework事务

    在<.NET WebApi 实战第二讲>中我们有提到过事务的概念!任何数据库的读操作可以没有事务,但是写事件必须有事务,如果一个后端工程师在数据库写入时未添加事务,那就不是一个合格的工程师 ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  7. Linux系统实战项目——sudo日志审计

    Linux系统实战项目——sudo日志审计   由于企业内部权限管理启用了sudo权限管理,但是还是有一定的风险因素,毕竟运维.开发等各个人员技术水平.操作习惯都不相同,也会因一时失误造成误操作,从而 ...

  8. android经典实战项目视频教程下载

    注:这是一篇转载的文章,原文具体链接地址找不到了,将原文分享如下,希望能对看到的朋友有所帮助! 最近在学习android应用方面的技术,自己在网上搜集了一些实战项目的资料,感觉挺好的,发布出来跟大伙分 ...

  9. 前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍

    webpack的一点介绍 Webpack 把任何一个文件都看成一个模块,模块间可以互相依赖(require or import),webpack 的功能是把相互依赖的文件打包在一起.webpack 本 ...

  10. vue+websocket+express+mongodb实战项目(实时聊天)

    继上一个项目用vuejs仿网易云音乐(实现听歌以及搜索功能)后,发现上一个项目单纯用vue的model管理十分混乱,然后我去看了看vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜 ...

随机推荐

  1. 原子指令,自旋锁,CAS

    原子指令,自旋锁,CAS 问题 我们先看一下这段代码: /* * badcnt.c - An improperly synchronized counter program */ /* $begin ...

  2. BUUCTF---RSA3(共模攻击)

    1.题目 RSA已知e1,e2,c1,c2 2.知识 共模攻击使用相同N作为加密的模数,如果监听者获知了c1,c2的密文,那么监听者便不需要d1,d2即可解出明文m 3.解题 按照思路编写代码解题 点 ...

  3. 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)

    上两篇文章<探秘MySQL索引底层原理,解锁数据库优化的关键密码(上)>和<探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(中)>主要讲了MySQL索引的底层原理,且 ...

  4. GSLibrary平台本地搭建(windows)

    一.安装配置数据库 https://dev.mysql.com/downloads/windows/installer/5.7.html 创建GSLibrary数据库 mysql -uroot -p ...

  5. CF1930G Prefix Max Set Counting 题解

    题意: 给定一棵以 1 为根的有根树,求出其所有 dfs 序中前缀最大值序列的数量.\(n\le 10^6\). 思路 显然考虑 DP. 由于是求前缀最大值序列的方案数,因此如果一些点要出现在这个序列 ...

  6. vue3 基础-样式绑定语法

    本篇讲 vue 通过数据去进行 dom 样式的绑定操作, 主要分为 字符串, 数组, 对象等方式, 这个非常好理解, 凭着我们朴素的情感就能一步领悟到位的, 就还是演示一段吧. 字符 & 数组 ...

  7. codeup之C语言10.10

    Description 给定字符串定义char *a = "I love China!",读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串. Inp ...

  8. IDEA如何增加界面对比度

    这个问题困扰大家许久了应该,今天就让我来终结吧! 背景的对比度虽然没法直接修改,但是我们可以直接改背景色进而达到修改对比度的效果! Editor--color Scheme--general--Tex ...

  9. AI到底给我们带来什么?

    AI 如火如荼,尤其是最近半年,发展的速度超出想象.DeepSeek的出现,对于整个世界AI 界带来深渊影响. AI是当前"技术找技术"的极致产物, 它大幅提升了流程效率,但没有带 ...

  10. CF1992E Novice's Mistake

    CF1992E Novice's Mistake 同步于个人博客. Problem Noobish_Monk 有 \(n\in [1,100]\) 个朋友.每个朋友都给了他 \(a\in [1,100 ...