本篇博客是对我的偶像撸帝讲解微服务架构做的总结,第一次用这么长的名字做题目。看本篇博客前一定要看以下这篇博客。
RPC框架—Dubbo的由来到微服务架构(分布式系统开发)演进过程
1.什么是微服务?
微服务架构是一种思想,采用的开发方式是分布式系统开发,架构就是为了解耦,分布式系统开发一定会遇到四个问题。
2.微服务架构需满足三大指标
2.1高可用:一直可以用
k8s,自动重启,自动扩 / 缩容, 主要解决单点故障。
2.2高并发
垂直扩展(对单台机器进行硬件升级)
水平扩展(扩展多台机器,实现多台并行工作,减少单台压力),负载均衡,集群
2.3高性能
rpc通信,以及Kyro高速序列化
HikariCp 连接池,高速连接数据库
SQL优化 , Redis 缓存
JVM优化,GC优化
3.微服务需要解决的四大问题
服务这么多,客户端是如何访问的
服务这么多,服务和服务之间是如何通信的
服务这么多,服务是如何管理的
服务这么多,服务挂掉了怎么办
4.四大问题
4.1服务这么多,客户端是如何访问的
如下图:许多服务分布在不同的服务器上面,客户端难道需要记录各个服务器的IP,然后根据IP地址去访问?——永远不可能
我们要知道如果各个服务在同一局域网中,客户端也是无法访问的,必须通过网关访问各个服务。
解决方案(如下图):
需要有一个统一的网关(API Gateway
),客户端只需要记住一台服务器IP,这台服务器提供一个统一的服务入口。
这台服务器聚合后台服务,节省流量,可以提供安全、过滤、流控等API管理功能。有没有一种外观设计模式和代理设计模式的思想。
此时产生了一个问题,API Getway单点故障,如果该服务器挂掉,所有的服务将无法使用。
4.2服务这么多,服务和服务之间是如何通信的
4.2.1同步通信 ——对内RPC,对外REST
同步通信有两种,一种是HTTP通信,一种是RPC通信方式,且这两种方式有所不同。
服务不在一个局域网中,服务之间通信是HTTP通信,不在一个局域网中就存在跨防火墙的问题。HTTP是无状态的,网络传输过程成中认识字符串,然而计算机只认识二进制,此时需要将对象转化为json字符串,然后将json字符串转换为二进制文件,需要序列化两次和反序列化两次,传输效率低。
服务在一个局域网中,服务之间通信是RPC通信,同一个局域网没有防火墙,则只序列化和反序列化只需要一次。
4.2.2异步通信
消息队列,例如kafka rabbitmq Notify
4.3服务这么多,服务是如何管理的
服务这么多,如果记录每一服务的IP是相当费时间的,此时我们想,如果一个服务器不能使用,则还需要更新服务。
如果此时有一个服务注册与发现中心,每个服务将自己的信息注册到服务注册与发现中心,当发现服务挂掉以后,该中心自动更新服务并通知给客户端或者其它服务,该服务已经挂掉了,你们将无法使用。而客户端或者其它服务只需要去服务注册中心请求自己需要的服务。——是否用到了观察者模式???
4.4服务这么多,服务挂掉了怎么办?
服务注册与发现中心管理各个服务,如果该中心挂掉了,所有的服务都将无法使用。此时我们考虑为什么服务注册于发现中心会挂掉???。——所有的鸡蛋(服务)不要放在一个篮子里(服务注册与发现中心)
挂掉的原因(网络中断,请求过多,服务器处理不过来)
网络中断
重试,多次重试连接
请求过多,服务器处理不过来
限流,让后来的请求排队。
负载均衡,水平扩展多个服务注册发现中心。
熔断机制,当请求超过一定数量,停止请求服务。
降级(保证主要业务可用)