传统方式 VS 微服务
传统开发方式遇到的问题:
简单说:
微服务的目的是有效的拆分应用,实现敏捷开发部署。
官方对于微服务的定义:
微服务标准:
使用微服务的问题:
之前的UI和服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,每个服务都跑着独立的虚拟机上的JAVA进程中。后台有N个服务,客户端就需要记住N个服务,一个服务下线/更新/升级,前台都需要重新部署。N个服务的调用也是不小的网络开销,用户授权管理需要统一。
所以一般在客户端和N个服务之间,建立代理或者API Gateway:
所有服务都是独立的JAVA进程跑在独立的虚拟机上,所以服务间的通信是IPC,有很多成熟的解决方案,通用的有两种方式:
同步调用:
简单,一致性强,容易出调用问题,性能体验会差一些,调用层次多的时候可能耗时。 REST基于HTTP,更易实现,更易接受,服务端实现更加灵活,各个语言都能支持,同时能跨客户端,对客户端没有特殊要求,使用更广。 RPC有自己的优点,传输协议更高效,安全性更可控。
异步调用:
降低系统服务之间耦合,为调用之间建立缓冲,确保消息积压不会冲垮被调用方; 需要付出一致性代价,后台服务一般需要实现幂等性,因为消息发送出于性能考量一般会重复; 需要引入独立的broker,对broker分布式管理也是一个挑战;
一般一个服务有多份拷贝,做负载均衡。一个服务随时可能下线,也可能面临访问压力时增加新服务节点。 服务之间如何感知?服务如何管理?
单体应用风险是鸡蛋放在一个篮子中,分布式的特征是网络不可靠。所以当系统由一些列服务调用链组成的时候,必须确保任何环节不出问题而影响整个链路。手段如下:
最后提到微服务离不开DevOps和Docker,理解微服务架构是核心,devops和docker是工具,是手段。