一、什么是SpringCloud?
SpringCloud是实现微服务结构的一种方式,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等功能;协调分布式环境中各个系统,为各类服务提供模板性配置。其主要涉及的组件包括:
Eureka:注册中心
Zuul、Gateway:服务网关
Ribbon:负载均衡
Feign:服务调用
Hystrix或Resilience4j:熔断器
1.Eureka注册中心 :实现服务治理(服务注册与发现)。
2.负载均衡Ribbon :主要提供客户侧的软件负载均衡算法。
3.熔断器Hystrix:保护系统,控制故障范围。
4.服务调用Feign:服务间的调用
5.Spring Cloud Gateway网关:api网关,路由,负载均衡等多种作用。
6.Spring Cloud Config分布式配置中心 :配置管理
7.Spring Cloud Bus服务总线
二、各组件介绍
1.Eureka注册中心
1.1.Eureka做什么?
Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
同时,服务提供方与Eureka之间通过 “心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。这就实现了服务的自动注册、发现、状态监控。
1.2.原理图
基本架构:
Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
1.3.
坐标:
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 4 </dependency>
启动类:
1 //声明当前应用为eureka服务 2 @EnableEurekaServer 3 @SpringBootApplication 4 public class EurekaServerApplication { 5 public static void main(String[] args) { 6 SpringApplication.run(EurekaServerApplication.class); 7 } 8 }
客户端注册服务到集群 :
1 eureka: 2 client: 3 service-url: # EurekaServer地址,多个地址以','隔开 4 defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
2.负载均衡Ribbon
2.1.负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
2.2.负载均衡要干什么事情?
服务端负载
需要做三个事情:
1.接收请求
2.选择服务器地址
3.转发/执行请求(转发还是执行可以参考网关)
客户端负载
1.选择服务器地址
2.发请求
负载均衡就是分发请求流量到不同的服务器。
负载均衡一般分为两种:
1、 服务器端负载均衡(nginx)
2、 客户端负载均衡(Ribbon)
2.3、负载均衡架构
2.4.开启负载均衡
因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。
在RestTemplate的配置方法上添加 @LoadBalanced 注解:
1 @Bean 2 @LoadBalanced public RestTemplate restTemplate() { 3 return new RestTemplate(); 4 }
3.熔断器Hystrix
3.1.Hystrix的作用是什么呢?具体要保护什么呢?
Hystrix是Netflflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
在高并发领域,在分布式系统中,可能因为一个小小的功能扛不住压力,宕机了,导致其他服务也跟随宕机,最终导致整个系统宕机,所以在SpringCloud中采用Hystrix进行处理。
微服务I 发生异常,请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞。服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。
Hystrix解决雪崩问题的手段主要是服务降级,包括:
线程隔离
服务熔断
3.2.线程隔离
Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务。
用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理,什么是服务降级?
服务降级:优先保证核心服务,而非核心服务不可用或弱可用。
用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息) 。服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
触发Hystrix服务降级的情况:线程池已满、请求超时
3.3.服务熔断
熔断原理
在服务熔断中,使用的熔断器,也叫断路器,其英文单词为:Circuit Breaker
熔断机制与家里使用的电路熔断原理类似;当如果电路发生短路的时候能立刻熔断电路,避免发生灾难。在分布式系统中应用服务熔断后;服务调用方可以自己进行判断哪些服务反应慢或存在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。
Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续请求直接拒绝,一段时间(默认5秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打开,拒绝请求的服务。
4.Feign
5.Spring Cloud Gateway网关
5.1.
Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册到Eureka服务注册中心。
Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。
网关的核心功能是:过滤和路由 5.2.Gateway加入后的架构
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都可经过网关,然后再由网关来实现 鉴权、动态路由等等操作。Gateway就是我们服务的统一入口。
5.3.核心概念
路由(route): 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
断言(Predicate): Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
过滤器(Filter): 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理 。