一 springCloud核心组件
场景:用户现在需要下单购买东西 需要订单系统 库存系统 仓储系统发货 积分系统 不太可能用单块的架构 支撑的用户量太少了,1000用户可以单块架构
分布式系统:部署到独立的系统上
组件有哪些?
①:分布式系统都有一个服务注册中心:eurake
例如 库存系统一启动,
(服务发现):把已经注册的服务地址和端口拉取下来,存在机器本地
(服务注册)就要去注册中心eurake去注册表中记录系统存在哪台服务器哪台端口
②feign:服务调用(http调用)
③ribbon:负载均衡:例如库存系统部署两台机器,启动之后进行注册的时候,在注册中心
注册的时候 会通知其他的机器把最新的注册表都拉取下来
![](https://img2020.cnblogs.com/blog/1638939/202009/1638939-20200904142501057-1221711743.png)
此时存在两个库存系统,feign去调用哪个服务呢?需要用到ribbon
ribbon通过负载均衡(相当于轮询)算法选出本次调用请求到哪台服务器,然后告知feign
④ zuul:网关
这么多系统,包含了二十多个子系统,每个系统二十多个接口,400个接口都直接对外暴露,前端同学直接调用,不太现实,所以引入了网关
zuul通过服务注册中心都能感知到所有的服务的地址,
前端把请求发送给网关,网关通过服务路由把请求路由到服务器上。
高可用里面也可以灰度发布,统一降级,熔断,限流,授权认证,都可以实现
其他的一些组件:hystrix,链路追踪,bus hystrix熔断的框架,熔断方案,资源隔离,降级机制等很多都需要处理
二 dubbo的底层架构原理
消费者调用流程原理:
①调用的时候会生成一个动态代理类 然后动态代理类由原本的类型去进行引用,直接进行调用
②如果是多台提供者,都会在注册中心进行服务注册,消费者肯定是能感知到服务的机器列表,此时调用的时候会去找cluster,通过loadBalance负载均衡去挑选出一台机器。
③接下来就会走协议这一层(http rmi,dubbo等协议)
请求的数据以什么样的格式来发送请求呢?通过Protocal选折一种协议。
如果是http 可能就是/demoservice/sayHello?name=leo
如果是rmi可能是另外的格式和样子发送请求
如果是dubbo可能是另外一种形式......
④对于协议组织好的数据通过exchange封装数据
⑤然后通过netty/mina网络框架 将封装的数据将序列化, 将请求通过网络发送到服务的端口
⑥发送到端口,收到请求,接收端通过(基于netty)server监听端口
⑦通过exchange数据解析request
⑧ 通过protocal选折一种协议解析请求
⑨找到动态代理 然后最后找到implement 实现逻辑
三 dubbo的底层网络通信原理
netty是基于nio实现的,一台机器抗住高并发
1 服务提供端存在一个acceptor线程,通过selector组件轮询网络事件-->通过serverSockerChanel-监听->端口号
![](https://img2020.cnblogs.com/blog/1638939/202009/1638939-20200904142619283-456681730.png)
2.每一个服务消费端也通过netty和提供端建立连接
![](https://img2020.cnblogs.com/blog/1638939/202009/1638939-20200904142659771-52828425.png)
3. 如果多个请求过来 会通过ServerSockerChanel建立连接之后变成一个socketChannel,通过selector组件给processor线程,processor就会感知到
接下来就会解析请求 然后给服务提供者
![](https://img2020.cnblogs.com/blog/1638939/202009/1638939-20200904142729372-140113374.png)
4 建立连接,消费端也会存在socketChanel,对于响应也是通过processer线程返回给消费者
![](https://img2020.cnblogs.com/blog/1638939/202009/1638939-20200904142832700-254787364.png)