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