2019年5月

几个月没有更新博客了,之前,大佬陆陆续续将项目需求拿过来,内容涵盖有点大,目标用户群也是比较大,最终另选了一套工具来进行开发——Vert.X。
好处嘛:

①全异步模式,在分布式环境和集群环境的网络IO比较慢的情况下,可以达到比较好的性能,提高并发性能;
②支持多语言开发,研发团队是半路转到互联网开发的,C\C++、Python、Java、Go……都有会的,唯一都会的C\C++做WEB开发,不是一般的麻烦,毕竟像JAVA发展了多年的互联网开发,积累了不少的东西,一旦用起来很舒服,比如这个vertx;
③对分布式和集群的支持非常好;

为了学习和使用,自己搞一个小项目NAS,用于管理本站的一些文件,最终达成将本站所有内容用这个项目替代(至于能否实现得看有没有足够的空余时间)。废话不多说,开搞:
1、首先需要创建vertx对象,用于启动vertx的整个核心逻辑,通常在Main函数中;

package com.igtsys;

import com.igtsys.verticle.WebVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.dns.AddressResolverOptions;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;

public class Launcher {
    private static final Logger LOG = LoggerFactory.getLogger(Launcher.class); //启动器的日志类,备用
    
    public static void main(String[] args) {//主函数
        Vertx.clusteredVertx(new VertxOptions()//创建集群型Vertx
            .setWorkerPoolSize(20)//配置有多少个Worker线程,Worker线程用于跑一些阻塞费时型任务
            .setBlockedThreadCheckInterval(1000000)//配置检测event bus线程的检查间隔,避免在调试时出现一堆超时警告;
            .setAddressResolverOptions(new AddressResolverOptions()
                .addServer("172.18.8.1").addServer("172.18.8.2")//配置本地DNS服务器
                .addServer("61.139.2.69").addServer("202.98.96.68")), res -> {//回调函数
            if (res.succeeded()) {//创建成功后,运行WebVerticle
                res.result().deployVerticle(WebVerticle.class, new DeploymentOptions().setInstances(1));//WebVerticle中需要做端口监听,一个Verticle就够了,所以设置实例个数为1
            } else {
            }
        });
    }
}

2、创建WebVerticle,用于处理web简单业务

package com.igtsys.verticle;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.core.net.JksOptions;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.ext.web.handler.CookieHandler;
import io.vertx.ext.web.handler.StaticHandler;


public class WebVerticle extends AbstractVerticle {
    private static final Logger LOG = LoggerFactory.getLogger(WebVerticle.class);
    
    private HttpServer https_server;
    private HttpServer http_server;

    @Override
    public void start() throws Exception {
        http_server = vertx.createHttpServer(new HttpServerOptions()
                                                .setHost("0.0.0.0")
                                                .setPort(80));
        http_server.requestHandler(res->{
            String url = res.absoluteURI();
            url = url.replaceFirst("http", "https");
            res.response().setStatusCode(301).putHeader("Location", url).end();
        });
        http_server.listen();
        //=====================================================================
        HttpServerOptions cfg_http_server = new HttpServerOptions()
                .setHost("0.0.0.0")
                .setPort(443)
                .setSsl(true)
                .setKeyStoreOptions(new JksOptions()
                        .setPath("server-keystore.jks")
                        .setPassword("secret"));
        
        https_server = vertx.createHttpServer(cfg_http_server);
        Router router = Router.router(vertx);

        router.route().handler(BodyHandler.create())
                      .handler(CookieHandler.create());
        router.route().handler(StaticHandler.create()
                                .setWebRoot("./webroot")
                                .setDefaultContentEncoding("UTF-8"));
        
        https_server.requestHandler(router);
        https_server.listen(res->{
            if (res.succeeded()) {
                
            } else {
                
            }
        });
    }

    @Override
    public void stop() throws Exception {
        https_server.close();
        http_server.close();
    }

}