1.Spring Cloud
简介
1.1.
简介
Spring Cloud
是
Spring
旗下的项目之一,
官网地址:
http://projects.spring.io/spring-cloud/
Spring
最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。
Spring Cloud
也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路
由,
负载均衡,熔断器,控制总线,集群状态等等
功能。其主要涉及的组件
包括:
Netflflix
Eureka
:
注册中心
Zuul
:服务网关
Ribbon
:
负载均衡
Feign
:服务
调用
Hystrix
:熔断器
以上只是其中一部分,架构图:

2.Eureka
注册中心
2.1.Eureka
简介
问题分析
user-service
对外提供服务,需要
对外暴露自己的地址。而
consumer
(
调用者)需要记录服务
提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂
的互联网环境,
一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来
测试、发布上线都会非常麻烦,这与
DevOps
的思想是背道而驰的。
网约车
这就好比是网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多
人想要约车,但是无奈出租车太少,不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人
的。
一个想要,
一个愿意给,就是缺少引子,缺乏管理啊。
此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴
注册,记录你的车型(服务类型),身份信息
(联系方式)。这样提供服务的私家车,在滴滴那里都能找到,一目了然。
此时要叫车的人,只需要打开
APP
,输入你的目的地,选择车型(服务类型),滴滴
自动安排
一个符合需求的车到
你面前,为你服务,完美!
Eureka
做什么?
Eureka
就好比是滴滴,负责管理、记录服务提供者的信息。服务
调用者无需自己寻找服务,而是把自己的需求告诉
Eureka
,然后
Eureka
会把符合你需求的服务告诉你。
同时,服务提供方与
Eureka
之间通过
“
心跳
”
机制进行监控,当某个服务提供方出现问题,
Eureka
自然会把它从服
务列表中剔除。
这就实现了服务的
自动注册、发现、状态监控。
2.2.
原理图
基本架构:

Eureka
:就是服务
注册中心(可以是
一个集群),
对外暴露自己的地址
提供者:启动后向
Eureka
注册自己信息(地址,提供什么服务)
消费者:向
Eureka
订阅服务,
Eureka
会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
心跳
(
续约
)
:提供者定期通过
HTTP
方式向
Eureka
刷新自己的状态
工作原理图解析

2.3.Eureka
详解
接下来我们详细讲解
Eureka
的原理及配置。
2.3.1.
基础架构
Eureka
架构中的三个核心角色:
服务
注册中心
Eureka
的服务端应用,提供服务
注册和发现
功能
提供服务的应用,可以是
Spring Boot
应用,也可以是其它任意技术实现,只要对外提供的是
REST
风格服务即可。
服务消费者
消费应用从
注册中心
获取服务列表,从而得知每个服务方的信息,知道去哪里
调用服务方。
2.4.2.
高可用的
Eureka Server
Eureka Server
即服务的
注册中心,在刚才的案例中,我们只有
一个
EurekaServer
,事实上
EurekaServer
也可以是
一个集群,形成高可用的
Eureka
中心 。
Eureka Server
是
一个
web
应用,可以启动多个实例(配置不同端口)保证
Eureka Server
的高可用
服务同步
多个
Eureka Server
之间也会互相
注册为服务,当服务提供者
注册到
Eureka Server
集群中的某个节点时,该节点会
把服务的信息同步给集群中的每个节点,从而实现数据同步。因此,无论客户端访问到
Eureka Server
集群中的任
意
一个节点,都可以
获取到完整的服务列表信息。
而作为客户端,需要把信息
注册到每个
Eureka
中

如果有三个
Eureka
,则每
一个
EurekaServer
都需要
注册到其它几个
Eureka
服务中。
例如:有三个分别为
10086
、
10087
、
10088
,则:
10086
要
注册到
10087
和
10088
上
10087
要
注册到
10086
和
10088
上
10088
要
注册到
10086
和
10087
上
3.
负载均衡
Ribbon
在刚才的案例中,我们启动了
一个
user-service
,然后通过
discoveryClient
来
获取服务实例信息,然后
获取
ip
和端
口来访问。
但是实际环境中,我们往往会开启很多个
user-service
的集群。此时我们
获取的服务列表中就会有多个,到底该访
问哪
一个呢?
一般这种情况下我们就需要编写
负载均衡算法,在多个实例列表中进行选择。
不过
Eureka
中已经帮我们集成了
负载均衡组件:
Ribbon
,简单
修改代码即可使用。
什么是
Ribbon
:

4.Hystrix
4.1.
简介
主页:
https://github.com/Netflflix/Hystrix/

Hys
tix
是
Netflflix
开源的
一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败。
4.2.
雪崩问题
微服务中,服务间
调用关系错综复杂,
一个请求,可能需要
调用多个微服务接口才能实现,会形成非常复杂的
调用
链路:


例如: 微服务
I
发生异常,请求阻塞,
用户请求就不会得到响应,则
tomcat
的这个线程不会释放,于是越来越多的
用户请求到来,越来越多的线程会阻塞:

服务器
支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成
雪崩效应。
这就好比,
一个汽车生产线,生产不同的汽车,需要使用不同的零件,如果某个零件因为种种原因无法使用,那么
就会造成整台车无法装配,陷入等待零件的状态,直到零件到位,才能继续组装。 此时如果有很多个车型都需要这
个零件,那么整个工厂都将陷入等待的状态,导致所有生产都陷入瘫痪。
一个零件的波及范围不断扩大
Hystrix
解决雪崩问题的手段,主要
包括:
线程隔离
服务降级
5.Feign
5.1.
简介
为什么叫伪装?
Feign
可以把
Rest
的请求进行隐藏,伪装成类似
SpringMVC
的
Controller
一样。你不用再自己拼接
url
,拼接参数等
等操作,一切都交给
Feign
去做。
项目主页:
https://github.com/OpenFeign/feign
6. Spring Cloud Gateway
网关
6.1.
简介
Spring Cloud Gateway
是
Spring
官网基于
Spring 5.0
、
Spring Boot 2.0
、
Project Reactor
等技术开发的网关
服务。
Spring Cloud Gateway
基于
Filter
链提供网关基本
功能:安全、监控/埋点、限流等。
Spring Cloud Gateway
为微服务架构提供简单、有效且统一的
API
路由管理方式。
Spring Cloud Gateway
是替代
Netflflix Zuul
的一套
解决方案。
Spring Cloud Gateway
组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对
应的微服务。
Spring Cloud Gateway
是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点
IP
端口信息,
从而加强安全保护。
Spring Cloud Gateway
本身也是
一个微服务,需要
注册到
Eureka
服务
注册中心。
网关的核心
功能是:过滤和路由
6.2 Gateway
加入后的架构

6.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
将会对请求和响应进行
修改处理
6.4.
快速入门
需求:通过网关系统
lxs-gateway
将包含有
/user
的请求 路由到
http://127.0.0.1:9091/user/
用户
id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。