分类 开发 下的文章

几个月没有更新博客了,之前,大佬陆陆续续将项目需求拿过来,内容涵盖有点大,目标用户群也是比较大,最终另选了一套工具来进行开发——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();
    }

}

因需项目对并发要求比较高、提高Tomcat效率、使用tomcat apr模式。在Spring boot中内嵌的Tomcat默认启动开启的是NIO模式,这里如果我们要在linux内核的系统上使用APR模式,那么需要安装一些lib库

1)openssl,需要版本大于1.0.2,如果不使用https openssl也可以不安装,就是在启动的时候会报openssl的错误,直接忽视就可以了;
2)apr,可以去官网下载1.6.X最新版进行下载http://apr.apache.org/download.cgiapr-util,在同一个页面进行下载,最新版本为1.6.X版本tomcat-native,在tomcat中自带了安装包,可以在tomcat的bin目录下找到tomcat-native.tar;

具体安装步骤这里省略,网上一搜即可。

网上大部分讲解配置tomcat apr的文章,都只是讲了如何在独立tomcat服务上如何配置apr,只需要修改server.xml中的connnector 的protocol就可以了,对于spring boot会稍微复杂些,需要增加一个apr配置类在启动的时候修改Embed的tomcat connector网络接入协议。

import org.apache.catalina.core.AprLifecycleListener;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AprConnecter {
    @Bean
    public TomcatServletWebServerFactory servletContainer(){
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.setProtocol("org.apache.coyote.http11.Http11AprProtocol");
        tomcat.addContextLifecycleListeners(new AprLifecycleListener());
        return tomcat;
    }
}

启动成功后会发现日志输出,或者在eclipse调试模式下发现已启用APR。
1.PNG