Vertx 实现webapi实战项目(一)
关于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