选择微服务(摘录)
开头
在技术选择中,有许多标准可供考虑。其中,以下三个是最重要的。
1. 生产水平
我们选择的技术栈旨在解决实际业务问题和生产阻力,而不仅仅是为了简化POC和Demo的展示。我们更注重能够在生产级别上进行运营和维护的成熟、稳定的技术。
2. 一家一線的互聯網公司的成品产品。
我们致力于在一线互联网公司中落地,并采用社区口碑良好的产品,这些产品已经经历了这些公司的流量冲击,并且市场已经几乎完全饱和,同时也受到了社区的认可,形成了一个良好的社区生态。
3. 开源社区的活跃程度
在Github上的stars数量既是一个重要的指标,同时也参考了代码和文档的更新频率(尤其是近年来),这些指标直接反映了开源产品的社群活跃度或生命力。此外,不同企业的工作量和团队规模也会导致技术选择标准的差异,创业者的技术选择和BAT级别的技术选择标准可能完全不同。
以上的3点是,自己的微服务基础设施可以使用云服务来构建和使用一些产品,实际上直接使用云服务会带来各自的优点,但根据实际情况来看,可以根据云服务的使用来做出实际选择。
• 选择服务框架
Spring基于RESTful框架,被认为是一种RESTful框架,序列化协议主要采用基于文本的JSON,通信协议通常基于HTTP。RESTful框架自然地支持跨语言,只要有HTTP客户端,就可以访问调用,但客户端通常需要自行解析负载。目前,Spring框架还支持Swagger契约式编程模型,可以基于契约生成各种语言强类型的客户端。
选择驾驶支持服务
运行时支持服务主要包括服务注册中心、服务路由网关和集中式部署中心。
当服务注册中心选择采用Spring Cloud系统时,会选择Eureka作为注册中心。Eureka经过在Netflix进行大规模生产验证,并支持跨数据中心的功能。客户端可以与Ribbon协同合作,实现灵活的客户端软件负载均衡。
服务网关选择采用Spring Cloud系统,并选择Zuul,Zuul在Netflix进行了大规模的生产验证,并支持灵活的动态过滤器脚本机制。
配置中心、Apolo配置中心、坐席Trip通过生产级别的验证,提供高度可用性。配置将实时生效,并配置审核和版本化,以及生产级别的特性,如多环境多集群支持。
• 服务监控选项
主要包括日志监控、链路监控、指标监控、健康诊断、警报通知等。
ELK目前被认为是日志监控的标准配置。它功能丰富,易于使用。Elastalert是用于ELK的警告通知模块。
目前社群主流是 CAT。根據評論和國內多家互聯網公司的案例來看,CAT 在生產效率和管理能力方面表現出色。此外,CAT 還擁有警報模塊。
指标监控主要依赖于时间序列数据库(TSDB),目前成熟的产品是基于HBase的OpenTSDB,它是Stumble Upon公司开源的。OpenTSDB具有分布式能力,可以横向扩展,比较适合中大型企业使用,因为它相对较重。
此外,还有一些常见的健康检查和警告产品,如Sensu。用户可以针对各种服务(如spring boot暴露的健康检查点、时序数据库的度量指标、ELK的错误日志等)定制灵活的健康检查(check),并设置灵活的警告通知策略来响应检查结果。
• 服务故障类型
Netflix的Hystrix将断路、隔离、限流和降级等功能封装成组件,以应对Java技术栈。无论是何种依赖调用(数据库、服务、缓存)都可以放入Hystrix Command中。封装之后,自动带有容错能力。
•选择后台服务
背景服务主要包括消息系统、分布式缓存、分布式数据访问层和任务调度系统。背景服务是一个相对成熟的领域,许多开源产品基本上一开即用。
消息系统可以根据具体场景,适当定制Kafka的监控和治理能力,实现基于Kafka的适合业务场景的企业级治理能力。
缓存管理倾向于采用客户端直接连接模式,Sohtv开源的cacheccloud提供了生产级别的管理能力,如监控统计、一键启动、自动故障转移、在线扩展和自动化运维等,并且文档相对丰富。
分散式数据访问层采用了Java技术栈和开源的shardingjdbc,仓库逻辑由客户端jdbc驱动承担,直连数据库相对较简单且轻量。
任务调度系统采用开源的xl-job,可以轻松地进行简单任务的配置。
• 选择安全的服务 de
目前,行业中存在着一些标准协议,如OAuth和OpenID Connect,用于处理微服务安全认证系统的阻塞问题。
项目的重要步骤如下:
使用支持OAuth 2.0和OpenID Connect标准协议的许可证服务器。
使用API网关作为统一访问入口,并统一实施安全防护措施。
3. 在访问微服务之前,客户需要首先通过许可证服务器进行注册并获取访问令牌,然后将访问令牌与请求一同发送给网关。
4. 网关获取访问令牌,并向服务器授予权限以检查令牌,并同时进行令牌转换以获取JWT令牌。
5. 网关会将JWT令牌与请求一同转发给后台微服务。
JWT可以作为认证和授权等用途的背景传递的微服务,并且可以存储在微服务之间传递的用户会话信息。
7.每个微服务都包含JWT客户端,可以解码JWT并获取用户会话信息。
8.在整个方案中,访问令牌是通过引用令牌(by reference token)表示的,它可以直接在网络上公开,不包含用户信息。而JWT令牌是通过值传递令牌(by value token),即使可以包含用户信息,也不会在公共网络上公开。
•选择服务部署平台
轻量级容器基础服务部署平台主要包含容器资源调度、发布系统、镜像管理、资源管理、身份访问管理(IAM)等模块。
简单的发布流程如下所示。
- 应用程序在CI集成后生成镜像,用户将镜像推送到镜像管理中心。用户在资产管理中心申请发行,填写应用程序,并公布关于分配数量的信息,等待批准的批准。批准后,开发人员发布控制台以发布应用程序。发布系统会查找资产管理中心并获取发布规格信息。系统向容器云发出启动容器实例指令。容器云从镜像管理中心获取镜像并启动容器。容器内的服务启动后,在服务注册中心注册,然后保持定期心跳。用户发布系统以调用服务注册中心来调整流量,并实现蓝绿、金丝雀或灰度发布等机制。网关和内部微服务客户端定期同步服务注册中心上的服务路由表,根据负载均衡策略将流量传送到新的服务实例上。
此外,持续交付流水线(CD Pipeline)也是微服务发布的重要组成部分,与研发流程密切相关。通常来说,这需要进行定制化,并且镜像控制中心需要封装一个轻量级的治理流程。例如,只有经过环境测试镜像的UAT环境才能升级。只有UAT环境测试的镜像才能升级到生产环境,通过在流水线上设置一些质量门控,以确保高质量的应用程序可以交付给生产环境。