Springboot从实验到生产

原创 2018年04月17日 10:26:40

(一) 背书

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理。在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian Colyer回应了这些批评,并且特别提到该平台将来的目标之一就是实现免XML配置的开发体验。Boot所实现的功能超出了这个任务的描述,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。在对外公开的beta版本刚刚发布之时,Boot描述了如何使用该框架在140个字符内实现可运行的web应用,从而获得了极大的关注度,该样例发表在tweet上。

然而,Spring Boot并不是要成为Spring IO平台里面众多“Foundation”层项目的替代者。Spring Boot的目标不在于为已解决的问题域提供新的解决方案,而是为平台带来另一种开发体验,从而简化对这些已有技术的使用。对于已经熟悉Spring生态系统的开发人员来说,Boot是一个很理想的选择,不过对于采用Spring技术的新人来说,Boot提供一种更简洁的方式来使用这些技术。

官方文档

(二) spring boot 初体验

搭建springboot 项目

  1. 2步操作
    • pom.xml 文档如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
  • 简单的class 文件:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}

如你所看,以上两步,基本的springboot项目搭建完成
启动springboot
- 直接运行 Application
- mvn clean package –> java -jar demo-01-1.0-SNAPSHOT.jar
- mvn spring-boot:run

==注意== main 函数的定义,springboot 会自动扫描main函数 来启动
如果程序定义了多个main 函数。那么会启动失败,怎么解决呢?
指定启动的main-class

启动日志如下:

2017-11-22 14:16:03.128 INFO 1410 — [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-11-22 14:16:03.135 INFO 1410 — [ main] com.willian.springboot.Application : Started Application in 2.345 seconds (JVM running for 4.837)

说明启动成功,默认的端口号 8080 ,访问链接 http://localhost:8080

  1. 编写controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

@RequestMapping(value = "/")
public String index(){
return "hello world";
}
}

再次访问 http://localhost:8080

hello world

值得注意的,controller 所属的包必须 位于 Application 同级目录
否则无法扫描到你所定义的controller
3. 修改springboot 默认配置
springboot的启动端口号是默认的 8080, 我们可以通过 application.yml 文件配置自定义的端口号

server:
port: 8081

启动 访问 http://localhost:8081

  1. 配置拦截器
    在Application.java 中
@Configuration
static class WebMvcConfigurer extends WebMvcConfigurerAdapter {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
request.getContextPath();
logger.info("[==================拦截器==================]");
return true;
}
}).addPathPatterns("/*");
}
}

重启,再次访问: http://localhost:8081

  1. logback 文件配置

spring boot 默认使用 logback 来配置日志 ,引入 logback.xml 文件
配置信息如下

<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2010-2011 The myBatis Team
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<configuration>
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!--<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />-->

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/Users/willian/data/logs/springboot-001/" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/springboot.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<!--<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
&lt;!&ndash; 最大64MB 超过最大值,会重新建一个文件&ndash;&gt;
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>-->
</appender>

<!--myibatis log configure-->
<logger name="org.springframework.web" level="INFO"/>
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>

<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
&lt;!&ndash;日志异步到数据库 &ndash;&gt;
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
&lt;!&ndash;连接池 &ndash;&gt;
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender>-->
</configuration>

重启,再次访问 http://localhost:8081 , 进入 /Users/willian/data/logs 即可看到log 内容。

logback 按天滚动日志,日志默认是记录在 以当前日期为后缀的文件中,而我们的线上的 log 脚本,默认读取的是 不带日期后缀的 log文件。 会造成读取不到。 等等问题

  1. log4j2 配置

修改 pom

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>

新增 依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j2 配置文件如下 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</Console>
<!-- 按日期每天生成log文件 -->
<RollingFile name="RollingFile" fileName="/Users/willian/data/logs/log4j2/springboot-01.log"
filePattern="/Users/willian/data/logs/log4j2/springboot-01.log-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>

<!-- log文件只打印error级别信息 -->
<!-- <Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>-->
</RollingFile>
</Appenders>
<Loggers>
<!-- 输出info级别信息 -->
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>

(三) springboot 使用thymeleaf模板

1.引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在 resources 下创建 templates 目录,用于防止 html 页面,static 用于防止 静态资源文件,具体的使用参考 Spring Boot学习记录–thymeleaf模板

(四) springboot session 共享

  1. 引入依赖
<!--session 共享-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
  1. 配置yaml 文件
spring:
thymeleaf:
cache: false
redis:
sentinel:
nodes: sentinel1.position.mds.host:26379,sentinel2.position.mds.host:26379,sentinel3.position.mds.host:26379
master: mds-main-redis-shard02
database: 7
timeout: 5000
session:
store-type: redis

原文链接

springboot 生产环境与开发环境配置

通过修改yml文件里的active属性,prod(生产环境) 与 dev (开发环境)
  • e891377
  • e891377
  • 2017-05-16 09:29:31
  • 1018

Spring Boot之分离测试和生产环境的应用配置

多环境应用配置将默认不变的配置,设置在application.properties文件中。新建开发环境下的属性文件application-dev.properties,将开发中的配置,设置在该文件中。...
  • u011726984
  • u011726984
  • 2017-11-14 13:43:45
  • 1857

SpringBoot(六)开发环境/测试环境和生产环境

SpringMVC中的profile使用在SpringMVC中,如果要用到环境自动切换,可以借助profile来实现,例如:XML配置中: ...
  • wu6660563
  • wu6660563
  • 2017-01-19 14:42:59
  • 5370

SPRINGBOOT中如何进行开发环境和生产环境的配置?

最近需要频繁的进行产品发布,更改配置文件实在过于复杂,改来改去,改到最后自己都忘记了。SPRINGBOOT能不能同时支持两个配置文件呢?答案是可以的:首先,我们要建立三个配置文件,一个名为applic...
  • Paul_Huang_2011
  • Paul_Huang_2011
  • 2018-04-09 09:29:47
  • 13

Spring Boot 监控和管理生产环境

spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。审计(Auditing)、 健康(health)、数...
  • u010892841
  • u010892841
  • 2017-05-09 12:41:50
  • 820

Spring Boot 生产准备-基于HTTP的监控

生产准备-基于HTTP的监控更多干货spring-boot系列一 之restfull api与多环境配置springboot系列二之 日志SpringBoot系列三之 MVC 模版引擎SpringBo...
  • qq_27384769
  • qq_27384769
  • 2018-01-12 07:48:01
  • 233

springboot从入门到精通 一步一步走向成功之路

  • 2018年03月26日 14:27
  • 105KB
  • 下载

springboot 生产环境部署脚本

springboot 生产环境部署脚本 注意事项 1.去除不需要的 jar 开发工具jar:spring-boot-devtools 2.监控一定要做好权限控制或者去除 ...
  • qq_27384769
  • qq_27384769
  • 2018-01-14 20:28:13
  • 343

springboot从入门到精通视频教程及项目实战

  • 2018年03月19日 12:42
  • 64B
  • 下载

Spring Boot 教程(五)-- 生产环境运维支持

本篇博客是看了别人的博客然后根据自己的理解整理了出来的笔记,发出来大家交流学习,如果有不足的地方请大家指正,大家也可以直接去源博客那里看,源博客写的真的很好 。 源博客地址:http://www...
  • zengys21
  • zengys21
  • 2016-04-05 17:56:23
  • 6683
收藏助手
不良信息举报
您举报文章:Springboot从实验到生产
举报原因:
原因补充:

(最多只允许输入30个字)