Springboot 启动脚本

Springboot项目可以直接通过

java -jar xxx.jar

命令启动,但是开启关闭还是有个脚本会比较方便。自己写了个shell脚本,功能是查找当前目录下的jar文件,然后启动,也可以关闭,重启。经过几次修改,个人觉得比较完美了,放出源码:

#! /bin/bash
# springboot的jar放同级目录下即可,只能有一个jar文件
export PATH=$JAVA_HOME/bin:$PATH
CURRENT_PATH=$(cd "$(dirname "$0")"; pwd)
JAR=$(find $CURRENT_PATH -maxdepth 1 -name "*.jar")
PID=$(ps -ef | grep $JAR | grep -v grep | awk '{ print $2 }')

case "$1" in
    start)
        if [ ! -z "$PID" ]; then
            echo "$JAR 已经启动,进程号: $PID"
        else
            echo -n -e "启动 $JAR ... \n"
            cd $CURRENT_PATH
        nohup java -jar $JAR >/dev/null 2>&1 &
            if [ "$?"="0" ]; then
                echo "启动完成,请查看日志确保成功"
            else
                echo "启动失败"
            fi
        fi
        ;;
    stop)
        if [ -z "$PID" ]; then
            echo "$JAR 没有在运行,无需关闭"
        else
            echo "关闭 $JAR ..."
              kill -9 $PID
            if [ "$?"="0" ]; then
                echo "服务已关闭"
            else
                echo "服务关闭失败"
            fi
        fi
        ;;
    restart)
        ${0} stop
        ${0} start
        ;;
    kill)
        echo "强制关闭 $JAR"
        killall $JAR
        if [ "$?"="0" ]; then
            echo "成功"
        else
            echo "失败"
        fi
        ;;
    status)
        if [ ! -z "$PID" ]; then
            echo "$JAR 正在运行"
        else
            echo "$JAR 未在运行"
        fi
        ;;
  *)
    echo "Usage: ./springboot {start|stop|restart|status|kill}" >&2
        exit 1
esac

脚本会找到当前目录下的jar文件,所以,只能放一个jar文件。

开机启动脚本:

[Unit]
Description=Dubbo-admin
Wants=network.target
[Service]
Environment=JAVA_HOME=/usr/local/jdk1.8.0_171
Type=forking
ExecStart=/usr/local/xxx/springboot start
ExecStop=/usr/local/xxx/springboot stop
[Install]
WantedBy=multi-user.target

使用Logstash同步mysql到Elasticsearch 6.0.1

Logstash是一个数据收集管道,配置输入输出,可将数据从一个地方传到另一个地方。同步mysql到Elasticsearch,这里的输入,指的是mysql,输出就是Elasticsearch。

新版本的Logstash和Elasticsearch跟之前老版本的有些不同,所以我也是自己折腾了小半天,总算成功。

