spring boot 从开发到部署上线(简明版)
我们组有一个优良传统——借鉴于“冰桶挑战赛”的形式,采取点名的方式,促进团队成员每天利用一小段时间,不断的完善团队 wiki 的小游戏。
但有时候忙于业务,可能会忘记,所以我写了一个小应用,提示大家【记得写 wiki 啦】。
项目使用的环境和技术选型如下:
- 服务器环境:centos, java 7
- 开发环境:window 10,java 7,IDEA
- 框架:spring-boot 1.5.21.RELEASE
项目需求
- 如果被点名人下午5点还没更新wiki,发送一条企业微信消息,提醒他写wiki
- 如果被点名人第二天早上9点还没写,发送一条企业微信消息,提醒他补充,并且要点名。
- 如果被点名人第三天早上9点还没写,发送一条企业微信消息给管理员
设计实现
分析需求,要实现上面的功能,需要:
- 爬取网页信息,分析每个人写 wiki 的时间
- 判断是否完成 wiki
- 设置定时任务,发送消息给对应的人
- 需要人员姓名和企业微信账号的映射表
针对以上功能,spring boot 官方有对应的实现,scheduling-tasks,consuming-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的进程
spring boot 从开发到部署上线(简明版)的更多相关文章
- spring boot 从开发到部署(二)—重启服务
上篇中,我们开发并部署上线了一个 spring boot 项目.现在需要编写服务重启脚本,保证服务器重启后能够自动的运行我们的项目. /home/web/sprint-web/restart-happ ...
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
- Spring Boot框架开发的Java项目在CentOS7上的部署
需求:上级拿来一份Spring Boot框架开发的Java项目代码让我在服务器上运行起来,只说了一句该框架是自带了Tomcat(不用重新安装Tomcat),一份代码下有两个项目(一个管理端项目,一个用 ...
- (转)Spring Boot(十二):Spring Boot 如何测试打包部署
http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html 有很多网友会时不时的问我, Spring Boot 项目如 ...
- Spring Boot(十二):spring boot如何测试打包部署
Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...
- spring boot(十二)打包部署
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...
- Spring Boot(十二):Spring Boot 如何测试打包部署
有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...
- 10个Spring Boot快速开发的项目,接私活利器(快速、高效)
本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...
- Spring boot+CXF开发WebService
最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...
随机推荐
- 费劲周折的Haskell开发环境搭建过程
大概倒腾了一周才搭建好Haskell的开发环境,遇到了很多莫名其妙的问题. 首先,Haskell实在是够冷门,中文网站上的信息实在有限.仅有的一些安装教程分享都感觉不大靠谱,所以我还是直接去外网找吧. ...
- ElasticSearch之安装及基本操作API
ElasticSearch 是目前非常流行的搜索引擎,对海量数据搜索是非常友好,并且在高并发场景下,也能发挥出稳定,快速特点.也是大数据和索搜服务的开发人员所极力追捧的中间件.虽然 ElasticSe ...
- WebSocket实现Web端即时通信
前言 WebSocket 是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议.目前很多没有使用WebSocket进行客户端服务端实时通信的web应用,大多使用设置规则时间的轮询,或者使用 ...
- elementUI,设置日期,只能选择今天和今天以后的, :picker-options="pickerOptions"
1. html 加 :picker-options="pickerOptions" <el-date-picker v-model="shop.receive_ti ...
- idea 忽略提交文件
https://blog.csdn.net/wangjun5159/article/details/74932433 https://blog.csdn.net/m0_38001814/article ...
- windows环境下基于nginx搭建rtmp服务器
基于nginx搭建rtmp服务器需要引入rtmp模块,引入之后需重新编译nginx linux环境几个命令行就能实现编译,笔者未尝试,网上有很多教程. windows环境还需要安装一系列的编译环境,例 ...
- 4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?
作者:中华石杉 面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当 ...
- centos7 安装 ffmpeg
升级系统 yum install epel-release -yyum update -y 安装Nux Dextop Yum源 由于centos 没有官方软件包,我们可以使用第三方YUM源(Nux D ...
- 可变lambda, lambda使用mutable关键字
关于lambda的捕获和调用 C++ primer上对可变lambda举的例子如下: size_t v1=42; auto f=[v1] () mutable{return ++v1; }; v1=0 ...
- Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互
我有个简单的应用需求: 1. 该应用随时会监听键盘的输入: 2. 当输入指定键时会控制相机录制的启动和关闭. 监听键盘是一个事件循环,相机录制也是一个循环录制的过程.我试着用 Python 启动两个进 ...