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>
View Code

 

 

四:新建文件 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 ------");
    }
}
View Code

 

五:部署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());
            }
        });
    }
}
View Code

 

 

六,运行测试

 

 

 

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

 

 
posted @ 2021-07-14 14:47  Foto_CShow  阅读(849)  评论(0编辑  收藏  举报