微服务就是将一个单体架构的应用按业务划分为一个个的独立运行的程序,每个小的服务之间都要进行通信,它们之间通过HTTP资源API进行通信(也可以采用消息队列来通信,如RabbitMQ,Kafaka等),可以采用不同的编程语言,使用不同的存储技术,自动化部署(如Jenkins))减少人为控制,降低出错概率。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署 和易维护的分布式系统开发工具包。
Spring Cloud Netflix
Netflix OSS 开源组件集成,包括Eureka、Hystrix(嗨死踹克死)、Ribbon、OpenFeign、Zuul等核心组件。
Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;
Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
OpenFeign:基于Ribbon和Hystrix的声明式服务调用组件;
Zuul:API网关组件,对请求提供路由及过滤功能。
Spring Cloud Bus
用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置。
Spring Cloud Consul
基于Hashicorp Consul的服务治理组件。
Spring Cloud Security
安全工具包,对Zuul代理中的负载均衡OAuth2客户端及登录认证进行支持。
Spring Cloud Sleuth
Spring Cloud应用程序的分布式请求链路跟踪,支持使用Zipkin、HTrace和基于日志(例如ELK)的跟踪。
Spring Cloud Stream
轻量级事件驱动微服务框架,可以使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。
Spring Cloud Task
用于快速构建短暂、有限数据处理任务的微服务框架,用于向应用中添加功能性和非功能性的特性。
Spring Cloud Zookeeper
基于Apache Zookeeper的服务治理组件。
Spring Cloud Gateway
API网关组件,对请求提供路由及过滤功能。
Spring Cloud OpenFeign
基于Ribbon和Hystrix的声明式服务调用组件,可以动态创建基于Spring MVC注解的接口实现用于服务调用,在Spring Cloud 2.0中已经取代Feign成为了一等公民。
1、Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
2、Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
3、spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。
4、Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。
(1)服务调用方式 dubbo是RPC springcloud Rest Api
(2)注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
(3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。
服务熔断:
熔断制机,主要用于应对雪崩效应的一种保护机制。指的是为了保全整体牺牲局部。编程中的熔断主要是为了避免整个服务崩溃,所以行相应的处理,比如将服务降级。
服务降级:
consumer 端:consumer 如果发现某个provider出现异常情况,⽐如,经常超时(可能是熔断引起的降级),数据错误,这时,consumer可以采取⼀定的策略,降级provider的逻辑,基本的有直接返回固定的数据。
provider 端:当provider 发现流量激增的时候,为了保护⾃身的稳定性,也可能考虑降级服务。
1.直接给consumer返回固定数据
2.需要实时写⼊数据库的,先缓存到队列⾥,异步写⼊数据库。
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
断路器有三个状态
完全打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭:当服务一直处于正常状态 能正常调用
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
使用:
(1)添加pom依赖
(2)配置文件添加相关配置
(3)启动类添加注解@EnableConfigServer
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul(儒勒)网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。
使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。
Spring Cloud Bus 提供了跨多个实例刷新配置的功能。因此,如果我们刷新一个模块,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点 / 总线 / 刷新来实现对任何单个实例的刷新。
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心,Nacos就是注册中心+配置中心的组合等价于Eureka+Config+Bus能替代Eureka做服务注册中心替代Config做服务配置中心
(1)服务的发现和健康监测
SpringCloud每启动一个服务的时候,都可以在nacos中查看到服务启动的数量,状态等信息。
(2)动态的配置服务
nacos中可以把对应服务的配置文件配置到nacos中,例如application.properties配置文件就可以配置到nacos中。(3)动态的DNS服务
dns: dns的作用就是将域名翻译为ip
nacos: nacos中动态的DNS服务就是可以通过服务名字来解析到所需要请求的服务的ip端口号。
(4)存储元数据管理
在nacos中配置的application.properties中配置的元数据,然后在服务中的控制器中的一个处理器中拿到application,properties中相对应的数据。
openfeign能够完成restTemplate+Ribbon+容错等功能,既能够设计Ribbon的负载均衡策略,又能够使用restTemplate来完成服务之间的相互调用,还可以通过设置容错,来完成如果服务器提供者发生错误的时候或者服务提供者关闭服务时候,开启容错。
OpenFeign的作用就是不用使用restTemplate来通过ip访问相应的服务,相当于Service层,就是通过service接口来连接到相对应的服务器提供者,然后在controller中使用@Autowried实现service然后调用方法就行。
使用:1.添加pom依赖。2.启动类添加@EnableFeignClients3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
容错就是消费者依赖服务提供者,如果服务提供者有异常或者挂掉了,消费者可以激活容器容错接口,继续提供服务,可以保证你服务的高可用(类似汽车的备胎,短暂使用可以,大部分时候容错返回的数据都是死数据)。
( 1) config就是nacos分布式配置中心,将同一服务的配置文件放置到nacos中,每次应用启动的时候,会从nacos中拉取新的配置文件,初始化到应用中,并且如果配置中的配置文件值发生变化的时候,应用就会立即感知到。
(2)配置文件,从左到右,优先级依次降低
bootstrap.properties > > bootstrap.yaml > > application.properties>> application.yaml
(3)如果服务中配置的有配置文件并且·nacos中也有相应的配置文件会优先读取bootstap.properties中的数据值。
(4) bootstrap.properties是在应用启动之前读取的,如果想要读取nacos中的内容,必须配置到bootstrap.properties、bootstrap.yaml。
Sentinel是Springcloud中的哨兵,作用是用来监控各个接口的流量,根据流量大小完成流量熔断(超过流量完成熔断),异常熔断(一定时间内超过一定数量的异常触发熔断)、超时熔断(超过响应时长的比例触发熔断)、容错(如果被调用的服务挂了,哨兵也有容错的功能,服务中的容错一般是使用哨兵模式,而不是使用feign实现容错)
reidis哨兵模式中的哨兵,用sh来监控redis master节点,通过·心跳模式来监控master节点是否还活着,如果master挂掉了,选举slaver节点为master
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sleuth是一个分布式链路追踪框架,能够记录每一个请求响应的时间,并且改请求调用的其他方法的响应时间也会有记录的,并且可以把请求调用的方法的依赖关系显示出来。
Zipkin是一个分布式跟踪系统,用来数据的收集和查找,通俗的说就是Zipkin可以接收sleuth产生的数据,通过可视化的方式显示出来,以及依赖关系也可以显示出来。
gateway是一个微服务网关,就相当于过滤器拦截器的作用
功能:拦截过滤鉴权,还有动态路由,负载均衡,限流等
浏览器发送的一个请求,不会直接去请求消费者,而是让网关gateway来分发路径,决定去那个消费者,然后消费者服务器再去请求服务提供者,另外一方面就是可以作为拦截器、过滤器来对请求进行过滤鉴权。
网关是独立的应用,不可以和springboot-starter-web一起使用,需要通过一个配置类才可以远程调用cache
( 1) dubbo是基于RPC进行通信的,Spring Cloud是通过使用Feign来完成Rest接口来实现通信的
(2) dubbo使用的二进制传输,占用带宽少一些 Spring Cloud使用的http协议传输,占用带宽多一些。
(3) dubbo中使用zk作为服务注册中心,Spring Cloud使用的nacos或者Eurake作为注册中心来完成(服务的健康监