为什么是 SpringBoot
因为目前开发 WEB 应用,Spring Boot 是启动 Spring 项目最快最流行的方式了。无论我们要构建一个什么样的应用,它都可以让我们尽可能快的启动运行起来。前期基本上无需配置啥东西,而且内置应用服务器,让我们两三下就可以搞一个 生产级别应用出来,这对于 Java 程序员来说,只能用俩字来形容了,那就是幸福!
SpringBoot 和 Spring 的关系
可能因为 SpringBoot 实在是太惊艳了,网上有很多言论可能对很多小伙伴造成了一些误解。这里我列举几个,看看你中了没?
SpringBoot不是应用服务器;
之所以有这个误解,是因为 SpringBoot 可以将Web应用程序打包成可执行的 jar 文件,不用部署到我们传统的Java应用服务器就可以运行。这是因为 SpringBoot 内置了一个Servlet容器(Tomcat、Jetty等),所以这个功能并不是 SpringBoot 本身的而是内嵌的 Servlet容器提供的。
SpringBoot 没有实现 JPA 或者 JMS(Java消息服务)等企业级 Java 规范。
只不过是自动配置了支持这些特性的 Bean,比如自动配置了 Hibernate ,这些都是之前已经有的技术,并不是SpringBoot新实现的;
SpringBoot 就是 Spring,它做了那些没有它我们也会自己去做的 Spring Bean 配置。它利用的是 Spring4 的条件化配置特性,以及 Maven 和 Gradle 提供的传递依赖。
Spring Boot 相比于 Spring 主要包含了以下四个核心功能:
自动配置;
起步依赖:告诉 Spring Boot 需要什么功能,它就能引入需要的库。
命令行界面:这个可以让我们无须构建项目只写代码就可以完成完整的应用程序;
Actuator:应用监测和监控;
搞清楚了 Spring Boot 其实就是一种开发 Spring 应用程序的快捷方式,那接下来,让我们一起来感受疾风吧,看看它到底有多便捷。
创建 SpringBoot 应用
这里先说一下,本文我使用的 Spring Boot
版本是 2.5.2
,要求你本地安装的 JDK 至少是 1.8 或者更高的版本,Spring Boot 2.x 以上的版本最低要求就是 JDK 1.8
了。官方推荐的版本目前是 jdk8 和 jdk11,因为这俩版本目前是长期维护的。构建打包工具 Gradle 4+ or Maven 3.2+
,最后就是宇宙最强 IDE,IntellJ IDEA,没有之一。
既然是入门,我们今天就以 Spring5 开始支持的响应式编程为例,让大家感受下使用 Spring Boot 是如何开发响应式项目的。
打开 https://start.spring.io/, 选择语言和构建工具以及依赖项,点击如下图所示;
点击 Generate 下载;
解压下载的压缩包,进入到项目根目录,然后使用 IDEA 打开 pom.xml
;
需要注意的是,上面一步,需要先设置 pom.xml
的默认打开应用程序为 IDEA
,或者你可以选择 File
--> New
--> Project from Existing Sources...
然后选择 pom.xml
效果也是一样的,如下图所示。
打开后,刷新 Maven 依赖(第一次会有点慢,耐心等待),我们就可以得到下图项目结构了;
访问数据库
Spring Boot 无缝集成了 关系型数据库 和 NOSQL 数据库 。并且 Spring Boot 也提供了响应式的数据库访问支持。
那我们如果想使用 Spring Boot 访问数据库,都需要做什么呢?稳住,你可能会震惊的。
下面给大家看下我写的响应式编程数据库访问的测试代码,为了不依赖任何环境,让大家可以快速、直观的感受,我使用的是内存数据库 h2。
@SpringBootApplication
public class Springroad01Application {public static void main(String[] args) {SpringApplication.run(Springroad01Application.class, args);}}
// 测试数据库访问,容器启动后会执行run方法
@Component
class DataWriter implements ApplicationRunner {private Logger log = LoggerFactory.getLogger(DataWriter.class);private DatabaseClient client;private UsersDao usersDao;public DataWriter(DatabaseClient client, UsersDao usersDao) {this.client = client;this.usersDao = usersDao;}@Overridepublic void run(ApplicationArguments args) {List statements = Arrays.asList("DROP TABLE IF EXISTS USERS;","CREATE TABLE IF NOT EXISTS USERS ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL);");statements.forEach(sql -> client.sql(sql).fetch().rowsUpdated().doOnSuccess(count -> log.info("Schema created, rows updated: {}", count)).doOnError(error -> log.error("got error : {}",error.getMessage(),error)).subscribe());Flux.just("sevenluo","tonyzhu","jameschen").flatMap(name -> usersDao.save(new Users(null,name))).subscribe(user -> log.info("User saved: {}",user));}
}
// DAO 接口,不需要加注解,继承了 ReactiveCrudRepository 会自动生成实例的
interface UsersDao extends ReactiveCrudRepository {
}@Data
@AllArgsConstructor
@NoArgsConstructor
class Users {@Idprivate Integer id;private String name;}
就是这么赤鸡,结束了,啥配置没有,直接写了几行代码就可以访问数据库了。
REST 接口开发
你应该还关心 Spring Boot 如何开发一个 REST 风格的 WEB 接口吧?别慌,我们直接用 Spring 支持的响应式编程来搞一个 REST 应用服务。但是对于 WEB 访问用户来说是看不出来我们使用了非阻塞的响应式编程的,来一手润物细无声。
温馨提示,在 mac 上安装 jq,直接使用 brew install jq
就会自动帮你安装好了。
好了,打完手工,没啥搞头,Spring Boot 永远滴神!
监控和管理应用
我们的应用上线后,那肯定都是要上监控的,不然哪一天神不知鬼不觉死翘翘了,麻烦就大了。这个 Spring Boot 它就天生带了可以替我们监控和管理的 Spring 应用的模块工具:spring-boot-actuator
。
像什么 健康检查、审计、统计和HTTP追踪等该有的它都有。值得一提的是 spring-boot-actuator
它还很 open ,支持与其它外部监控系统做整合。补充了它自身没有一些好看的仪表盘、图表、分析、告警等 酷炫吊炸天的能力。
那怎么玩呢?
确认你的应用添加了对应的模块依赖;
假如你使用的 maven,那看你的 pom.xml
中下面的依赖:
org.springframework.bootspring-boot-starter-actuator
那如果你使用的 gradle,对应的 build.gradle
文件中有下面的依赖:
dependencies {compile("org.springframework.boot:spring-boot-starter-actuator")
}
Actuator 通过 endpoint
来暴露 HTTP 请求 来监控和管理应用;
应用启动后,http://localhost:8080/actuator
会展示出所有通过 HTTP 暴露的 endpoint。
因为太长了,我这里列出的只是一部分 endpoint,你自己一定要动手试下。
就比如,/health
这个 endpoint,提供了关于应用健康的基础信息。
/metrics
endpoint 展示了几个非常有用的度量信息,比如 JVM内存使用情况、系统 CPU 使用情况、打开的文件等等。
/loggers
endpoint 展示了应用的日志和可以让你在运行时改变日志等级。
还有好多,下去都自己玩玩,动手就会了。
友情提示,如果你的 http://localhost:8080/actuator
展示的 开放端点很少,那是因为 actuator
的 endpoint
可以显式的被打开和关闭,明白了吧!
默认情况下很多 endpoint 是被关闭掉了,你只需要在 application.properties 配置文件中增加如下配置即可。
management.endpoint.health.show-details=always //显示详细的健康信息
management.endpoints.web.exposure.include=* //粗暴的全部打开,反正自己玩,任性
这里我们就不多说这些 endpoint
每个的作用了, 如果你感兴趣,可以给我留言,我会根据大家需求看下是否在出一期教程详细介绍一下。
当然除了上面默认显示的应用健康信息,我们也可以自定义一个健康指标;
我们可以选择实现 HealthIndicator
接口来实现我们的目标;
@SpringBootApplication
public class Springroad01Application {// 加上这个Bean就可以了@BeanHealthIndicator healthIndicator() {return () -> Health.up().withDetail("app", "i am so good").withDetail("error","开什么玩笑,老夫怎么可能有错!").build();}@BeanRouterFunction routes (UsersDao usersDao) {return RouterFunctions.route(GET("/users"),serverRequest -> ok().body(usersDao.findAll(),Users.class));}public static void main(String[] args) {SpringApplication.run(Springroad01Application.class, args);}}
一旦你加上我们上面自定义的健康指标,重启应用,就会看到 health
这个 endpoint 将展示出我们增加的这些信息:
安全控制
对于应用安全的支持,那就绕不开 Spring Security
了。
它可以轻松完成应用的鉴权、授权功能,同时也提供了对响应式编程的支持。
接下来就展示下如果让你的应用快速带上安全套。
org.springframework.bootspring-boot-starter-security
@Bean
// 内存中配置用户名、密码为 admin/admin,用户角色为 USER
MapReactiveUserDetailsService users() {return new MapReactiveUserDetailsService(User.withUsername("admin").password(PasswordEncoderFactories.createDelegatingPasswordEncoder().encode("admin")).roles("USER").build());
}
直接访问,提示 401 错误,这个错误码应该了然于心了吧。没错就是没有权限的意思。
加上用户名、密码我们再试试:
curl -vu admin:admin http://localhost:8080/actuator/health | jq
加上用户名和密码令人期待的结果就返回了,是不是瞬间心情大好呢。
上面我们仅仅是引入了 Spring-Security 包,然后加了两三行代码,没有写任何的拦截器验证逻辑,我们的应用就具备了安全验证功能,这也太 啊妹子ing 了吧。
江湖再见
此章节我们就完成了 Spring-Boot 的入门开发介绍。
用10分钟完成了包含 创建应用、访问数据库、REST接口开发、监控和管理、安全控制 的开发。
章节中并没有对具体的技术细节做讲解,比如 Demo 中使用响应式编程、Spring Boot Actuator 端点的详细讲解等。
仅仅是为了让小伙伴们了解到 Spring Boot 的强大和便利,感受下 Spring 对我们程序员的友好。
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️