下面的操作,Logstash和Elasticsearch的版本都是6.0.1


  1. 下载安装 Logstash和Elasticsearch就不介绍了,下载后解压即可使用。
    默认Logstash不包含读取数据库的jdbc插件,需要手动下载。进入Logstash的bin目录,执行:

    ./logstash-plugin install logstash-input-jdbc
    

    因为网络原因,安装可能费点时间。

  2. 在某处建一个目录,放置配置文件(哪不重要,因为执行时会配置路径),我这放到bin下的mysql目录里。

  3. 复制mysql jdbc驱动(mysql-connector-java-5.1.35.jar)到该目录下
  4. 编写导出数据的sql,放到sql.sql(文件名自己取)里,内容类似这样:

    select *, id as car_id 
    from violation_car car 
    where car.gmt_modified>= :sql_last_value
    

    这里需要介绍下,我的表里有个gmt_modified字段,用于记录该条记录的最后修改时间,sql_last_value是Logstash查询后,保存的上次查询时间,第一次查询时,该值是1970/1/1,所以第一次导入,如果你的表现有数据很多,可能会有点问题,后面会根据最后修改时间,更新修改过的数据。

  5. 编写输入输出配置文件jdbc.conf

    input {
      jdbc {
        jdbc_driver_library => "/xxx/xxx/logstash-6.0.1/bin/mysql/mysql-connector-java-5.1.35.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/violation"
        jdbc_user => "root"
        jdbc_password => ""
        schedule => "* * * * *"
        jdbc_default_timezone => "Asia/Shanghai"
        statement_filepath => "/xxx/xxx/logstash-6.0.1/bin/mysql/sql.sql"
        use_column_value  => false
        last_run_metadata_path => "/xxx/xxx/logstash-6.0.1/bin/mysql/last_run.txt"
      }
    }
    output {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "violation"
            document_id => "%{car_id}"
            document_type => "car"
        }
        stdout {
            codec => json_lines
        }
    }
    

    字段介绍:

    input.jdbc.jdbc_driver_library  jdbc驱动的位置
    input.jdbc.jdbc_driver_class    驱动类名
    input.jdbc.jdbc_connection_string   数据库连接字符串
    input.jdbc.jdbc_user    用户名
    input.jdbc.jdbc_password  密码
    input.jdbc.schedule   更新计划(参考linux crontab)
    input.jdbc.jdbc_default_timezone   时区,默认没有时区,日志里时间差8小时,中国需要用Asia/Shanghai
    input.jdbc.statement_filepath 导出数据的sql文件,就是上面写的
    input.jdbc.use_column_value  如果是true,sql_last_value是tracking_column指定字段的数字值,false就是时间,默认是false
    input.jdbc.last_run_metadata_path  保存sql_last_value值文件的位置
    output.elasticsearch.hosts elasticsearch服务器,填多个,请求会负载均衡。
    output.elasticsearch.index 索引名
    output.elasticsearch.document_id   生成文件的id,这里使用sql产生的car_id
    output.elasticsearch.document_type  文档类型 
    output.stdout 配置的是命令行输出,使用json
    
  6. 配置完以后,启动
    ./logstash -f mysql/jdbc.conf
    

    按上面的配置,logstash会每分钟查询一次表,看是否会更新,有更新则提交到Elasticsearch

Java读取RSA pem公钥 使用公钥验证签名

之所以要记录是因为网上找了好久,试了好多方法,基本上都不好使.
签名sign做了base64

        BASE64Decoder base64decoder = new BASE64Decoder();
    try {
        //读取pem证书
        BufferedReader br = new BufferedReader(new FileReader("xxx.pem"));
        String s = br.readLine();
        StringBuffer publickey = new StringBuffer();
        while (s.charAt(0) != '-') {
            publickey.append(s + "\r");
            s = br.readLine();
        }
        byte[] keybyte = base64decoder.decodeBuffer(publickey.toString());
        KeyFactory kf = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keybyte);
        PublicKey publicKey = kf.generatePublic(keySpec);
        BASE64Encoder bse=new BASE64Encoder();
        System.out.println("pk:"+bse.encode(publicKey.getEncoded()));

        //被签的原文
        String toSign="sxxxsasdsss";
        //生成的签名
        String sign="xxxxx";

        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initVerify(publicKey);
        signature.update(toSign.getBytes());
        boolean verify = signature.verify(base64decoder
            .decodeBuffer(
                sign));
        System.out.println(verify);
    } catch (Exception e) {
        e.printStackTrace();
    }

Springboot 禁用数据库自动配置

如果我们用SpringBoot实现一个简单的微服务,不需要数据库,你会发现在写完代码启动时会报

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties'

之类的错误。这是因为SpringBoot默认会自动配置数据库,如果业务不需要,就要手动禁用数据库自动配置,在Application的SpringBootApplication注解里加上

@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})

Spring boot+mybatis+druid+SQL监控配置

之前写过一篇搭建Spring boot + mybatis + freemarker项目,Spring boot默认的数据库连接池是tomcat-jdbc,今天我们要用druid替换它。

什么是druid

druid是阿里巴巴开源的数据库连接池,自称是Java语言中最好的数据库连接池,提供强大的监控和扩展功能。

Continue reading ‘Spring boot+mybatis+druid+SQL监控配置’ »

Spring boot 注册Servlet和Filter

使用Spring开发web程序,在大部分情况下,都是通过Spring默认的DispatcherServlet,转发请求到Controller,我们在Controller里处理请求。但有时候,可能有些请求我们不希望通过Spring,而是通过其他Servlet处理。如果是普通的Spring项目,注册Filter和Servlet只需在web.xml时添加filter、filter-mapping、servlet、servlet-mapping,但Spring boot项目里没有web.xml。

Spring boot有两种方法注册Servlet和Filter:代码注册、注解注册。
Continue reading ‘Spring boot 注册Servlet和Filter’ »