SpringBoot是Spring家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程,提供了各种依赖项以简化构建配置,话不多说,让我们一起来看看这些依赖的作用吧
Core
DevTools
spring-boot-devtools 是一个为开发者服务的模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,即热部署。速度比手动停止后再启动快多了,从而提高开发者的开发效率。Idea加入依赖后可能不会马上起作用,解决方式:https://blog.csdn.net/wjc475869/article/details/52442484 这个解决方式不一定适用于所有人,如有问题再自己找解决方式
devtools特性:
属性默认值
SpringBoot进行了大量的自动配置,包括默认启用缓存以提高性能。 一个这样的例子是模板引擎使用的模板的缓存,例如,thymeleaf。 但在开发过程中,尽可能快地查看更改更为重要。
可以使用application.properties文件中的属性spring.thymeleaf.cache = false为thymeleaf禁用缓存的默认行为。 我们不需要手动执行此操作,spring-boot-devtools会自动为我们执行此操作。
自动重启
在典型的应用程序开发环境中,开发人员可以进行一些更改,构建项目并部署/启动应用程序以使新更改生效,或者尝试利用JRebel等。
使用spring-boot-devtools,此过程也是自动化的。 每当文件在类路径中发生变化时,使用spring-boot-devtools的应用程序将导致应用程序重新启动。 此功能的好处是验证所做更改所需的时间大大减少了
实时重载
spring-boot-devtools模块包括一个嵌入式LiveReload服务器,用于在资源更改时触发浏览器刷新。
为了在浏览器中实现这一点,我们需要安装LiveReload插件,其中一个实现是用于Chrome的Remote Live Reload。
全局配置
spring-boot-devtools提供了一种配置未与任何应用程序耦合的全局设置的方法。 此文件名为.spring-boot-devtools.properties,位于$ HOME。
远程调试与更新
spring-boot-devtools通过HTTP提供开箱即用的远程调试功能,要具备此功能,需要将spring-boot-devtools打包为应用程序的一部分。 这可以通过在maven中的插件中禁用excludeDevtools配置来实现。
远程客户端监视应用程序类路径以获取远程重新启动功能所做的更改。 类路径中的任何更改都会导致更新的资源被推送到远程应用程序并触发重新启动。
远程客户端启动并运行时会推送更改,因为只能监视已更改的文件。
Lombok
Lombok 是一种 Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO), 它通过注释实现这一目的。一个标准的Java bean 一般具有若干属性,每个属性具有getter()和setter()方法,Lombok中也用到了注解,但是它并没有用到反射,而是通过一些奇技淫巧,在代码编译时期动态将注解替换为具体的代码。所以JVM实际运行的代码,和我们手动编写的包含了各种工具方法的类相同。
如何使用lombok?以IntelliJ IDEA为例
第一步:添加Lombok IntelliJ插件以对IntelliJ的lombok支持:
查找菜单File > Settings > Plugins
点击Browse repositories...
搜索Lombok Plugin
点击Install plugin
重启 IntelliJ IDEA
第二步:添加maven依赖
第三步:在代码中使用注解,先给个原始POJO的例子
public class EmployeeWithoutLombok {
private StringempId;
private
StringfirstName;
private
Stringlastname;
private
Datedob;
private
StringphoneNo;
public
StringgetEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
public StringgetFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public StringgetLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public DategetDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public StringgetPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
}
使用lombok后:
@Getter
@Setter
public class EmployeeWithLombok {
private StringempId;
private
StringfirstName;
private
Stringlastname;
private
Datedob;
private
StringphoneNo;
// Code required for getter and setter method, not needed to write.
}
怎么样是不是很简洁呢
Configuration Processor
它的作用是能直接在配置文件中读数据
使用方式:
第一步:引入maven依赖
第二步:在spring配置文件,xxx.properties或者xxx.yml中添加自定义配置(这里以yml为例)
test:
name: spring-boot-configuration-processor
第三步:创建一个自定义对象,名字叫什么随意,需要加上注解@ConfigurationProperties(prefix = "test"),这个test,对应着配置文件中的test,而属性name,则对应配置文件中的test下的name。
@ConfigurationProperties(prefix ="test")
public class Test {
private Stringname;
public
Test() {}
public StringgetName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第四步:在任意一个configuration文件中,注册这个对象的bean
@SpringBootApplication
public class TestApplication {
@Bean
public TesttestModel() {
return new Test();
}
}
第五步:直接使用即可
@RestController
public class TestController {
@Autowired
private Testtest;
@GetMapping("/")
public Stringhello() {
return test.getName();
}
}
启动SpringBoot项目访问localhost:8080得到结果:
spring-boot-configuration-processor
Session
一.为什么要spring-session
在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。这里的限制是,session存储在web容器中,被单台服务器容器管理。
但是网站主键演变,分布式应用和集群是趋势(提高性能)。此时用户的请求可能被负载分发至不同的服务器,此时传统的web容器管理用户会话session的方式即行不通。除非集群或者分布式web应用能够共享session,尽管tomcat等支持这样做。但是这样存在以下两点问题:
需要侵入web容器,提高问题的复杂
web容器之间共享session,集群机器之间势必要交互耦合
基于这些,必须提供新的可靠的集群分布式/集群session的解决方案,突破traditional-session单机限制(即web容器session方式,下面简称traditional-session),spring-session应用而生。
二.比较traditional-session方案和spring-session方案
下图展示了traditional-session和spring-session的区别
传统模式中,当request进入web容器,根据reqest获取session时,如果web容器中存在session则返回,如果不存在,web容器则创建一个session。然后返回response时,将sessonId作为response的head一并返回给客户端或者浏览器。
但是上节中说明了traditional-session的局限性在于:单机session。在此限制的相反面,即将session从web容器中抽出来,形成独立的模块,以便分布式应用或者集群都能共享,即能解决。
spring-session的核心思想在于此:将session从web容器中剥离,存储在独立的存储服务器中。目前支持多种形式的session存储器:Redis、Database、MogonDB等。session的管理责任委托给spring-session承担。当request进入web容器,根据request获取session时,由spring-session负责存存储器中获取session,如果存在则返回,如果不存在则创建并持久化至存储器中。
spring-session在无需绑定web容器的情况下提供对集群session的支持。并提供对以下情况的透明集成:
HttpSession:容许替换web容器的HttpSession
WebSocket:使用WebSocket通信时,提供Session的活跃
WebSession:容许以应用中立的方式替换webflux的webSession
Cache
Spring Cache简化了对缓存的操作,通过注解与配置就能轻松读取和更新缓存。常用注解:@Cacheable 和@CachePut
@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。
@Cacheable(value ="unitCarAmount", key ="#unitId")
public long countCarAmountByUnitId(Long unitId) {
return countUnCachedCarAmountByUnitId(unitId);
}
@CachePut注解的作用就是更新缓存,注意要和对应@Cacheable注解上的value和key匹配。
@CachePut(value="unitCarAmount", key ="#unitId")
public long refreshUnitCarAmountCache(Long unitId){
return unitService.countUnCachedCarAmountByUnitId(unitId);
}
Spring Cache支持对redis、Ehcache、内存等多种缓存的操作。
有一种情况可以不加入Spring Cache的依赖,就是用redis缓存,redis自带这种Cache功能,只需要加入redis的依赖即可,加入依赖后不要忘了在启动类加上@EnableCaching注解
org.springframework.boot
spring-boot-starter-data-redis
然后在application.yml中加入redis的配置并新建一个类,类上加@Repository注解,然后注入redis模板,就可以使用Spring Cache了,所有缓存会被存到application.yml配置的redis中
@Autowired
StringRedisTemplatestringRedisTemplate;
@Autowired
RedisTemplateredisTemplate;
详细介绍可以看这篇文章:https://www.cnblogs.com/yueshutong/p/9381540.html
Validation
使用注解提供验证机制,如@NotNull
使用该注解的字段的值不能为null,否则验证无法通过
@Entity
@Data
public class Person {
@Id
@GeneratedValue
private Integerid;
@NotNull(message ="name不能为空")
private Stringname;
private
Integerage;
}
在控制器接受参数时,添加@Valid注解,可以通过BindingResult对象获取相关的错误提示
public String indexUI(@Valid Person person, BindingResult result)
常用注解:
@NotNull使用该注解的字段的值不能为null,否则验证无法通过
@Null 修饰的字段在验证时必须是null,否则验证无法通过
@Size 如下代码表示,修饰的字段长度不能超过5或者低于
@Max 如下代码表示,该字段的最大值为19,否则无法通过验证。
@Min 同理,被该注解修饰的字段的最小值,不能低于某个值。
@AssertFalse该字段值为false时,验证才能通过
@AssertTrue该字段值为true时,验证才能通过。
@DecimalMax 验证小数的最大值
@DecimalMin 验证小数的最小值。
@Digits 验证数字的整数位和小数位的位数是否超过指定的长度
@Future 验证日期是否在当前时间之后,否则无法通过校验
@Past 验证日期是否在当前时间之前,否则无法通过校验
@Pattern 用于验证字段是否与给定的正则相匹配
Retry
spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断。对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。在spring retry中可以指定需要重试的异常类型,并设置每次重试的间隔以及如果重试失败是继续重试还是熔断(停止重试)。
样例代码:
@Retryable(value = SQLDataException.class, backoff = @Backoff(value =0L))
public Stringservice3()throws SQLDataException {
log.info("service3 open");
throw new
SQLDataException();
}
@Recover
public Stringrecover(SQLDataException ne) {
return "SQLDataException recover";
}
常用注解:
@Retryable:注解需要被重试的方法
include 指定处理的异常类。默认为空
exclude指定不需要处理的异常。默认为空
vaue指定要重试的异常。默认为空
maxAttempts 最大重试次数。默认3次
backoff 重试等待策略。默认使用@Backoff注解
@Backoff:重试回退策略(立即重试还是等待一会再重试)
不设置参数时,默认使用FixedBackOffPolicy,重试等待1000ms
只设置delay()属性时,使用FixedBackOffPolicy,重试等待指定的毫秒数
当设置delay()和maxDealy()属性时,重试等待在这两个值之间均态分布
使用delay(),maxDealy()和multiplier()属性时,使用ExponentialBackOffPolicy
当设置multiplier()属性不等于0时,同时也设置了random()属性时,使用ExponentialRandomBackOffPolicy
@Recover: 用于方法。用于@Retryable失败时的“兜底”处理方法。@Recover注释的方法必须要与@Retryable注解的方法“签名”保持一致,第一入参为要重试的异常,其他参数与@Retryable保持一致,返回值也要一样,否则无法执行!
@CircuitBreaker:用于方法,实现熔断模式。
include 指定处理的异常类。默认为空
exclude 指定不需要处理的异常。默认为空
vaue 指定要重试的异常。默认为空
maxAttempts 最大重试次数。默认3次
openTimeout 配置熔断器打开的超时时间,默认5s,当超过openTimeout之后熔断器电路变成半打开状态(只要有一次重试成功,则闭合电路)
resetTimeout 配置熔断器重新闭合的超时时间,默认20s,超过这个时间断路器关
Aspects
简单地概括:Spring AOP
Web
Web
其实就是 SpringMVC,这个太熟悉了吧,不多讲了
Reactive Web
Reactive Web指的是Spring WebFlux。Spring WebFlux是基于响应式流的,因此可以用来建立异步的、非阻塞的、事件驱动的服务。它采用Reactor作为首选的响应式流的实现库,不过也提供了对RxJava的支持。
由于响应式编程的特性,Spring WebFlux和Reactor底层需要支持异步的运行环境,比如Netty和Undertow;也可以运行在支持异步I/O的Servlet 3.1的容器之上,比如Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。
spring-webflux上层支持两种开发模式:
类似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式;
Java 8 lambda 风格的函数式开发模式。
Spring WebFlux也支持响应式的Websocket服务端开发
WebFlux提供了与之前WebMVC相同的一套注解来定义请求的处理,使得Spring使用者迁移到响应式开发方式的过程变得异常轻松。
只需修改少量的代码,就能从命令式的、同步阻塞的(spring-webmvc + servlet + Tomcat)变成了响应式的、异步非阻塞的(spring-webflux + Reactor + Netty)。Netty是一套异步的、事件驱动的网络应用程序框架和工具,能够开发高性能、高可靠性的网络服务器和客户端程序,因此与同样是异步的、事件驱动的响应式编程范式一拍即合。
使用Spring WebFlux,虽然用了异步非阻塞模式但并不一定会让响应时间变短,但一定可以节省服务器资源
Rest Repositories
首先得知道Rest是什么,http://www.ruanyifeng.com/blog/2014/05/restful_api.html 这篇文章中可以找到答案。
REST web服务已成为在web上应用程序集成的首选方式。在其核心中,REST定义了系统由客户端交互的资源组成。这些资源以超媒体驱动的方式实现。Spring MVC为构建这些服务提供了坚实的基础。但是,对于多域对象系统,即使实施REST web服务的最简单原则也可能相当乏味,并且导致大量样板代码。Rest Repositories即Spring Data REST,Spring Data REST构建在Spring Data repositories之上,并自动将其导出为REST资源。它利用超媒体来允许客户端查找存储库暴露的功能,并将这些资源自动集成到相关的超媒体功能中。
Rest Repositories HAL Browser
HAL-browser 是基于hal+json的media type的API浏览器,Spring Data Rest 提供了集成,加入依赖后在浏览器输入http://127.0.0.1:8081/api/v1/browser/index.html#/api/v1就能测试编写好的接口, 这个功能类似于Swagger
HATEOAS
HATEOAS(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。它的重要性在于打破了客户端和服务器之间严格的契约,使得客户端可以更加智能和自适应,而 REST 服务本身的演化和更新也变得更加容易。
即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。比如,当用户向api.example.com发出请求,会得到这样一个文档。
上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址),href表示API的路径,title表示API的标题,type表示返回类型。
Web Services
SpringWeb服务(SpringWS)是SpringCommunity的一个产品,专注于创建文档驱动的Web服务。SpringWeb服务旨在促进契约优先的SOAP服务开发,允许使用多种方法之一来操作XML有效负载,从而创建灵活的Web服务。SpringWS使最佳实践变得简单。
Jersy
Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。尽管相对年轻,它已经是一个产品级的 RESTful service 和 client 框架。
SpringMVC在开发REST应用时,是不支持JSR311/JSR339标准的。如果想要按照标准行事,最常用的实现了这两个标准的框架就是Jersey和CxF了。但是,因为Jersey是最早的实现,也是JSR311参考的主要对象,所以,可以说Jersey就是事实上的标准(类似Hibernate是JPA的事实上的标准),也是现在使用最为广泛的REST开发框架之一。
Websocket
服务器可以将消息实时推送给多个客户端,这个也很常见了,不多说了。
Rest Docs
SpringRest文档的目的是帮助您为RESTful服务生成准确易读的文档。编写好测试代码
编写高质量的文档是困难的。缓解这种困难的一种方法是使用适合工作的工具。为此,Spring Rest文档默认使用asciidoctor。asciidoctor处理纯文本并生成HTML,根据您的需要进行样式和布局。如果愿意,还可以将Spring Rest文档配置为使用降价。
SpringRestDocs使用由SpringMVC的测试框架、SpringWebFlux的WebTestClient或RESTAssured3编写的测试生成的代码片段。这种测试驱动的方法有助于确保服务文档的准确性。如果代码段不正确,则生成代码段的测试将失败。
记录一个RESTful服务主要是描述其资源。每个资源描述的两个关键部分是它使用的HTTP请求和它生成的HTTP响应的详细信息。Spring REST文档允许您使用这些资源和HTTP请求和响应,从而将文档与服务实现的内部细节隔离开来。这种分离帮助您记录服务的API,而不是它的实现。它还可以让您在不必重新编写文档的情况下自由地发展实现。
Vaadin
Vaadin 是一个RIA的基于浏览器的富客户端的Web框架。与 JavaScript 库或者是基于浏览器插件的解决方案不同,Vaadin 包含一个服务器端的结构,主要的应用逻辑都在服务器端运行,浏览器通过 Ajax 技术跟服务器端进行交互。Vaadin 提供多种各样的UI组建,例如按钮、表格、树形列表等等,每个组件都具有事件、侦听器、数据绑定和业务逻辑等功能。
Apache CXF
Web Services中较出色的一个
Ratpack
RATPACK是一组用于构建可伸缩HTTP应用程序的Java库。
Mobile
SpringMobile是一个框架,它提供了检测向您的Spring网站发出请求的设备类型的功能,并提供基于该设备的可选视图。和所有的Spring项目一样,Spring Mobile的真正威力在于它可以多么容易地扩展。
特征如下:
用于移动和平板设备服务器端检测的设备解析器抽象
网站首选项管理,允许用户指示他或她是否喜欢“普通”、“移动”或“平板电脑”体验
一种站点切换器,能够根据用户的设备和可选的指定站点偏好,将用户切换到最合适的站点(移动、平板或普通站点)。
设备感知视图管理,用于组织和管理特定设备的不同视图
Template Engines
Thymeleaf, Freemarker, Mustache, Groovy Templates
模板引擎,没有鹤立鸡群的,都差不多吧,比JSP性能好,使用方式也比较简单,加maven坐标,新建特定的模板文件,加入scheme引用再使用对应标签就行了,这里以Thymeleaf为例
引用:
使用:
另外介绍一个Beetl,Beetl是由国人开发,官方数据称,Beetl的页面渲染速度比Thymeleaf快十倍
Security
Security
Spring Security是一个功能强大、高度可定制的身份验证和访问控制框架。它是保护基于弹簧的应用程序的事实标准。
Spring Security是一个专注于向Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全的真正威力在于它可以很容易地扩展以满足定制需求。
特征如下:
对认证和授权的全面和可扩展支持
防止会话固定、点击劫持、跨站点请求伪造等攻击
servlet API集成
与SpringWebMVC可选集成
OAuth2 Client, OAuth2 Resource Server
OAuth 2 是一个授权框架,或称授权标准,它可以使第三方应用程序或客户端获得对HTTP服务上(例如 Google,GitHub )用户帐户信息的有限访问权限。OAuth 2 通过将用户身份验证委派给托管用户帐户的服务以及授权客户端访问用户帐户进行工作。综上,OAuth 2 可以为 Web 应用 和桌面应用以及移动应用提供授权流程。
更多介绍查看https://www.jianshu.com/p/68f22f9a00ee
Okta
和OAuth2差不多,也是身份授权管理
SQL
MSQL, JDBC, MyBatis, SQL Server
太常见了,pass
JPA
Java持久API,JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致
H2
H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。
它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。
H2的第三个用处是作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。不过这样系统架构就会比较复杂了
PostgreSQL
它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高
HSQLDB
HSQLDB是一款Java内置的数据库,非常适合在用于快速的测试和演示的Java程序中。(无需独立安装数据库)
HSQLDB有三种模式:
1. Server 就像Mysql那样
2. In-Process 又叫做 Standalone 模式,数据放在本地文件,伴随JVM一起启动,是HSQLDB的主要应用场景
3. Memory-only, 仅仅在内存中,一旦重启,数据就消失。
Apache Derby
将目光放在小 Derby 的原因是纯绿色、轻巧、内存占用小,分分钟在你机子跑起来,自己做点需要连接数据库的代码实践非常方便
Liquibase
LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。LiquiBase的主要特点有:
支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
支持多开发者的协作维护;
日志文件支持多种格式,如XML, YAML, JSON, SQL等;
支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等;
Flyway
1. Flyway是什么
Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。
2. 为什么要使用Flyway
在真实的项目开发中,我们每个人都会有一个应用软件和与其相联系的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我在我的本地有一套软件和相应的数据库系统,我的另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当中去。
JOOQ
JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法来实现各种复杂的sql。对于写Java的码农来说ORMS再也熟悉不过了,不管是Hibernate或者Mybatis,都能简单的使用实体映射来访问数据库。但有时候这些 ‘智能’的对象关系映射又显得笨拙,没有直接使用原生sql来的灵活和简单,而且对于一些如:joins,union, nested selects等复杂的操作支持的不友好。JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又保留了原生sql的灵活性,它更像是介于 ORMS和JDBC的中间层。对于喜欢写sql的码农来说,JOOQ可以完全满足你控制欲,可以是用Java代码写出sql的感觉来。
NoSQL
Redis, Reactive Redis
内存版数据库,不用多说了吧
Reactive Redis又是什么呢?首先要理解响应式编程。
响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。响应式编程是一种通过异步和数据流来构建事务关系的编程模型。响应式编程可以加深你代码抽象的程度,让你可以更专注于定义与事件相互依赖的业务逻辑,而不是把大量精力放在实现细节上,同时,使用响应式编程还能让你的代码变得更加简洁具体参考
https://blog.csdn.net/get_set/article/details/79455258
以下加Reactive的都是响应式的版本,不再介绍
MongoDB, Reactive MongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。和Redis对比:https://www.cnblogs.com/java-spring/p/9488227.html
Embedded MongoDB
如果希望在一个页面中包含更多(更少)的信息,就可以将更多(更少)的信息放在内嵌文档中。MongoDB中,多和少可以权衡,举个栗子,作者和文章之间可能是一对少的关系:每个作者只有几篇文章。文章和评论之间是一对多的关系,每篇文章可以有很多条评论。“少”的关系使用内嵌的方式比较好,“多”的关系使用引用的方式比较好。
ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
Solr
和ElasticSearch差不多。
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
Cassandra, Reactive Cassandra
Apache Cassandra是一个开源,分布式和分散式/分布式存储系统(数据库),用于管理遍布世界各地的大量结构化数据。它提供高可用性的服务,没有单点故障。
下面列出了Apache Cassandra的一些值得注意的地方:
它是可扩展,容错和一致的。
它是一个面向列的数据库。
它的分布设计基于Amazon的Dynamo及其在Google的Bigtable上的数据模型。
创建在Facebook,它与关系数据库管理系统有很大的不同。
Cassandra实现了一个没有单点故障的Dynamo风格的复制模型,但增加了一个更强大的“列族”数据模型。
Cassandra被一些最大的公司使用,如Facebook,Twitter,Cisco,Rackspace,ebay,Netflix等。
Cassandra的特点
Cassandra因其卓越的技术特性而变得如此受欢迎。下面给出了Cassandra的一些特性:
弹性可扩展性- Cassandra是高度可扩展的; 它允许添加更多的硬件以适应更多的客户和更多的数据根据要求。
始终基于架构- Cassandra没有单点故障,它可以连续用于不能承担故障的关键业务应用程序。
快速线性性能- Cassandra是线性可扩展性的,即它为你增加集群中的节点数量增加你的吞吐量。因此,保持一个快速的响应时间。
灵活的数据存储- Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据您的需要动态地适应变化的数据结构。
便捷的数据分发- Cassandra通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。
事务支持- Cassandra支持属性,如原子性,一致性,隔离和持久性(ACID)。
快速写入- Cassandra被设计为在廉价的商品硬件上运行。 它执行快速写入,并可以存储数百TB的数据,而不牺牲读取效率。
Couchbase, Reactive Couchbase
couchbase是CouchDB和MemBase的合并。而memBase是基于Memcached的。因此couchbase联合了couchbase的简单可靠和memcached的高性能,以及membase的可扩展性。
灵活的数据模型:couchbase中使用json格式存储对象和对象之间的关系。
Redis 和Couchbase都是基于内存的数据存储系统。在它们各自的官方描述中,Couchbase是高性能,高伸缩性和高可用的分布式缓存系统;Redis是一个开源的内存数据结构存储系统。
Redis和Couchbase详细对比:http://rdc.hundsun.com/portal/article/736.html
Neo4j
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性
Gemfire
如果你了解Redis或memCached,那么恭喜,你很快就能理解GemFire是什么,没错,你可以把它理解为一个增强版的Redis,具体在哪些方面增强,我们日后慢慢聊。如果你不了解Redis,也没有关系,先看官方网站上的说法:Pivotal GemFire is the distributed, in-memory database for developers who are building the highest scaling and performing data-centric apps in the world. 但是,按照我对它的理解,我更愿意用下面的语言来描述它,GemFire是一个高性能的分布式内存对象缓存系统,如果非要说它是数据库,那也只能算是一个Key/Value数据库(我更愿意称之为Key/Value存储系统)
Integration
Spring Integration
使用Spring Framework鼓励开发人员使用接口进行编码,并使用依赖注入(DI)为普通旧Java对象(POJO)提供执行其任务所需的依赖项。 Spring Integration将这一概念更进一步,其中POJO使用消息传递范例连接在一起,并且各个组件可能不了解应用程序中的其他组件。这种应用程序是通过组装细粒度可重用组件来构建的,以形成更高级别的功能。通过精心设计,这些流程可以模块化,并在更高的层次上重复使用。
除了将细粒度组件连接在一起外,Spring Integration还提供多种通道适配器和网关,以便与外部系统进行通信。通道适配器用于单向集成(发送或接收);网关用于请求/回复方案(入站或出站)。有关适配器和网关的完整列表,请参阅参考文档。
RabbitMQ
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
Kafka
Kafka也是消息队列组件,这个很常用,先说说使用方法再和RabbitMQ对比。Springboot使用Kafka:
第一步:加入依赖
第二步:配置Kafka
spring:
kafka:
producer:
bootstrap-servers:
192.168.1.78:9092
group-id: test
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
bootstrap-servers:
192.168.1.70:9092
group-id: test
enable-auto-commit: true
auto-commit-interval: 1000
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
第三步:Kafka发送代码
@Component
public class KafkaSender {
@Autowired
private KafkaTemplate kafkaTemplate;
/**
* 发送消息到kafka,主题为test
*/
public void sendTest(){
kafkaTemplate.send("test","hello,kafka " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
}
}
第四步:Kafka消费代码
public class KafkaConsumer {
/**
* 监听test主题,有消息就读取
*
@param message
*/
@KafkaListener(topics = {"test"})
public void consumer(String message){
log.info("test topic message : {}", message);
}
}
第五步:测试启动类代码
@SpringBootApplication
@EnableScheduling
public class ServerApplication {
@Autowired
private KafkaSender kafkaSender;
public static void
main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
//然后每隔1分钟执行一次
@Scheduled(fixedRate =1000 *60)
public void testKafka()throws Exception {
kafkaSender.sendTest();
}
}
Kafka和RabbitMQ对于他们的使用场景如下
RabbitMQ
1.RabbitMQ的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。
2.消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。
3.集群部署,使用热备,保证消息的可靠性。
kafka
1.应当有一个非常好的运维监控系统,不单单要监控Kafka本身,还要监控Zookeeper。(kafka强烈的依赖于zookeeper,如果zookeeper挂掉了,那么Kafka也不行了)
2.对消息顺序不依赖,且不是那么实时的系统。
3.对消息丢失并不那么敏感的系统。
4.从 A 到 B 的流传输,无需复杂的路由,最大吞吐量可达每秒 100k 以上。
总结:在实际生产应用中,通常会使用kafka作为消息传输的数据管道,RabbitMQ作为交易数据作为数据传输管道,主要的取舍因素则是是否存在丢数据的可能;RabbitMQ在金融场景中经常使用,具有较高的严谨性,数据丢失的可能性更小,同事具备更高的实时性;而kafka优势主要体现在吞吐量上,虽然可以通过策略实现数据不丢失,但从严谨性角度来讲,大不如RabbitMQ;而且由于kafka保证每条消息最少送达一次,有较小的概率会出现数据重复发送的情况;
Kafka Streams
Kafka Streams是一个客户端程序库,用于处理和分析存储在Kafka中的数据,并将得到的数据写回Kafka或发送到外部系统。Kafka Stream基于一个重要的流处理概念。如正确的区分事件时间和处理时间,窗口支持,以及简单而有效的应用程序状态管理。Kafka Streams的入口门槛很低: 你可以快速的编写和在单台机器上运行一个小规模的概念证明(proof-of-concept);而你只需要运行你的应用程序部署到多台机器上,以扩展高容量的生产负载。Kafka Stream利用kafka的并行模型来透明的处理相同的应用程序作负载平衡。
Kafka Stream 的亮点:
设计一个简单的、轻量级的客户端库,可以很容易地嵌入在任何java应用程序与任何现有应用程序封装集成。
Apache Kafka本身作为内部消息层,没有外部系统的依赖,还有,它使用kafka的分区模型水平扩展处理,并同时保证有序。
支持本地状态容错,非常快速、高效的状态操作(如join和窗口的聚合)。
采用 one-recored-at-a-time(一次一个消息) 处理以实现低延迟,并支持基于事件时间(event-time)的窗口操作。
提供必要的流处理原语(primitive),以及一个 高级别的Steram DSL 和 低级别的Processor API
JMS(ActiveMQ), JMS(Artemis)
老牌消息中间件,还是推荐用Kafka吧。。
Cloud Core,
Cloud Support
Cloud Config
Cloud Discovery
Cloud Routing
Cloud Circuit Breaker
Cloud Tracing
Cloud Messaging
Cloud AWS
Cloud Contract
Cloud系列就不介绍了,平时开发也不一定用的到,但应该知道这是个什么东西,有什么用,SpringCloud教程: https://springcloud.cc/
Pivotal Cloud Foundry
Cloud Foundry是一个开源平台即服务(PaaS),为您提供云,开发人员框架和应用程序服务的选择。 它是开源的,由Cloud Foundry Foundation管理。
Azure
微软的云产品
Spring Cloud GCP
谷歌的云产品。有兴趣可以去用一下谷歌、亚马逊、微软的云,有12个月免费时间,但要办类似paypal的国际信用卡,非常麻烦
I/O
Batch
轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序。
Spring Batch提供了可重复使用的功能,这些功能对于处理大量记录至关重要,包括记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。 它还提供更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。 简单和复杂的大批量批处理作业可以高度可扩展的方式利用框架来处理大量信息。
JavaMail API库为开发电子邮件应用程序提供必要的支持。 Spring改进了这个想法并为此提供了极好的支持。 它通过删除在Java应用程序中设置电子邮件支持的许多冗余属性来简化该技术。
Apache Camel
Apache Camel是一个基于已知企业集成模式的多功能开源集成框架。
Camel使您能够以各种特定于域的语言定义路由和中介规则,包括基于Java的Fluent API,Spring或Blueprint XML配置文件以及Scala DSL。这意味着您可以在IDE中智能地完成路由规则,无论是在Java,Scala还是XML编辑器中。
Apache Camel使用URI直接使用任何类型的传输或消息传递模型,如HTTP,ActiveMQ,JMS,JBI,SCA,MINA或CXF,以及可插入的组件和数据格式选项。 Apache Camel是一个小型库,具有最小的依赖性,可以轻松嵌入任何Java应用程序。无论使用哪种传输类型,Apache Camel都允许您使用相同的API - 因此,请学习API一次,然后您就可以与开箱即用的所有组件进行交互。
Apache Camel支持Bean绑定,并与流行的框架(如CDI,Spring,Blueprint和Guice)无缝集成。 Camel还为您的路线单元测试提供广泛的支持。
LDAP
轻量级目录访问协议(LDAP)是一种开放的,与供应商无关的行业标准应用程序协议,用于通过Internet协议(IP)网络访问和维护分布式目录信息服务。目录服务通过允许在整个网络中共享有关用户,系统,网络,服务和应用程序的信息,在开发Intranet和Internet应用程序中发挥着重要作用。作为示例,目录服务可以提供任何有组织的记录集,通常具有分层结构,例如公司电子邮件目录。类似地,电话簿是具有地址和电话号码的订户列表。Spring提供对LDAP的支持
Quartz Scheduler
Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 将任务定义为标准Java组件的作业,这些组件可以执行几乎任何可以编程的程序。 Quartz Scheduler包含许多企业级功能,例如支持JTA事务和集群。
Spring Shell
SpringShell项目的用户可以通过依赖SpringShell jar并添加自己的命令(这些命令作为SpringBeans的方法来提供),轻松地构建一个功能齐全的shell(又称命令行)应用程序。创建命令行应用程序可能很有用,例如与项目的RESTAPI交互,或使用本地文件内容。
特征:
弹簧外壳的特点包括
一个简单的、注释驱动的编程模型,用于生成自定义命令
使用Spring引导自动配置功能作为命令插件策略的基础
选项卡完成、着色和脚本执行
自定义命令提示、shell历史文件名、结果和错误处理
基于特定域标准动态启用命令与bean验证API集成
已经内置的命令,如清晰的屏幕、华丽的帮助、退出
带格式、对齐、花哨边框等的ASCII艺术表。
想要构建如下命令
shell:>translate"hello world!"--fromen_US --to fr_FRbonjour monde!
可以用代码:
@ShellComponentpublicclassTranslationCommands{privatefinalTranslationService service;@AutowiredpublicTranslationCommands(TranslationService service) {this.service = service; }@ShellMethod"Translate text from one language to another.")publicString translate(@ShellOption(mandatory = true)String text,@ShellOption(mandatory = true, defaultValue ="en_US")Locale from,@ShellOption(mandatory = true)Locate to ) {// invoke servicereturnservice.translate(text, from, to); }}
Statemachine
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
有限状态机体现了两点:首先是离散的,然后是有限的。
State:状态这个词有些难以定义,状态存储关于过去的信息,就是说它反映从系统开始到现在时刻的输入变化。
Actions & Transitions:转换指示状态变更,并且用必须满足来确使转移发生的条件来描述它。动作是在给定时刻要进行的活动的描述。
Guards:检测器出现的原因是为了检测是否满足从一个状态切换到另外一个状态的条件。
Event:事件,又见事件,笼统说来,对系统重要的某件事情被称为事件。
Spring Statemachine 是应用程序开发人员在Spring应用程序中使用状态机概念的框架。
Ops
Actuator, Actuator Docs
Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。
Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。
Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。
Actuator Docs顾名思义就是Actuator 的文档
Spring Boot Admin(Server), (Client)
Spring Boot Admin 提供了很多功能,如显示 name、id 和 version,显示在线状态,Loggers 的日志级别管理,Threads 线程管理,Environment 管理等。Spring Boot Admin 是由服务端和客户端组成
以上就是IntelliJ IDEA中出现的SpringBoot所有依赖
下面附带SpringBoot Enable系列注解
@EnableAspectJAutoProxy开启AOP自动代理
@EnableAutoConfiguration开启自动配置
@EnableAsync开启异步,被加了@Async的方法会异步执行
@EnableCaching开启Spring Cache
@EnableLoadTimeWeaving开启代码织入,在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。
@EnableConfigurationProperties当这个注解应用到你的@Configuration时, 任何被它注解的bean将自动被Environment属性配置。
@EnableMBeanExport允许从Spring上下文以及所有被@ManagedResource注解的bean中默认导出所有标准MBean。
@EnableScheduling开启计划任务
希望通过阅读本文能让您对SpringBoot的整个技术栈有一个更多的了解,在针对某个功能寻求技术时能迅速想到并优先使用本文提及的技术。