微服务之具备的功能
- 微: 开发+测试+运维 人数总和大致在6-10人左右
- 服务:是一个可独立运行的单元组件,每个单元组件运行在独立的进程中,组件之间互相通信采用HTTP这种轻量级的通信机制进行通信。
一:微服务所具备的特点
1:按照业务划分服务,单个服务代码量小,业务单一,易于维护。
2:每个服务有独立的基础组件,且进程独立。
3:微服务之间的通信是通过HTTP或者消息组件,具备容错能力。
4:有服务致力解决方案,服务之间不耦合,随时加入和剔除服务。
5:单个服务可集群化部署,具备负载均衡。
6:整体有安全机制,包括用户验证、权限验证、资源保护等。
7:整个微服务系统有链路追踪功能。
8:有一套完整的实时日志系统。
二:微服务应该体现的几个方面
此处以SpringCloud为例大致讲解
1:服务的发现与注册
服务注册: 向服务注册中心注册一个服务实例,服务提供者将自己的服务信息告知服务注册中心。
服务发现: 服务消费者需要从服务注册中心获取到所需要消费的服务的实例信息。
服务注册中心:
(1):提供服务的健康检查方案,检查被注册的服务是否可用,一般通过心跳机制;
(2):保存服务提供者的服务实例信息(IP、服务名),为服务消费者提供这些实例信息,剔除不可用的服务提供者。
(3):常见的服务注册中心有 Eureka和Zookeeper。
大多数情况下一个服务即是一个消费者也是一个提供者。
2:服务的负载均衡
负载均衡:所有的微服务都向服务注册中心进行注册,服务注册信息持有每个服务的应用名和ip等信息,同事每个服务也会获取所有服务注册列表信息。服务消费者集成负载均衡组件,该组件会向消费者获取服务注册列表信息,并且每隔一段时间重新刷新,当服务消费者进行消费的时候,负载均衡组件就可以通过一定的策略选择一个服务提供者的实例进行消费。
注册中心高可用:服务注册中心要定时检测心跳,还要持有所有服务提供者的实例信息,还要给消费者提供服务者实例信息,此时服务注册中心显得格外重要,所以必须高可用。一般的做法是将服务注册中心集群化,每个服务注册中心的数据实时同步。
3:服务网关
(1):网关将所有的API接口资源统一聚合,对外统一暴露,外界系统调用的API接口都是由网关对外暴露的接口。内部服务不直接对外提供API资源,也可以整合服务,使得外部以为是一个服务在提供服务。
(2):网关可以做一些身份认证、权限认证、防止非法请求接口、接口防刷,对内部服务起到保护作用。
(3):网关可以实现监控功能,实时日志输出,对请求进行记录。
(4):网关可以用来做流量监控,在高流量的情况下,对服务进行降级。
(5):API接口可以从服务分离出来,方便测试。
常见的网关组件有 Zuul、Nginx
4:服务的容错机制
雪崩效应: 实际工作中各个服务之间相互依赖,错综复杂,一个网络请求经常需要调用多个服务才能完成,如果一个服务不可用,会影响到其他服务。一个服务处于阻塞状态,就会导致这个服务的线程资源被消耗殆尽,最终甚至导致系统处于瘫痪状态。
熔断机制: 正常情况下熔断器处于关闭状态,如果某个服务在请求过程中失败次数大于设定阈值,说明服务出现故障,这个时候熔断器就会打开,用户请求会快速执行失败,不执行业务逻辑。一段时间以后,熔断器处于半打开状态,并执行一定数量的请求,其他请求快速失败,若执行的请求失败了,则再次打开熔断器,如果执行成功了,则关闭熔断器。
熔断机制的作用:
(1):隔离资源,一个服务故障不会阻塞整个请求。
(2):服务降级,当大量服务涌入超过服务的处理能力,则熔断器打开,避免服务器因高负载出现故障。
(3):防止雪崩。
5:服务配置的统一管理
(1):ConfigServer读取配置文件仓库的地址信息,配置文件仓库可以是本地仓库,也可以是远程git仓库。
(2):配置服务启动后读取配置文件信息,读取完成后存放在配置服务的内存中。
(3):当其他服务启动时,由于指定了配置服务,所以向配置服务读取配置信息
(4):当服务的配置信息需要更改且更改完成后,想配置服务发送Post请求进行刷新,这时服务就会向配置服务重新读取配置文件。
6:链路追踪
微服务是一个分布式架构的系统,按照业务系统划分服务单元,服务之间又相互调用,错综复杂,一旦发生错误就无法定位,所以在微服务中必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,以及参与的顺序,从而使每个请求链路清晰可见,除了问题就很快定位。常见的链路追踪组件有Dapper和Zipkin、Eagleeye。
7:实时日志
在微服务中,无论是处于开发阶段还是生产环境,日志对开发人员和运维人员至关重要,而微服务调用链又非常之庞大繁琐,所以有必要针对你的微服务,提供一个完整的实时日志。常见的实时日志框架,根据链路追踪Zipkin组件,再整合ELK这种日志解决方案,可以完美的解决分布式下的微服务日志问题。
三:常见微服务框架
1:SpringCloud
SpringCloud是基于SpringBoot的一系列开发组件和框架。能够帮助开发者迅速搭建一个分布式的微服务系统。SpringCloud通过包装其他技术框架实现了一套通过基于注解、java配置和基于模板开发的微服务框架。SpringCloud框架来自于Spring Resource社区,由Pivotal和Netflix两大公司和一些其他的开发者提供技术上的迭代更新。SpringCloud提供了开发分布式微服务系统的一些常用组件,例如服务注册和服务发现、配置中心,熔断器、智能路由、微代理、控制总线、全局锁、分布式会话等等。
- 常用组件
- 服务注册和服务发现 Eureka
- 熔断器组件Hystrix
- 负载均衡组件Ribbon
- 路由网关Zuul
- 服务配置中心Spring Cloud Config
- 安全模块组件Spring Cloud Security
- 服务链追踪组件Spring Cloud Sleuth
- 数据流操作组件Spring Cloud Stream
2:Dubbo
Dubbo是一个阿里巴巴开源的分布式微服务里框架,致力于提供高性能和透明化的RPC调用方案,以及SOA服务治理方案。
- 核心内容
- RPC远程调用: 封装了NIO框架Netty、Mina等,采用多线程模式。
- 集群容错:提供了基于接口调用方法的远程调用功能,并实现负载均衡、失败容错。
- 服务发现:基于Zookeeper组件,用户服务发现和服务注册。
Link1:Dubbo官方社区
3:gRPC
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
Link1:gRPC官方中文文档
Link2:个人搭建的gRPC的Demo,基于Gradle
4:Thrift
Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码。类似于gRPC,实现服务端与客户端代码,支持异构语言,并且支持多种传输协议。
Link1:thrift官方文档
四:小结
1:本文以SpringCloud为基础概念,简要的陈列了构建微服务时需要注意的内容。
2:简单介绍四种微服务框架。
五:问题总结
1:属于概念性内容,缺少代码部分,后续实现。
2:对SpringBoot的内容一笔带过,具体希望能看我此系列前面的帖子。
3:因个人缺乏实践,所以内容可能不全面,还请大家多多指正。