一、开发环境的准备
开发环境的准备主要涉及三个方面:JDK、Maven、Spring Tools 4 for Eclipse
1、JDK
JDK的版本用1.8即可,具体安装请看这篇文章
2、Maven
Maven是用于项目构建的,具体安装请看 这篇文章
3、Spring Tools 4 to Eclipse
Spring Tools 4是一个Spring开发的IDE工具,具体安装请看 这篇文章
关于lombok插件的安装,采用lombok来简化 get、set方法,安装请看 这篇文章
二、Spring Boot 入门
Spring Cloud基于Spring Boot搭建的,Spring Boot开发的优点:
基于Spring开发web应用更加容易
采用基于注解方式的配置,避免了编写大量重复的XML配置
可以轻松集成Spring家族的其他框架,比如Spring JDBC、Spring Data等
提供嵌入式服务器,令开发和部署变得非常方便
三、搭建Spring Boot项目
在Spring tool4中依次选择Filte–>New—>Maven Project,然后在出现的界面中按下图所示增加相关信息
Spring Boot依赖配置
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
Spring Boot启动类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
启动类使用了@SpringBootApplication注解,这个注解表示该类是一个Spring Boot应用,直接运行App类即可启动,启动成功后在控制台输出信息,默认端口是8080
四、编写一个REST接口
REST接口
@RestController是@Controller和@ResponseBody的组合注解,可以直接返回Json格式数据。@GetMapping是@RequestMapping(method=RequestMethod.GET)
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
端口号可以在application.properties可以设置端口号,默认端口号是8080,也可以在application.properties设置 server.port=8014
五、读取配置文件
Spring Boot中的配置是放在application.properties中,读取配置信息非常方便,总共分为3种方式
1、Environment:可以通过Environment的getProperty方法来获取想要的配置信息
@RestController
public class HelloController {
@Autowired
private Environment env;
@GetMapping("/hello")
public String hello() {
String str = env.getProperty("server.port");
return str;
}
}
2、@Value : 可以注入具体的配置信息
@RestController
public class HelloController {
@Autowired
private Environment env;
@Value("${server.port}")
private String port;
@GetMapping("/hello")
public String hello() {
String str = env.getProperty("server.port");
return str + " - " + port;
}
}
3、自定义配置类 : prefix定义配置的前缀
这里想要在pom.xml引入如下依赖
org.springframework.boot
spring-boot-configuration-processor
true
@ConfigurationProperties(prefix = “com.test”)
@Component
public class MyConfig {
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
执行配置读取
@RestController
public class HelloController {
@Autowired
private Environment env;
@Autowired
private MyConfig myConfig;
@Value("${server.port}")
private String port;
@GetMapping("/hello")
public String hello() {
String str = env.getProperty("server.port");
return str + " - " + port + " - " + myConfig.getPassword();
}
}
在定义配置文件中 application.properties 的方法如下
六、profiles多环境配置
在Spring Boot中可以通过spring.profiles.active=dev 来激活不同环境下的配置,可以定义多个配置文件,每个配置文件对应的一个环境,格式为application-环境.properties
在开发环境中,可以通过修改application.properties中spring.profiles.active的值来激活对应环境的配置,在部署的时候可以通过 java-jar xxx.jar --spring.profiles.active=dev来指定使用对应的配置。
七、热部署
热部署通过spring-boot-devtools就可以实现,在添加spring-boot-devtools的依赖即可实现热部署功能
八、actuator监控
Spring Boot提供了一个用于监控和管理自身应用信息的模块(spring-boot-starter-actuator)
在pom.xml文件中添加相应的依赖包
可以通过下面的这些Actuator模块提供的端点信息,可以获取很多监控信息
PS:spring boot自带的健康指示器
比如访问http://localhost:8014/actuator 可以看到当前actuator模块下所有的监控类型请求
同时也可以设置权限控制,用于访问actuator模块的请求,想要通过用户登录认证之后才能调用,要在配置文件application.properties,在pom.xml文件中引入spring-boot-starter-security
up表示当前应用处于健康状态,如果是down就表示当前应用不健康,可以增加配置来查看健康信息的详情,在application.properties中
#配置可以显示监控的健康详细信息
management.endpoint.health.show-details=ALWAYS
也可以配置端点的暴露,大部分都是默认不暴露的,可以通过这个手动配置来实现要暴露的端点
#配置暴露部分端点,用逗号分隔,如果要全部暴露,则似乎用 *
management.endpoints.web.exposure.include=*
九、自定义actuator端点
1、在对应用的健康状态增加一些其他维度的数据,可以通过继承AbstractHealthIndicator来实现自己的业务逻辑
@Component
public class UserHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Builder builder) throws Exception {
builder.withDetail("status", false);
}
}
通过up方法指定应用的状态为健康,down方法指定应用的状态为不健康,withDetail方法用于添加一些详细信息,访问http://localhost:8014/actuator/health,可以看到自定义的健康状态的详细信息
2、自定义全新的端点很简单,通过@Endpoint注解就可以实现
@Component
@Endpoint(id=“user”)
public class UserEndpoint {
@ReadOperation
public List
}
执行http://localhost:8014/actuator/user,可以获取如下执行结果
十、统一异常处理
1、自定义统一的异常处理类,其中的ResponeseData是自定义的返回格式的实体类,其发生错误时也会捕获到,然后封装好返回格式
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value=Exception.class)
@ResponseBody
public ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception{
log.error("", e);
ResponseData r = new ResponseData();
r.setMessage(e.getMessage());
if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
r.setCode(404);
} else {
r.setCode(500);
}
r.setData(null);
r.setStatus(false);
return r;
}
}
2、需要在Spring Boot的配置文件中添加异常处理配置
在使用调用不存在的接口时候,返回的参数
十一、异步执行
1、传统多线程使用方式
2、@Async使用方式
想要啊简单的方式来执行异步操作,只需要一个@Async注解即可,在Controller中调用这个业务方法,会在默认的线程池中去执行,注意一定要在外部的类中去调用这个方法,如果在本类调用则不起作用,比如
this.saveLog(),最后在启动类上开启异步任务的执行,添加@EnableAsync
@Component //把普通pojo实例化到spring容器中
public class UserAsync {
@Async
public void saveLog() {
System.err.println(Thread.currentThread().getName());
}
}
3、自定义线程池
先配置线程池参数配置类
然后再重新定义线程池的配置,配置完之后需要配置文件中配置线程池的大小等信息,默认的配置是
#配置线程池的大小
spring.task.pool.maxPoolSize=100
关于线程池配置的拒绝策略,当线程池数量高于线程池的处理速度时,任务会被缓存到本地的队列中,队列是有小的,如果超过了这个大小,就需要拒绝的策略,不然就会出现内存溢出,目前支持的两种拒绝策略:
1)、AbortPolicy : 直接抛出java.util.concurrent.RejectedExceutionException异常
2)、CallerRunsPolicy : 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,这样可以有效降低向线程池内添加任务的速度。
PS:建议使用CallerRunsPolicy策略,因为队列中的任务满了之后,如果直接抛出异常,那么这个任务就会被丢弃;如果是CallerRunsPolicy策略,则会用主线程去执行,也就是同步执行,这样操作最起码任务不会被丢弃。
十二、随机端口
编写一个启动参数设置类
通过对启动参数进行遍历判断,如果有指定的启动端口,后续就不自动生成了,如果没有指定,则可以通过ServerPortUtils获取一个可以使用的端口,如果设置到环境变量中,在application.properties中通过下面的方式来获取端口
#端口号设定
server.port=${server.port}
获取可用端口的代码
获取可用的端口的主要逻辑是指定一个范围,然后生成随机数字,通过NetUtils检查端口是否可用,如果获取到可用的端口则直接返回,没有获取到可用的端口则执行回调逻辑,重新获取,检测端口是否可用主要是用socket来判断这个端口是否可用被链接