• spring boot 从开发到部署上线(简明版)


    我们组有一个优良传统——借鉴于“冰桶挑战赛”的形式,采取点名的方式,促进团队成员每天利用一小段时间,不断的完善团队 wiki 的小游戏。

    但有时候忙于业务,可能会忘记,所以我写了一个小应用,提示大家【记得写 wiki 啦】。

    项目使用的环境和技术选型如下:

    • 服务器环境:centos, java 7
    • 开发环境:window 10,java 7,IDEA
    • 框架:spring-boot 1.5.21.RELEASE

    项目需求

    1. 如果被点名人下午5点还没更新wiki,发送一条企业微信消息,提醒他写wiki
    2. 如果被点名人第二天早上9点还没写,发送一条企业微信消息,提醒他补充,并且要点名。
    3. 如果被点名人第三天早上9点还没写,发送一条企业微信消息给管理员

    设计实现

    分析需求,要实现上面的功能,需要:

    • 爬取网页信息,分析每个人写 wiki 的时间
    • 判断是否完成 wiki
    • 设置定时任务,发送消息给对应的人
    • 需要人员姓名和企业微信账号的映射表

    针对以上功能,spring boot 官方有对应的实现,scheduling-tasksconsuming-rest

    基本的功能点已经明确,然而在实现的过程中还有一些小坑。在文章最后会有补充,这里暂且不表。

    异常与日志

    使用 spring boot 自带的日志 logback,简单的配置如下:

    server.port=8916
    
    logging.level.root=warn
    logging.level.org.springframework.web=ERROR
    logging.level.com.hbgj=warn
    logging.file=logs/happy-wiki.log
    
    

    关于异常,很多地方用 try...catch 进行捕获,感觉有点 low,看后面有没有想法优化一下。

    简单的部署上线

    打包
    在项目的根目录下执行:

    $ mvn clean package
    

    会在 target/ 文件夹下生成 jar 包,假设我们生成的包名为:happy-dog-0.0.1.jar。

    发布到线上
    在项目根目录下打开 shell,输入:

    $ scp target/happy-dog-0.0.1.jar root@192.0.0.1:/home/web/happy-dog-0.0.1.jar
    

    然后输入密码,等待上传结束。

    note:root 是服务器用户名,@192.0.0.1是服务器地址,/home/web/happy-dog-0.0.1.jar 表示 jar 包在服务器上的位置。

    运行项目
    使用 ssh 登录服务器,进入对应的文件夹内,在本项目中,依次执行:

    $ ssh root@192.0.0.1
    
    $ cd /home/web
    

    运行项目有两种方法,一种临时,一种后台。
    方法一:

    $ java -jar happy-dog-0.0.1.jar
    

    这种方式特点是ssh窗口关闭时,程序中止运行。或者是运行时没法切出去执行其他任务。但一般我们想要程序一直在后台运行,所以有方法二:

    $ nohup java -jar happy-dog-0.0.1.jar >/dev/null 2>&1 &
    

    查看和停止
    输入下面的命令,查看 java 运行的进程。

    $ ps -ef | grep java
    

    可以看到我们项目运行的进程 id。

    杀死进程:

    $ kill -9 29382
    

    查看日志

    $ cat logs/happy-wiki.log
    

    一些小坑

    上面提到,我们使用的 java 版本为 java7,在爬取网页时,会出现 Connetion reset 错误,导致无法获取网页信息。

    这是由于 C/S 两端TLS版本不适配导致,具体原因可参考这篇文章CS两端TLS版本不适配导致Connection reset问题

    需要开启 java7 的 TLSv1.2,

      private static RestTemplate restTemplate =  new RestTemplate();
    
      static {
        try {
          // java 7 use TLSv1.2
          SSLContext context = SSLContext.getInstance("TLSv1.2");
          context.init(null, null, null);
    
          CloseableHttpClient httpClient = HttpClientBuilder.create().setSSLContext(context)
              .build();
          HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
          restTemplate = new RestTemplate(factory);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    

    第二,需要判断某天是否是工作日,简单起见,写了个配置文件来记录一年中的节假日。

    引用

    在linux云服务器上运行Jar文件
    linux下如何部署(执行)java jar包,并关闭此jar的进程

  • 相关阅读:
    DOS下读取4GB内存
    开始了
    PHP函数补完:var_export()
    php 调试相关
    css选择符
    javascript的urlencode
    用CSS代码绘制三角形 纯CSS绘制三角形的代码
    Jquery 操作Cookie
    提高PHP编程效率的53种方法
    执行phpinfo();时提示:date_default_timezone_set()
  • 原文地址:https://www.cnblogs.com/fayin/p/11733911.html
Copyright © 2020-2023  润新知