一、springcloud简介
Spring Cloud是Spring旗下的项目之一,将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等功能。主要包括:
- Eureka:注册中心
- Zuul:服务网关
- Ribbon:负载均衡
- Feign:服务调用
- Hystrix:熔断器
spring架构图:
二、Eureka注册中心
1.说明
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
2.原理图
- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过HTTP方式向Eureka刷新自己的状态
三、Ribbon负载均衡
1.说明
Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 Http 和 TCP 客户端的行为。为 Ribbon 配置服务提供者地址列表后, Ribbon 就可以基于某种负载均衡算法,自动地帮助服务消费者去请求。
2.图示
- Nginx是属于服务器端的负载均衡,Nginx的客户端发起请求不知道会被负载到哪台服务器上,Nginx是进程之间调用时候做的负载均衡
- Ribbon是属于客户端的负载均衡,Ribbon发起的请求都是非常明确的,就像调用本地服务一样,Ribbon是进程内部选择调用时候做的负载均衡
三、Hystrix熔断器
1.说明
Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败。
服务器支持的线程和并发数有限,如果在请求时一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。Hystrix解决雪崩问题的手段,主要包括:线程隔离和服务降级。
2.线程隔离和服务降级
Hystrix 为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。用户的请求故障时,不会被阻塞,也不会导致系统崩溃,相反可以通过手段友好提示用户。服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
四、Feign服务调用
说明
Feign 可以把 Rest 的请求进行隐藏,伪装成类似 SpringMVC 的 Controller 一样。不用再自己拼接url,拼接参数等,一切都可以交给 Feign 去做。Feign 中已经自动集成了 Ribbon 负载均衡,因此不需要自己定义RestTemplate进行负载均衡的配置。Feign 默认也有对 Hystrix 的集成,默认情况下是关闭的。通过修改配置文件:
feign:
hystrix:
enabled: true
开启 Hystrix。
五、Spring Cloud Gateway 网关
1.说明
Spring Cloud Gateway 是Spring官网基于 Spring 5.0、 Spring Boot 2.0、Project Reactor 等技术开发的网关服务,是替代Netflix Zuul的一套解决方案。其组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway 是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway 本身也是一个微服务,需要注册到Eureka服务注册中心。
2.加入 Gateway 后的架构图
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 Filte r和 Global Filter 。过滤器 Filter 将会对请求和响应进行修改处理。
配置文件内容如下:
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
#路由id,可以随意写
- id: bill-service-route
#代理的服务地址
# uri: http://127.0.0.1:9091
uri: lb://bill-service
#路由断言,可以配置映射路径
predicates:
- Path=/api/bill/**
filters:
# 表示过滤1个路径,2表示过滤2个路径,依次类推
- StripPrefix=1
# 自定义过滤器
- MyParam=name
# 默认过滤器,对所有路由都生效
default-filters:
- AddResponseHeader=X-Response-Foo, Bar
- AddResponseHeader=myname, soda
(学习笔记,仅供参考)