单体式应用程序 Monolithic Application
Monolithic Application 指单层的应用程序,其用户界面和资料存取程式整合在单一系统平台上的一个程式里
Monolithic Application 缺点
- 难以扩展(scale)
- 交付时间长、开发慢(焦油坑)
- 复杂、维护困难
- 故障率高
微服务 Microservice
Microservice 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块(Small Building Blocks)为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的 API 集相互通信
每一个服务中只有一小块代码,只对外提供一个服务
- 整个应用按照业务拆分,互相使用 RPC | HTTP | REST 通信
- 松散耦合
- 独立开发、测试、部署、演进
- 不限制语言
RPC
Remote Procedure Call 远程过程调用是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC 是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接收回应进行信息交互的系统
开发一个微服务
- 将应用按照业务拆分成模块,每个模块既是一个 Microservice
- 定义接口,模块之间使用接口进行通信
- 开发服务的提供者
- 分别部署
代码方式
Maven 多模块
一个团队维护多个微服务
- 好处:代码放在一起容易管理
- 坏处:界限不明显,放在一起的代码容易被人改
不同项目
不同的团队维护不同的微服务
- 好处:界限清楚
- 坏处:代码不在一起,比较麻烦
Dubbo
分布式 RPC 框架
- 角色 => 消费者 + 提供者 + 注册中心
- 功能 => 负载均衡 + 容错 + 限流 + 降级
Dubbo 服务调用与代理模式
- 当消费者调用接口的时候,接口的背后是 JDK 生成的动态代理,实际上执行的代码是 dubbo 里的
InvokerInvocationHandler
类中的invoke
方法,该方法实现了 JDK 代理标准实现InvocationHandler
,之后转发给RpcInvocation
- 消费者调用一个方法,传递一个参数,代理对象通过 TCP 长连接将方法名、参数、版本等信息发送给远端提供服务的生产者,之后服务的生产者得到响应后,通过 TCP 长连接将响应返回给代理。代理对象可以进行负载均衡、自动重试、服务降级(如果所有的服务都挂了,给到消费者一个默认的实现)、限流等等功能
- 代理模式 => 在调用服务时,服务的具体实现代码在其他地方
- 服务调用 => 分布式注册中心 + 本地缓存 + 长连接
为何使用 TCP 长连接
- TCP 长连接不用重新握手
- 一个服务的生产者对应很多个消费者,每个消费者的代理和生产者维护一个 TCP 长连接会非常有助于性能的提高
知识点
- scale 扩展
- 水平扩展 => horizontal scale => 从一台机器扩展到 n 台机器
- 垂直扩展 => vertical scale => 将一台机器扩展为特别好的机器 => 机器性能有上限
网友评论