Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求

个人博客网:https://wushaopei.github.io/    (你想要这里多有)

一、创建SpringBoot工程

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第1张图片

二、 Vertx 实现http服务器、路由器的使用

1.  用vertx实现http服务器

添加依赖:

工程的创建可以创建两种 :

第一种:Gradle方式

第二种: Maven方式

以上两种vertx都支持:

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第2张图片

java代码:


public class Demo1 {

    //用vertx实现http服务器
    public static void main(String[] args){

        //vertx核心
        Vertx vertx = Vertx.vertx();

        //创建http的server
        HttpServer httpServer = vertx.createHttpServer();
        //服务器响应
        httpServer.requestHandler(request -> {
            request.response().end("Hello Itheima!");
        });

        httpServer.listen(8080);
    }
}

这里使用IDE本身自带的测试工具进行测试:

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第3张图片

测试结果:

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第4张图片

2. 自定义请求头数据

添加响应依赖:

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第5张图片

java代码:

public class Demo2 {

    public static void main(String [] args){


        Vertx vertx = Vertx.vertx();

        //web路由器
        Router router = Router.router(vertx);

        //接口地址为“/”
        router.route("/").handler(context -> {
            context.request();
            context.response().end("hello root!");
        });

        //接口地址为 “/abc”
        router.route("/abc").handler((RoutingContext context) ->{
            HttpServerRequest request = context.request();
            String name = request.getParam("name");
            String itheima = request.getHeader("itheima");

            context.response().end("hello abc!"+ name+ " " + itheima);
        });


        HttpServer httpServer = vertx.createHttpServer();
        //处理request(监听请求的接口地址)
        httpServer.requestHandler(router::accept);
        //监听请求的端口
        httpServer.listen(8080);
    }
}

httpServer 指定请求的handler,由路由器进行监听请求,在httpServer声明监听的端口号。当“/”时,路由到第一个handler请求,响应 hello root ; 当“/abc”时,路由到第二个router,响应itheima。

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第6张图片

测试中 指定响应头参数:

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第7张图片

当请求为 itheima 时,自动根据已设定好的headers的Name/value,进行value的响应。

3. Vertx应用的 get 、post请求

public class Demo3 {

    public static void main(String [] args){

        Vertx vertx = Vertx.vertx();

        //Web路由器
        Router router = Router.router(vertx);
        //get请求
        router.get("/get").handler(context -> {
           context.response().end("hello get!");
        });
        //post请求
        router.post("/post").handler(context -> {
           context.response().end("hello post!");
        });

        HttpServer httpServer = vertx.createHttpServer();
        //处理request
        httpServer.requestHandler(router::accept);
        httpServer.listen(8080);
    }
}

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第8张图片

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第9张图片

4 、 请求接口的同步、 异步处理请求


public class Demo4 {

    public static void main(String [] args){

        Vertx vertx = Vertx.vertx();

        //Web路由器
        Router router = Router.router(vertx);
        router.get("/sync").handler(context -> {
           //同步处理请求
           context.response().end("hello get!");
            System.err.println("sync: " + Thread.currentThread());
        });
        router.get("/async").blockingHandler(context -> {
           //异步处理请求
            //执行耗时操作
            //数据库访问
            //服务访问
           context.response().end("hello *!");
            System.err.println("async: " + Thread.currentThread());
        });

        HttpServer httpServer = vertx.createHttpServer();
        //处理request
        httpServer.requestHandler(router::accept);
        httpServer.listen(8080);

    }

}

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第10张图片

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第11张图片

5.对用户的请求解析时间(测试给定的请求量时vertx处理所消耗的时间)


public class Demo5 {

    public static void main(String[] args) {

        Vertx vertx = Vertx.vertx();

        //web路由器
        Router router = Router.router(vertx);
        router.get("/vertx").blockingHandler(context -> {

            long start = System.currentTimeMillis();
            Pi.computePi(20000);
            long end = System.currentTimeMillis();

            //同步处理请求
            context.response().end("hello" + (end - start));

        });

        HttpServer httpServer = vertx.createHttpServer();
        httpServer.requestHandler(router::accept);
        httpServer.listen(8080);
    }
}

 

对应的PI:


public class Pi {

    private static final BigDecimal FOUR = BigDecimal.valueOf(4);
    private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN;

    public static BigDecimal computePi(int digits){
        int scale = digits + 5;
        BigDecimal arctan1_5 = arctan(5,scale);
        BigDecimal arctan1_239 = arctan(239,scale);
        BigDecimal pi = arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);
        return pi.setScale(digits,BigDecimal.ROUND_HALF_UP);

    }

    private static BigDecimal arctan(int inverseX, int scale) {

        BigDecimal result, numer, term;
        BigDecimal invX = BigDecimal.valueOf(inverseX);
        BigDecimal invx2 = BigDecimal.valueOf(inverseX * inverseX);
        numer = BigDecimal.ONE.divide(invX,scale,roundingMode);
        result = numer;
        int i =1;
        do{
            numer = numer.divide(invx2,scale,roundingMode);
            int denom = 2 * i + 1;
            term = numer.divide(BigDecimal.valueOf(denom),scale,roundingMode);
            if((i % 2) != 0){
                result = result.subtract(term);
            }else {
                result = result.add(term);
            }
            i++;
        }while (term.compareTo(BigDecimal.ZERO) != 0);
        return result;
    }
}

Vertx 框架 基于SpringBoot使用 (一) Web路由器与同步、异步处理请求_第12张图片

代码地址:

链接:https://pan.baidu.com/s/1SWkSqCxLrg-FD4UZqlhwSg
提取码:3vgj
 

你可能感兴趣的:(vertx)