微服务中「组件」集成

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: 在微服务工程的技术选型中,会涉及到很多组件的集成,最常用包括:缓存、消息队列、搜索、定时任务、存储等几个方面;随着系统的服务数量上升,统一管理各种组件的复杂度也会提高;

有品:There is no silver bullet;

一、简介

在微服务工程的技术选型中,会涉及到很多组件的集成,最常用包括:缓存、消息队列、搜索、定时任务、存储等几个方面;

如果工程是单服务,对于集成组件的管理来说并不算复杂;但是在分布式的多服务系统中,随着拆分的服务数量上升,统一管理各种组件的复杂度也会提高;

1.png

如上图,是团队内部维护的一份重要的系统清单:描述整个微服务体系中核心组件的依赖情况;【并不完整】

在整个工程内部拆分了几十个服务,基于一份系统架构图和一份组件依赖清单,如果熟悉微服务架构模式,可以非常快速的了解系统的基础原理和结构;

复杂系统对于中间件的依赖很重,需要在实践过程中不断的积累和总结经验,持续优化各种组件的应用策略;

对于组件来说,与项目工程的集成模式,核心的应用场景,以及在业务场景中的迭代优化,是研发需要重点关注的方面;

二、缓存管理

【集成模式】

Redis作为最常见的缓存选型,在与分布式工程集成时,其形式也存在很大的灵活度;

2.png

单服务:在分布式工程中,如果服务使用独立的Redis组件,通常是该服务支持的业务场景比较独特,比如高并发或者数据体量较大等;

分布式服务:微服务常见的集成方式,不同的服务使用同一个Redis的不同DB编号,其他服务必须通过该服务的接口访问其缓存数据;

缓存中心:整个工程基于一个缓存中心服务来管理,其适配的业务场景比较特殊,多个服务紧密协作,调度和处理相同的数据主体;

在实际的分布式系统中,通常是模式一模式二两种都采用,而模式三更多的是应对特殊的需求场景;

【应用方式】

虽然Redis可以极大的提升效率,但是在实际的应用中,涉及最多的就是数据缓存和加锁两个核心能力,对于组件的API使用并不算复杂;

3.png

无论是在框架层面的浅封装一层,还是围绕Redis组件编写常用的工具方法,都可以很好的实现工程和Redis相关API之间的解耦;不同服务之间缓存数据获取,需要通过各个服务提供的接口进行查询;

三、消息队列

【集成模式】

Kafka作为消息队列的常见技术选型,在与分布式工程集成时,在设计上会围绕消息生产和消费的基本模式;

4.png

服务内集成:在各个服务内部直接引入消息组件,服务可能是消息生产者也可能是消费者,当重度依赖消息通信时,流程可维护性比较差;

消息服务封装:单独封装消息生产消费两个服务,来统一调度和管理消息通信,虽然提高了技术面的复杂度,但是极大降低了异步流程的管理难度;

在实际应用时,如果工程内对于消息的使用并不高频,通常是采用模式一的策略,建议做好流程注释和文档维护;如果消息使用非常高频,可以考虑模式二的策略,减轻组件维护的难度;

【应用方式】

生产和消费能力追求平衡,即便有偏差也只能是消息的【消费】大于【生产】的效率,才能避免消息堆积从而影响正常的业务流程;

5.png

实践来看单纯的基于MQ的重试机制,并不能稳定的解决分布式架构中复杂流程的中断问题,需要围绕消息的存储设计相应的调度策略,从而推动整个流程的完整执行,无论是向下推进还是向前回滚;

四、搜索引擎

【集成模式】

对于搜索引擎Elasticsearch来说,个人感觉在常规业务场景中是最容易出问题的组件,使用ES索引的数据模型,通常结构复杂并且数据体量偏大,还涉及到大量的检索条件;

6.png

服务内管理索引和数据:通常是核心的业务场景,对数据的实时性要求极高,从常规的架构设计来考虑,虽然索引相关的结构和数据可能来自多个数据库,但是其管理的接口会统一封装在业务联系最密切的服务内;

独立组件管理索引数据:基于独立的组件(常用Logstash)进行调度,动态地采集、转换和传输数据,不受格式或复杂度的影响,数据往往以各种各样的形式,或分散或集中地存在于很多系统中;

无论是模式一还是模式二,都是ES常用的集成策略,比如模式一对于核心数据模型的构建,常见于订单或商品等,模式二的经典用法之一ELK日志采集等;

【应用方式】

