此笔记是根据《疯狂Spring Cloud微服务架构实战》编写,图片也是来源这本书。若需要详细的学习,请购买原书本.
在大数据、高并发的环境下,系统架构需要面对更为严苛的挑战,起码满足一下要求.
高性能
应用程序基本要求
独立性
其中一个模板出现bug或其他问题,不可影响其他模块、整个应用使用
容易扩展
应用每一个节点都可以根据实际需求扩展 .
便于管理
对于各个模块的资源,都可以轻松管理、升级、减少维护成本
状态监控与警报
对整个应用程序进行监控、当某一个节点出现问题,能及时发出警报
Microservice
微服务是一种架构风格,将单体应用划分为小型的服务单元,微服务之间只用HTTP的 API 进行资源访问与操作
Netflix OSS(Netflix Open Source Software Center)
框架源自互联网影片提供商,最近几年成立自己的开源中心。这个开源组织专注大数据、云计算方面及时,提供多个开源框架。这些框架包括大数据工具、构建工具、基于云平台的服务工具。Netflix所提供的这些框架,很好遵循微服务所推崇的理念,实现去中心化的服务管理、服务容错等机制。
Spirng Cloud不是一个具体的框架,相当一个工具箱,提供各类工具,可以帮助我们快速构建分布式系统。
Spring Cloud Netflix模块主要封装Netfiix以下的项目
Eureka
基于REST服务的分布式中间件,主要用于服务管理。Hystrix
容错框架,通过添加延迟阀值以及容错的逻辑,帮助我们控制分布式系统间组件的交互Feign
一个REST客户端,目的是为了简化Web Service客户端的开发Ribbon
负载均衡框架,在微服务集群中为客户端的通信提供支持,它主要实现中间层应用程序的负载均衡Zuul
为微服务集群提供代理、过滤、路由等功能
Spirng Cloud Config
为分布式系统提供配置服务器和配置客户端,通过它们的配置,可以很好地管理集群中的配置文件
Spring Cloud Sleuth
服务跟踪框架,可以与Zipkin、Apache Htrace和ELK等数据分析、服务跟踪系统进行整合,为服务跟踪、解决问题提供便利
Spring Cloud Stream
用于构建消息驱动微服务的框架,在Spring Boot基础上,整合Spring Integration来连接消息代理中间件
Srping Cloud Bus
连接RabbitMQ、Kafka等消息代理的集群消息
书本Demo下载
这里不展示JDK、maven安装和配置,直接下载一个Idea,自带有默认maven
spring boot也不展示,请具备spring boot基础学习
本章讲述Spirng Cloud中Eureka的使用,Eureka在服务器上发布、调用微服务,Eureka的配置以及Eureka集群
Eureka提供基于REST的服务,在集群主要用于服务管理。
Eureka提供基于Java语言的客户端组件,客户端组件实现负载均衡功能,为业务组件的集群部署创造条件。
使用Eureka,将业务组件注册到Eureka容器中,组件可进行集群部署,Eureka维护这些服务的列表并自动检查它们的状态.
启动Eureka服务器项目、其次Eureka客户端提供者项目(提供接口)、最后Eureka客户端服务调用者项目(通过Eureka服务器项目调用提供者的接口)
源码地址
结构图
源码地址
源码地址
Ribbon是Netflix下的负载均衡项目,它在集群中为各个各个客户端的通信提供了支持,主要是想中间层应用程序的负载均衡。一下特性
- 负载均衡器,可支持插拔式的负载均衡规则
- 对多种协议提供支持。Http、TCP、UDP
- 集成负载均衡功能的客户端
Ribbon 主要三大子模块
- ribbon-core:该模块为Ribbon项目的核心,主要包括负载均衡器接口定义、客户端接口定义、内置的负载均衡实现等API
- ribbon-eureka:为Eureka客户端提供负载均衡实现类
- ribbon-httpclient: 对Apache的HttpClient进行封装,该模块提供含有负载均衡功能的REST客户端
源码地址
使用负载均衡器ILoaderBalancer,可定制负载均衡规则
Ribbon自带的负载均衡规则
- RoundRobinRule
系统默认的规则,通过简单轮询服务列表选择服务器,其他规则在很多情况下仍然使用RoundRobinRule- AvailabilityFilteringRule
该规则会忽略以下服务器
- 无法连接的服务器。默认情况下,如果3次连接失败,该服务器会被置为“短路”状态,该状态持续30秒;如果再次连接失败,“短路”状态持续时间将会以集合级数增加。可以通过修改niws.loadbalancer.clientName.connection-FailureCountThreshold属性配置连接失败次数
- 并发数过高的服务器。如果连接到改服务器的并发数过高,也会被这个规则忽略,可以通过修改clientName.ribbon.ActiveConnectionsLimit属性设定最高并发数
- WeightedResponseTimeRule
为每个服务器赋予一个权重值,服务器的相应时间越长,该权重值就越少,这个规则会随机选择服务器,权重值有可能会决定服务器的选择。- ZoneAvoidanceRule
该规则以区域、可用服务器为基础进行服务器选择。使用Zone对服务器进行分类,可用理解为机构或者机房。- BastAvailableRule
忽略“短路”的服务器,并选择并发数较低的服务器- RandomeRule
随机选择可用的服务器- RetryRule
含有重试的选择逻辑,如果使用RoundRobinRule选择的服务器无法连接,将重新选择服务器
源码地址
可自定义Ping规则
RestTemplate负载均衡能力介绍
使用@LoadBalanced注解的RestTemplate将具有负载均衡功能
Spring容器启动时,会将这些加上@LoadBalanced注解的RestTemplate添加拦截器, 拦截器使用LoadBalancerClient处理请求
源码地址
CXF是目前一个较为流行的WEB service框架,使用CXF可以发布和调用使用各种协议的服务,包括SOAP协议、XML/HTTP等。
Restlet是一个轻量级的REST框架,可发布和调用REST风格的WEB service
Fegin是Github开源项目,目的简化Web Service客户端的开发。在使用Fegin,可使用注解修饰接口,被注解修饰接口具有访问Web Service能力。Fegin支持插件式的编码器和解码器,可通过特性对请求和响应进行不同的封装和解析
源码地址
Feign 作为Spring Cloud Netflix的REST客户端,插件式机制可以灵活整合项目中,Spring Cloud对其进行封装,本身就具有负载均衡的能力,可以访问集群的服务。
可以自定义编码器、解码器、请求拦截器、接口日志(日志文件生成)、HTTP客户端、压缩配置(对请求和响应进行压缩)…..等
源码地址
系统架构需要考虑横向扩展、单点故障问题,对于一个庞大的应用集群,部分服务或者机器出现问题不可避免。在出现故障,如何减少故障的影响,保障集群的高可用。
微服务集群中,不管是服务器、客户端,都支持集群部署
保护框架:Hystrix
Hystrix 通过添加延迟阀值以及容错的逻辑,帮助控制分布式系统间组件的交互。Hystrix通过隔离服务的访问点、停止它们之间的级联故障、提供可回退操作实现容错.
容错机制结构图
Hystrix功能点
- 当所依赖的网络服务发生延迟或者失败,对访问客户端程序进行保护,就像容错机制结构图
- 分布式系统中,停止级联故障
- 网络服务恢复正常后,可以快速恢复客户端的访问能力
- 调用失败时执行服务回退
- 可支持实时监控、报警和其他操作
源码地址
命令对象可以使用以下方法执行命令
除execute方法同步,其他都是异步执行
toObservable
返回一个最原始的可观察实例,Observable是RxJava的类,使用该对象可以观察命令的执行过程,并且将执行信息传递给订阅者
observe
调用toObservable方法,获取一个原始的Observable实例后,使用ReplaySubject作为原始Obervable的订阅者
queue
通过toObservable方法获取原始的Observable实例,在调用Observable的toBlocking方法得到一个BlockingObservable实例,最后调用BlockingObservable的toFuture方法返回Future实例,调用Future的get方法得到执行结果
exexute
源码地址
属性配置
API
源码地址
回退模式
回退情况
- 断路器被打开
- 线程池、队列、信号量满载
- 实际执行命令失败
源码地址
断路器开启与关闭
断路器一旦开启,直接调用回退方法,不再执行命令,而且不会更新链路的健康状况。开启需要满足两个条件
- 整个链路达到一定阈值,默认情况下,10秒内产生超过20次请求,则符合第一个条件
- 满足第一个条件的情况下,如果请求的错误百分之比大于阈值,则会打开断路器,默认为50%
断路器打开后,在一段时间内,命令不会再执行(一直触发回退),这段时间称作“休眠期”。休眠期的默认值为5秒,休眠期结束后,Histrix尝试执行一次命令,此时断路器状态不是开启,也不是关闭,而是一个半开的状态,如果这一次命令执行成功,则关闭断路器并清空链路的健康信息;
如果执行失败,断路器会继续保持打开的状态
源码地址
隔离机制
命令的真正执行,除了断路器关闭,还需要执行命令的线程池或者信号量是否满载。
如果满载,命令就不会执行,而是直接触发回退,这样的机制,在控制命令的执行上,实现错误的隔离
Hystrix 提供两种隔离策略
- Thread : 默认值,有线程池决定命令的执行,如果线程池满载,则不会执行命令。Hystrix使用ThreadPoolExecutor控制线程池行为,线程池的默认大小为10
- SemaPhore : 由信号量决定命令的执行,当请求的并发数高于阈值,就不再执行命令。相对于线程策略,信号量策略开销更小,但是该策略不支持超时以及异步,除非对调用的服务有足够的信任,否则不建议使用该策略进行隔离。
如果对于所调用的服务有足够的信任,可以使用信号量,减少系统开销
源码地址
合并请求
可以将一个时间段内的相同请求(参数不同),收集到同一个命令中执行,节省线程开销,减少网络连接,提升性能
至少包含以下3个条件
- 需要有一个执行请求的命令,将全部参数进行整理,然后调用外部服务
- 需要有一个合并处理器,用于收集请求,以及处理结果
- 外部接口提供支持(调用的接口提供多个id提交支持)
源码地址
请求缓存
若在一次请求中,多个地方调用同一个接口,可以考虑使用缓存
这里的一次请求缓存,请求完成后,缓存将消失。每次请求将重新生成缓存
源码地址
feign整合Hystrix
Hystrix监控
源码地址
介绍
SpirngCloud集群提供多个组件,用于进行集群内部的通信,例如服务管理组件Eureka,负载均衡组件Ribbon。如果集群提供API或者Web服务,需要与外部进行通信,比较好的方式是添加一个网管,将集群的服务都隐藏到网关后面。这种做法对于外部客户端来说,无须关心集群的内部结构,只需关心网关的配置等信息;对于Spring Cloud集群,不必暴露过多的服务,提升集群安全性
代理层作用集群的大门,在技术选取上尤为重要,很多传统解决方案选择Nginx、Apache等服务器。Netflix提供了自己的解决方案:Zuul。为微服务集群提供代理、过滤、路由功能
Zuul功能
- 身份验证和安全性
对需要身份验证的资源进行过滤,拒绝处理不符合身份认证的请求- 观察和监控
跟踪重要的数据,为我们展示准确的请求状况- 动态路由
将请求动态路由到不同的服务集群- 负载分配
设置每种请求的处理能力,删除那些超出限制的请求- 静态响应处理
提供一些静态的过滤器,直接响应一些请求,而不将它们转发到集群内部- 路由多样化
除了可以将请求路由到Spring Cloud集群外,还可以将请求路由到其他服务
第一个Demo实践
源码地址
过滤器运行机制
Zuul Http客户端
简单路由
以http、https、完整的url配置,就是简单路由
application.yml代码如下
zuul:
#所有带有books前缀的URL请求转发到8090访问(不带有books的就正常)
routes: { books: {"url": "http://localhost:8090/"}}
简单路由通过过滤器SimpleHostRoutingFilter使用Httpclient进行转发,为了保证转发性能,使用了连接池功能。
HttpClient连接池属性
- zuul.host.maxTotalConnection
目标主见的最大连接数,默认为200;配置该项属性,相当于调用PoolingHttpClientConnectionManager的setMaxTotal方法- zuul.host.maxPerRouteConnections
每个主机的初始连接数,默认为20;配置该项属性,相当于调用PoolingHttpClientConnectionManager的setDefaultMaxPerRoute方法
源码地址
跳转路由
请求url访问网关的地址A,会跳转到访问地址B(forward),处理跳转路由的过滤器为SendForwardFilter
application.yml加入代码如下
zuul:
routes:
#创建一个名称叫forwardRoutes的路由规则,所有带有test前缀的URL请求跳转到本项目/source/hello路径访问
forwardRoutes: {path: "/test/*",url: "forward:/source/hello"}
源码地址
Ribbon路由
《在微服务集群中使用Zuul》的例子就是使用Ribbon路由,直接以注册的服务id做路由转发;处理跳转路由的过滤器为RebbonRoutingFilter
application.yml代码如下
zuul:
routes:
#Ribbon路由 创建一个名称叫eureka-invoker的路由规则,所有带有sale前缀的URL请求转发到服务id eureka-invoker访问
#若是这里的serviceId不填写,会采用路由规则的名称做serviceId
eureka-invoker: {path: "/sale/**",serviceId: "eureka-invoker"}
源码地址
自定义路由规则
在SpringBoot弄多一个配置类,设置一个Bean PatternServiceRouteMapper配置自定义路由规则
源码地址
忽略路由规则
application.yml代码如下
zuul:
#忽略路由规则
ignored-patterns: /sale/noRoute
源码地址
请求头配置
zuul:
#全局配置 所有请求转发都带有 原请求的请求头属性
sensitive-headers: [accept-language,cookie]
#全局配置 所有请求头和响应头信息均被忽略
ignored-headers: [accept-language]
routes:
eureka-invoker:
path: "/sale/**"
serviceId: "eureka-invoker"
#请求头信息仅对当前路由规则生效
sensitive-headers: [accept-language,cookie]
源码地址
路由端点
需在配置文件关闭安全认证
Zuul与Hystrix
对路由进行FallBack
源码地址
Zuul中预加载Ribbon
客户端相关的Bean会延迟加载,第一次调用集群服务时,才会初始化这些对象。如果想提前加载,在配置文件application.yml 代码
zuul:
rebbon:
eager-load:
enable: true
本节内容针对Zuul原理讲解
过滤器优先级
Spring Cloud为Http请求各个阶段提供多个过滤器,这些过滤器的执行顺序由他们各自提供的一个int值决定,提供的值越小,优先级就越高。
自定义过滤器
请结合代码
源码地址
动态加载过滤器
由于重启网关代价太大,为了解决该问题,Zuul提供过滤器的动态加载功能.
使用Groovy编写过滤器,让Zuul动态加载
源码地址
禁用过滤器
可在application.yml中禁用部分过滤器
请求上下文
HTTP请求的全部信息都封装在一个RequestContext对象中,改对象继承ConcurrentHashMap。可将RequestContext看作一个Map,RequestContext维护者当前线程的全部请求变量,例如请求的URI、serviceId、主机等信息。
本小节以RequestContext为基础,编写一个自定义过滤器,使用RestTemplate调用
源码地址
@EnableZuulServer注解
除了使用@EnableZuulProxy开启Zuul功能,还可以使用@EnableZuulServer开启。该注解像一个“低配版”的@EnableZuulProxy,使用@EnableZuulServer,spring内置的简单路由过滤器、Ribbon路由过滤器等都不会被启用
默认情况下Zuul不具备集群服务的能力,也不具备简单路由的功能
error过滤器
各阶段的过滤器执行时,抛出的异常会被捕获,然后调用RequestContext的setThrowable方法设置异常。error阶段的SendErrorFilter过滤器会判断RequestContext是否存在异常(getThrowable是否为null),如果存在,才会执行SendErrorFilter过滤器
SendErrorFilter执行时,会将异常信息设置到HttpServletRequest中,再调用RequestDispatcher的forward方法,默认调整到/error页面
源码地址
动态路由*
路由规则动态刷新功能在实际应用中非常重要
Spring Cloud Stream是一个用于构建消息驱动微服务的框架,该框架在SpirngBoot的基础上整合了Spring Intergration来连接消息代理中间件.支持多个消息中间件的自定义配置,同时吸收这些消息中间件的部分概念,例如持久化订阅、消费者分组和分区等概念
Stream框架的组成部分
- Stream框架自己的应用模型
- 绑定器抽象层,可以与消息代理中间件进行绑定。通过绑定器API,实现插件式的绑定器
- 持久化订阅的支持
- 消费者组的支持
- Topic分区的支持
消息代理中间件
如ActiveMQ、Kafka、RabbitMQ框架
RabbitMQ是一个轻量级消息代理中间件,支持多种消息通信协议,支持分布式部署,同事支持运行于多个操作系统,具有灵活高可用等特性。
RabbitMQ支持多种协议,其中最为重要是高级消息队列协议AMQP,基于此协议,消息客户端和消息代理中间件不收开发语言、具体产品的约束。
下载与运行
- 下载64位Erlang、RabbitMQ
安装Erlang后
建立一个环境变量 ERLANG_HOME 指向Erlang目录F:\JAVA\erl9.3
RabbitMQ默认安装目录,不能有空格
管理员身份运行 开始–>所有程序–>RabbitMQ Service-start
管理员身份运行 开始–>所有程序–>RabbitMQ Server–>RabbitMQ Command Prompt (sbin dir)
输入命令
#查看插件状态
rabbitmq-plugins list
#启用插件管理
rabbitmq-plugins enable rabbitmq_management
编写生产者
源码地址
编写消费者
源码地址
交换器、绑定与队列
生产者不会直接将消息发给队列,只会将消息发送给交换器,交换器一边从生产者接收消息,一边将消息发送给各个队列
交换器与队列之间的连接叫做“绑定Binding”。每一个绑定都有一个名字,叫做binding key。当消息发送过来时,消息会带有一个路由的标识,叫做routing key
交换器根据binding key、routing key决定将消息发送给哪个队列。RabbitMQ提供4种类型的交换器
- durect
根据生产者传过来的routing key是否相等binding key,决定将消息发送给哪个队列- topic
根据生产传过来的routing key 是否匹配一定的表达式,决定消息发送给哪个或者哪些队列- fanout
将消息发送给交换器知道的全部队列,这种交换器会忽略设置的routing key- headers
根据消息的头信息决定将消息发送给哪个队列
用于处理数据流的分布式消息框架,拥有水平扩展、容错、高效等特性
- 构建系统间进行实时数据传输的通道
- 构建对数据流进行转换或相应的实时应用
Kafka整体结构与RabbitMQ类似
运行Kafka服务器
下载与运行
编写生产者
源码地址
编写消费者
源码地址
消费者组
消费者为自己添加一个消费者组的标记,每一条发布到Topic的记录,都会被交付给消费者组的一个消费者实例。
如果多个消费者实例拥有相同的消费者组,那么这些记录分配到个个消费者实力上,已达到负载均衡的目的。
如果所有消费者都有不同的消费者组,那么每一条记录都会广播到全部的消费者进行处理。
如果消费者A、B 同属一个消费者组,那么生产者发送一条消息,仅会交给其中一个消费者处理;如果两个消费者不属于同一个消费者组,那么该消息会发给他们(每一个进行处理)
程序实践
源码地址
编写生产者
源码地址
编写消费者
源码地址
更换绑定器
在Maven将Rabbit的依赖改为Kakfa的依赖即可
Sink、Source与Processor
为简化开发,Spring Cloud Stream内置3个接口:Sink、Source、Processo绑定通道
源码地址
消费者组
消费组相同,仅有一个消费者处理。消费组不同,则全部消费者处理
源码地址
Spirng Cloud Config
为分布式系统提供服务器、客户端配置,可以很好管理集群中的配置文件
配置服务器功能
提供访问配置的服务接口
对属性进行加密和解密
简单地嵌入Spring Boot的应用中
配置客户端功能
绑定配置服务器,使用远程的属性初始化Spring容器
对属性进行加密和解密
属性改变时,可以对他们进行重新加载
提供与配置相关的几个管理端点
在初始化引导程序的上下文,进行绑定配置服务器和属性解密等工作,也可以实现其他工作
应用结构
引导程序简介
Spring Cloud程序进行容器初始化先建立一个“引导上下文”(Boostrap Context),再创建主应用的上下文。
我们的主应用程序上下文通常读取的是application.yml文件,而引导文件则会读取bootstrap.yml 文件。因为application.yml配置会在bootstrap.yml后加载,所以如果两份配置文件同时存在,且存在key相同的配置,则application.yml会覆盖bootstrap.yml
- 引导上下文在主应用上下文前创建,是主应用上下文的父上下文
- 默认情况下,配置客户端的引导上下文在创建会读取远程配置(去配置服务器中读取)
源码地址
刷新配置
若git文件发生变化,Config客户端需要刷新读取配置
客户端需加入依赖spring-boot-starter-actuator
然后调用项目url+ /refresh。如:localhost:8081/actuator/refresh
此例子测试失败
刷新Bean
配置刷新后,获取的属性也需要刷新
通过注解@RefreshBrean
刷新
此例子测试失败
程配置(去配置服务器中读取)
实际应用涉及很多敏感数据,这些数据会被加密保存git仓库,最常见就是数据库密码。SpringCloudConfig为这些敏感数据提供加密和解密的功能,加密后的密文在传输给客户端会进行解密。配置服务器支持对称加密和非对称加密,对称加密使用AES算法,非对称加密使用RSA算法
为服务器安装JCE
下载地址
解压的jar,放到JavaHome/jre/lib/security/
目录替换
加密和解密端点
此例子测试失败
服务器健康指示器
在server端的application.yml属性spring.cloud.config.server.health.repositories
配置
此例子测试失败
客户端的错误提前与重试机制
实际应用可能有一些特殊需求,客户端比较关心配置服务器是否能连接上,启动时如果无法连接,宁可自己启动失败.
此例子测试失败
安全配置
加入spring-boot-starter-security依赖
然后查看服务端控制台输出的密码设置到客户端配置中
源码地址
访问服务器配置
上面的例子可以通过localhost:8060/config-dev.properties
访问
相应的规则如下
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/label/{application}-{profile}.yml
/{application}-{profile}.properties
/label/{application}-{profile}.properties
application表示客户端的应用名称(spring.application.name
),profile表示客户端所使用的配置,label表示配置的分支
介绍SpringCloudConfig与其他框架的整合(Eureka、Zuul、SpringCloud Bus)
下面的SVN换Git
源码地址
整合Spring CloudBus刷新配置
下面的SVN换Git
此例子到最后没给出具体操作,导致使用MQ的那一步刷新是失败的
源码地址
使用SpringCloud搭建服务集群、不论是Eureka服务器、服务实例、配置服务器、网关等节点,都可以横向扩展。一旦集群数量过多,并且存在复杂的依赖关系,管理将会变成一件很麻烦的事件.
每个服务依赖其他服务,如果出现异常、超时情况,排查问题变得非常困难。
事件标识,用于记录事件的存在,主要为
- Client Sent: cs
表示客户端发送请求,这个标识意味着跨度的开始。例如前面的A服务向B服务发送请求,A服务就是客户端- Server receivd: sr
表示服务端收到请求,并开始进行处理- Server sent: ss
表示服务器端完成请求的处理,并对客户端做出响应- Client Received
表示客户端接收到响应,意味着整个跨度的结束
Zipkin 是一个分布式跟踪系统,主要用于手机、管理微服务产生的数据。ZipKin的设计基于Google Dapper。Zipkin在得到这些数据后,提供数据查询、分析的功能
构建Zipkin服务器项目
源码地址
使用Mysql保存数据
使用介绍
使用消息采集数据
使用介绍
Elastic为数据存储、分析提供一整套解决方案,其中最著名就是ELK系统。
包括以下三个项目
- Elasticsearch
是一个分布式数据仓库,提供RESTful仓库,提供RESTful服务,可用于数据存储- Logstash
主要用于数据收集、转换、可将数据保存到指定的数据仓库中- Kibana
是可视化的数据管理平台、主要用于操作Elasticsearch的数据,提供多种图表展示数据,支持动态报表
下载并安装、启动ELK三个组件
使用Kibana分析Json日志文件
项目日志使用Logback转JSON
此Demo没兴趣,直接跳过
Srping Data框架目标是为数据的访问提供一个通用的模型
不管访问数据库使用什么技术,访问什么类型数据库,使用了Srping Data都可以用同样方式、代码实现访问.(包括关系型数据库、非关系型数据库)
Spring Data功能
- 提供数据与对象映射的抽象层,同一个对象可以映射为不同数据库的数据
- 根据数据存储接口的方法名,自动实现数据查询
- 为各个领域模型提供最基本的实现,如CRUD功能
- 可在原有逻辑基础上,实现自定义的数据库操作逻辑
Spring Data模块
- Spring Data JPA
该模块提供 基本的数据操作功能,可减少数据访问层的开发工作量- Spring Data MongoDB
使用该模块可轻松操作MongoDB的数据- Srping Data Redis
使用该模块可操作Redis数据库,并且操作过程进行极大的简化
JPA
Jave Persistence API的简称,是Sun早期推出的持久层规范,目前实现框架有HIbernate、OpenJPA等
Demo 直接跳过,Spring Boot早就提供的例子
Demo 直接跳过,Spring Boot早就提供的例子
可通过注解方式,Spring 提供的CRUD接口,将实体持久化到Redis