SpringBoot详细研究-04部署测试与监控
这部分的内容实际就是devops的主要工作内容,当然一名合格的程序要也需要掌握这部分的知识。
- 热部署
简单来说,在开发时,修改了任何的代码,IDE将自动编译运行及发布;在发布时,当前发布不影响线上服务的正常进行。
模板热部署:比如Thymeleaf,配置spring.thymeleaf.cache=false即可,那么页面随时更新。
开发热部署: Spring Loaded,在vm arg中添加 –javaagent: E:xxx.jar -noverify; JRebel,热部署最佳工具,但是是收费的,不嗨森;spring-boot-devtools,最赞方案,只需添加到pom.xml即可。
- 常规部署
jar形式: mvn package, java –jar xx.jar, 通过在pom.xml中修改plugin配置即可。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
在linux的/etc/systemd/system/目录中新建cm-bootweb.service文件
[Unit]
Description=cm-bootweb
After=syslog.target
[Service]
ExecStart= /usr/bin/java –jar /var/apps/cm-bootweb-0.0.1.jar
[Install]
WantedBy=multi-user.target
启动服务: systemctl start cm-bootweb
停止服务: systemctl stop cm-bootweb
服务状态: systemctl status cm-bootweb
开机启动: systemctl enable cm-bootweb
项目日志: systemctl -u cm-bootweb
war形式:将生成的war放在合适的servlet容器上运行即可。
- 云部署(最帅选择)
主要的Paas平台都支持Docker镜像发布,通过编写Dockerfile来编译镜像,Dockerfile的指令如下表所示。
指令 |
阐述 |
---|---|
FROM |
指明当前镜像继承的基镜像,编译时会自动下载,如FROM Ubuntu |
MAINTAINER |
指明镜像作者, MAINRAINER xionger |
RUN |
可以在当前镜像上执行linux命令形成新的层,RUN /bin/bash –c "echo helloworld" |
CMD |
指明启动镜像容器的默认行为, CMD echo "this is my first docker project" |
EXPOSE |
指明镜像运行时的容器必须监听的端口 |
ENV |
设置环境变量, ENV name=xionger |
ADD |
将当前工作目录的文件复制到镜像目录, ADD test.txt /mydir/ |
ENTRYPOINT |
让容器相同一个可执行程序一样运行,这样镜像运行时可以像软件一样接受参数执行 ENTRYPOINT ["/bin/echo"] docker run –d image_name "this is a rebirth" |
安装docker, yum install docker, 启动运行, systemctl start docker
将jar包放在/var/apps/cm-bootweb目录,并将Dockerfile也放在该目录,文件内容为
FORM java:8
MAINTAINER xionger
ADD cm-bootweb-0.0.1.jar app.jar
EXPOSE 8083
ENTRYPOINT ["java", "-jar","/app.jar"]
之后编译镜像:docker build –t cm-bootweb . (.表示当前路径,cm-bootweb为镜像名称)
运行: docker run –d --name bootweb -p 8083:8083 cm-bootweb
这部分需要好好思考下,就是linux环境中是必须安装好java,maven等环境,还是直接打好jar包,直接发布。
Spring boot提供了运行时的应用监控和管理功能,可以通过http,jmx,ssh协议来操作,可以自动得到审计、健康及指标信息,常见的端点名如下。
端点名 |
描述 |
---|---|
actuator |
所有EndPoint列表,需加入spring HATEOAS支持 |
autoconfig |
当前应用的所有自动配置 |
beans |
当前应用中所有bean的信息 |
configprops |
当前应用中所有的配置属性 |
dump |
当前应用线程状态信息 |
env |
当前应用环境信息 |
health |
当前应用健康状况 |
info |
当前应用信息 |
metrics |
当前应用的各项指标信息 |
mappings |
显示所有@RequestMapping映射的路径 |
shutdown |
关闭当前应用(默认关闭) |
trace |
显示跟踪信息(默认最新http请求) |
通过http监控spring boot项目非常简单,只需添加如下依赖即可,之后访问对应项目即可(如果添加了安全,需要对应的actuator角色)。
1 <dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-starter-actuator</artifactId>
4 </dependency>
5 <dependency>
6 <groupId>org.springframework.hateoas</groupId>
7 <artifactId>spring-hateoas</artifactId>
8 </dependency>
Tip:
通过该网站可以获取maven配置,http://mvnrepository.com/artifact/org.springframework.hateoas/spring-hateoas
定制端点:修改端点id,endpoints.beans.id=mybeans;关闭端点,endpoints.beans.enabled=false;定制端点访问路径management.context-path=/manage;定制访问端口management.port=8080, -1关闭。
自定义端点:通过继承AbstractEndpoint类并实现ApplicationContextAware接口,创建自定义的端点类并注册到spring即可。
自定义HealthIndicator: 常见的Indicator包括datasource, jms, diskspace, redis等。
jconsole来实现JMX监控,在cmd输入jconsole命令,然后选择项目,查看MBean中的org.springframework.boot中的Endpoint即可。
SSH监控,需要添加spring-boot-starter-remote-shell依赖,然后访问2000端口即可,常见命令包括help, metrics等,可以在配置文件中加入shell.auth.simple.user.name/password,此外还可以通过Groovy来编制命令,有机会试试。
测试:springboot在创建时会自动加上spring-boot-starter-test依赖,因此测试变得非常简单,只需在测试类上添加@RunWith(SpringRunner.class)和@SpringBootTest注解即可。
参考资料
- 汪云飞. Spring Boot实战[M]. 北京:电子工业出版社, 2016.
- 如何从微信公众平台上下载关注用户(备份微信关注用户)
- 使用hive客户端java api读写hive集群上的信息
- 大数据算法设计模式(1) - topN spark实现
- redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)
- thrift例子:python客户端/java服务端
- springboot与thrift集成实现服务端和客户端
- 调用{dede:likewords}为dedecms添加相关搜索词
- 重新调整Keras中长短期记忆网络的输入数据
- Linux内存(手动释放cache)
- django中间件Middleware
- springboot kafka集成(实现producer和consumer)
- 分布式锁的实现(redis)
- springboot scheduled并发配置
- RabbitMQ高可用集群配置
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- WifiDisplay(Miracast)技术原理及实现
- Java常用设计模式--观察者模式(Observer Pattern)
- Java常用设计模式--适配器模式(Adapter Pattern)
- Java常用设计模式--装饰器模式(Decorator Pattern)
- Java常用设计模式-单例模式(Singleton Pattern)
- Java常用设计模式--三种工厂模式之简单工厂模式(Simple Factory)
- Java常用设计模式--三种工厂模式之工厂模式(Factory Pattern)
- Java常用设计模式--三种工厂模式之抽象工厂模式(Abstract Factory Pattern)
- Mongodb只读副本集如何切换到读写模式
- Java常用设计模式--策略模式(Strategy Pattern)
- Mongodb只读副本集如何切换到读写模式(下)
- 手把手带你搭建redis集群
- Jvm常量池、运行时常量池、字符串常量池理解
- 【Docker】命令使用大全
- Apache如何设置Enable Keep-Alive