以服务内部管理索引的方式来说,多数情况下索引的结构会不断的扩展,结构更新必然也会引起数据和检索条件的同步更新,如果是结构新增的方式更新,管理难度并不大,但是已有字段的类型更新,还需要索引重建;

7.png

对于ES这种操作起来比较复杂的技术组件,建议是把各种常用的操作编写程序脚本来处理,并且开发相应的管理功能,用更加稳定可控的方式来管理索引的结构和数据调度;

五、定时任务

【集成模式】

Quartz任务调度组件,在分布式系统中并不算复杂,基于定时器去触发各种任务执行即可;

8.png

服务内构建定时器:在一些简单的相对独立的服务中,可以在服务内配置定时器,去执行相应的任务流程,这种模式在复杂的分布式系统中很难维护;

独立的任务调度服务:可以统一管理任务的调度策略和执行方式(比如同步或异步),同时对任务调度服务进行监控和维护,以此确保任务调度系统的稳定性和可靠性;

通常模式一只会在个别独立的服务中采用,对于模式二来说,封装独立的任务调度服务,可以统一与其他服务进行集成或者通信,比如通过消息服务及时通知失败的任务等;

【应用方式】

在任务调度服务中,难免要和其他服务进行通信交互,从而触发相关任务的执行,如果系统内部定时任务不多的话,可以采用feign接口的方式触发,如果任务非常多,可以考虑直接构建Http请求的方式,避免服务频繁的升级迭代;

9.png

在调度任务中可能存在数据体量比较大的场景,通常就是采用分片算法加线程池并发处理的策略,但是前提也要优化好数据查询和任务处理流程,从整体上提升任务的执行效率;

六、数据存储

【集成模式】

以MySQL为代表的数据存储是系统中最核心的一层,其集成的形式也是灵活多变,与存储层相关的组件更是五花八门;

10.png

多服务共用数据库:对于模式一来说,在相对简单的系统中比较常用,或者服务和数据库本身偏向通用的功能性质,可以采用这种策略;

服务和库的拆分模式二是分布式架构中最常用的设计,每个服务都具有自己相应的独立数据库,其他服务想要访问必须通过调用相应服务提供的接口才可以;

多数据源模式:在一个服务内集成多个数据源,像模式三读写分离和模式四分库分表,这是偏数据服务的业务场景中经常使用的模式;

对于系统中的数据源管理本身就是一件复杂的事情,需要兼顾各个方面,比如数据读写性能,数据安全,以及服务的稳定性等;

【应用方式】

在常规的微服务工程中,通常每个服务都会使用各自独立的数据库,在多数据源的集成模式中,常用的逻辑就是动态路由、读写分离、分库分表等,如果逻辑简单可以自定义封装,如果逻辑复杂可以使用成熟的组件;

11.png

服务集成多数据源的模式中,存在一个比较明显的复杂问题,如何在不停止服务的情况下,进行数据源的动态管理,此前实践过的模式:提供不同数据源的适配服务来实现各自的策略,在完成数据源的动态调整后,停止其中旧服务即可,虽然流程偏重偏复杂,但是稳定可靠;

七、参考源码

编程文档:
https://gitee.com/cicadasmile/butte-java-note

应用仓库:
https://gitee.com/cicadasmile/butte-flyer-parent
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
监控 负载均衡 算法
构建高效微服务架构的五大核心组件
【4月更文挑战第6天】随着现代业务需求的多样化和复杂性增加,传统的单体应用已无法满足快速迭代与灵活部署的需求。微服务架构应运而生,以其高度模块化、独立部署和可伸缩性成为企业转型的关键。本文聚焦于构建高效微服务架构的核心组件,从服务发现、配置管理、负载均衡、容错处理到服务监控五个方面进行深入剖析,旨在提供一套全面的技术指南以支持后端开发的最佳实践。
|
3月前
|
项目管理 微服务
云效常见问题之将多个微服务应用集成到一次研发流程中发布上线如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
|
3天前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
14天前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
16天前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
70 2
|
17天前
|
监控 负载均衡 Java
(九)漫谈分布式之微服务组件篇:探索分布式环境下各核心组件的必要性!
本文将深入探讨微服务中各个组件的必要性,以此帮助各位更好地加深对分布式系统的掌握度。
|
3天前
|
存储 缓存 Java
Eureka原理与实践:深入探索微服务架构的核心组件
在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理,并通过实践案例展示其在实际项目中的应用,以期为开发者提供一个高端、深入的视角。
10 0
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
1月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
|
1月前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成