微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关(Language-Independent/Language agnostic) 的 API 集相互通信。
目前与微服务有关的平台/框架:Spring Cloud, Service Fabric,Linkerd,Envoy,Istio …
应用开发后随着业务量变大,单机计算存储不能满足要求后,部署时会像分布式架构转变
分布式系统是若干独立计算机的集合,这计算机对用户来说就像单个相关系统
即使分布式系统无法做到强一致性,也可以采用适当的方法达到最终一致性。
熔断策略、负载均衡、服务发现、认证和授权、quota限制、trace和监控等等
利用框架实现分布式系统通信需要的各种通用语义功能,如负载均衡和服务发现等,因此一定程度上屏蔽了这些通信细节。例如:spring cloud/dubbo
但是微服务框架存在一些问题
其一,虽然框架本身屏蔽了分布式系统通信的一些通用功能实现细节,但开发者却要花更多精力去掌握和管理复杂的框架本身,在实际应用中,去追踪和解决框架出现的问题也绝非易事;
其二,开发框架通常只支持一种或几种特定的语言,回过头来看文章最开始对微服务的定义,一个重要的特性就是语言无关,但那些没有框架支持的语言编写的服务,很难融入面向微服务的架构体系,想因地制宜的用多种语言实现架构体系中的不同模块也很难做到;
其三,框架以lib库的形式和服务联编,复杂项目依赖时的库版本兼容问题非常棘手,同时,框架库的升级也无法对服务透明,服务会因为和业务无关的lib库升级而被迫升级;
sidecar(边车模式),例如Linkerd,Envoy,NginxMesh
将分布式服务的通信抽象为单独一层,在这一层中实现负载均衡、服务发现、认证授权、监控追踪、流量控制等分布式系统所需要的功能,作为一个和服务对等的代理服务,和服务部署在一起,接管服务的流量,通过代理之间的通信间接完成服务之间的通信
提供了统一的上层运维入口,演化出了集中式的控制面板,所有的单机代理组件通过和控制面板交互进行网络拓扑策略的更新和单机数据的汇报。这就是以Istio为代表的第二代Service Mesh
在软件架构中,服务网格是一个专用的基础设施层,用于使用代理促进服务或微服务之间的服务到服务通信。专用通信层可以提供许多好处,例如提供对通信的可观察性,提供安全连接,或自动重试和回退失败的请求。
服务网格由与应用程序中的每个服务配对的网络代理和一组任务管理流程组成。代理称为数据平面,管理进程称为控制平面。数据平面拦截不同服务之间的调用并“处理”它们;控制平面是网格的大脑,负责协调代理的行为,并为运维人员提供 API 来操作和观察整个网络
服务网格是仅针对“微服务”可用吗?
不是的,有服务就可以使用,适用于容器化业务后的服务治理
治理内容包括:连接、安全、策略执行和可观察性
控制面有很多软件,Istio胜出
数据面有很多软件,Envoy胜出
在控制平面上,Istio由三个组件( Pilot、Citadel、Galley )整合成了一个单进程、多模块的istiod
数据面上,pod启动后内部组成如下
实际会创建3个容器
1、pilot-agent:pilot-agent是istio-proxy的入口进程,负责envoy进程的生命周期管理。pilot-agent会生成启动envoy进程需要加载的静态配置文件,启动envoy进程,监控和管理envoy进程的状态,如envoy出错时重启envoy,或envoy配置变更后reload envoy
2、envoy启动时读取pilot-agent提供的静态配置文件:etc/istio/proxy/envoy-rev0.json,获得控制面Pilot地址,通过访问Pilot提供的接口,获取动态配置信息(如Cluster信息、Endpoint信息、Route信息等),根据配置信息进行服务间通信及服务管理
https://philcalcado.com/2017/08/03/pattern_service_mesh.html
https://blog.csdn.net/h2604396739/article/details/115869669
https://www.itdaan.com/tw/7e0a437fc6e5511166589e35f2856aec
https://zhuanlan.zhihu.com/p/499341027
https://zhuanlan.zhihu.com/p/504313570
https://zhuanlan.zhihu.com/p/61901608