高效稳定 · 简洁易用 · 灵活扩展

项目地址:lemon-echo微服务架构

weiecho微服务架构是基于springcloud + consul的微服务框架设计体系,以人员、时效、成本、品质为基础设计思路,极度适用于小中型开发设计团队,可通过简单调整扩展支持中大型开发设计团队。框架设计过程中整合实际项目经验,利用接口化、消息队列、模块化、服务化、异步化等技术方案保障服务稳定性和可扩展性。

根据互联网产品多年经验分析,我们的产品无论从任何角度为切入点,最终都希望完成用户支付-服务的闭环思维,在weiecho的架构体系设计时期直接将用户、帐户、商品、订单、交易、消息作为功能架构的基础模块体系,从而结合实际项目体系完成整体微服务体系搭建,以协助团队快速集成完善的开发结构体系。

依托功能预代入模式的完善架构体系思想,后续功能开发仅需对相应业务逻辑进行部分调整、增加对应的服务模块(如IM、聊天室等),利用类似二次开发方式极大降低开发团队的技术壁垒,降低微服务开发及治理难度,结合代码快速生成器可以在10分钟内完成简单功能开发,非常快发迭代开发的技术团队,尤其适用于50人以下的技术开发团队。

规划架构说明

weiecho架构考虑多设备、多应用场景,从应用入口区分了各类应用入口的控制和管理,在功能方面分为应用入口、服务网关、核心服务、公共模块、风控模块、运营管理后台、数据支持等模块。

应用入口

应用入口可以接受APP、WEB、小程序、A应用、B应用、外部应用等应用接入,利用服务的项目管理功能可以实现无限扩展的应用接入方式,从而达到类中台的服务架构体系。

服务网关

服务网关主要考虑安全、流控、风控等风险因素,接入参数验证、身份验证、路由策略、流控策略、风控验证等安全模块,保障整体服务安全稳定运行。

核心服务

核心服务为项目主要业务服务,目前规划分为聚合服务、用户服务、帐户服务、商品服务、订单服务、交易服务、对账服务、清算服务、消息服务、授权服务、营销服务、售后服务等。市场运营需求可以增加推广服务、广告服务,即时沟通类需求可以扩展IM服务,直播类需求可以扩展直播服务,打赏服务等。

公共模块

公共模块作为业务的支持服务,主要包含授权服务、报警服务、消息服务、单号生成器、注册中心、配置中心、定时任务、分布式锁、分库分表模块,服务成熟后可逐步考虑接入生物识别、内容识别、数据服务等模块。

风控模块

风控模块为服务安全等核心领域,包含安全认证、资质审查、用户分级、黑白名单、风险预警、风险处置、支付风险、信用风险、征信相关等,可以根据需要完善该模块内容保障整体服务等安全性。

运营管理后台

运营管理后台为管理整个服务的入口,通过精确的权限管控分配用户是使用功能,对系统用户、帐户、订单、交易、对账、投诉等信息的查看和维护操作。

数据支持

数据支持分为内部数据支持和三方支持,其中内部数据支持包含mysql、redis、rabbit mq、promethes、elk、innerdb等,三方支持包含短信服务、消息服务、OSS文件存储、支付通道、实名认证、生物检测等功能。

部署架构说明

用户访问APP、WEB、H5页面通过LBS算法调用到最佳的nginx服务器,nginx通过规则转发调用到指定的服务或服务网关,gatway经过鉴权、风控等安全校验后通过consul注册中心LB路由到指定的业务服务,业务服务根据需要调用对应的数据支持端、RPC服务短信或第三方服务端,完成业务功能后返回对应的数据。

整个部署架构分为入口访问组、核心服务组、基础支撑组和服务监控组。

1、LBS域名指向服务域名,开通https、防ddocs等安全性功能。

2、入口访问组包含nginx、potal web、activity web、gateway服务,nginx需要开通外网流量权限,gateway需打通与核心业务组网段调用,potal web和activity web为前端网页服务,可视情况与nginx服务同机器部署或单独部署。

3、核心服务组根据各服务压测和预估QPS状况,部署相应量级的服务节点,为保障服务高可用,每个服务至少部署两个节点。

4、基础支撑组需开放核心业务组网络相互访问,部署consul注册中心集群,consul集群请独立部署并至少部署3个server节点和2+个client节点,DB至少保证主从节点配置,rabbitmq集群使用镜像模式保障服务的高可用,redis根据服务需要主从、集群部署,其他支持服务根据需要部署相应套件。

服务监控组需开放核心业务组网络相互访问,zabbix、prometheus、zipkin server根据服务需要部署相应节点套件,ELK部署至少3个master节点和3个data节点,数据节点建议内存30G,master节点建议10G,聚合节点等根据需要配置,日志类索引根据需要设置n*3个Primaries(如无特殊需要Replicas设置为0),日志索引名称按天存储。日志收集采用filebeat -> kafka -> logstash -> elasticsearch套件,logstash路由pipeline简化配置和服务管理。

控制中心模块

服务网关 gateway

服务网关基于springcloud原生gateway实现,为整个微服务架构提供简单、有效和统一的API路由管理方式,结合服务的授权体系、风控体系、sentinel流控体系、swagger接口文档等方便统一的管理微服务体系,同时保障服务的安全稳定运行。

流控后台 sentinel-dashboard

sentinel流控后台是面向微服务的轻量级流量控制框架,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

任务调度 xxl-job-admin

xxl-job任务调度中心是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

链路追踪 zipkin

zipkin链路追踪基于 Google Dapper 实现,用来收集各个服务器上请求链路的跟踪数据,并通过提供的 REST API 接口来辅助查询跟踪数据以实现对分布式系统的监控程序,从而及时发现系统中的存在的风险性问题。

公共组建模块

公共配置 configurator

公共配置模块整理和优化了服务的常用配置,采用配置但不启用的方式进行标准化处理,服务仅需继承相应类并加上注解@Configuration就可以启用功能。

公共资源 framework

公共资源模块聚合类一些常用但公共处理类,增强服务语法的统一性和功能的准确性,减少大量重复造轮子的现象。

序列号组件 serialno

序列号生成组件能够自动产生指定功能的递增序列号,采用服务独立自主管理序列号的方式,降低使用独立序列号服务的耦合性,采用redis作为预生成序列号池缓存区,加速服务的ID获取的处理速度。

消息组件封装 rabbit-mq

消息组件封装默认封装的是rabbit的topic模式,结合延迟插件默认生成普通topic交换机和延迟队列交换机,在生产端调用发送消息是是否为延迟消息,消费配置queue时选择是否为延迟队列。一般情况下topic模式+延迟队列能够完全满足服务的各种消息需求。

分布式锁组件 distribution-lock

分布式锁组件提供了分布式服务锁的功能,采用redis作为锁的计算核心,可以直接在方法上注解声明锁,同时采用注解方法参数作为降低锁粒度,从而更加灵活完善的支撑业务功能。

分库分表组件 sharding-db

分库分表组件封装了sharding-jdbc作为功能内核,调整优化了配置方式和支持类型,可在大量不改变配置文件的状况扩展出单库数据源、主从数据源、分库数据源三种配置模式,极大的方便服务升级改造。

流控降级组件 sentinel-client

流控降级组件封装了sentinel作为功能内核,调整优化了分布式配置存取、实时监控数据持久存储和流控熔断异常处理逻辑,可以实时查看服务状况、动态调整服务的熔断或流控阈值,结合流控熔断监控报警实时保障服务的安全稳定。

标准服务结构

weiecho标准服务包含xxx-app(服务启动入口)、xxx-core(业务功能核心)、xxx-enum(服务全局枚举)、xxx-job(定时任务包)、xxx-rpc(rpc服务接口SDK)模块,考虑初期业务量、维护人员、服务维护难度及大部分微服务功能等状况,标准服务结构采用单服务聚合部署方式,降低开发维护难度,加速服务业务功能迭代开发上线。

本框架为保障服务接口的安全及一致性,利用强约束的方式保障所有问题暴露在上线部署前,约定服务提供方编写远程调用接口SDK提供给调用方。

模块继承规则:

1、xxx-app可引入xxx-core、xxx-job、xxx-rpc模块;

2、xxx-core可引入xxx-enum模块,支撑业务核心功能模块,可服务业务量状况拆分出event(MQ事件)模块走独立服务入口;

3、xxx-job根据需要使用xxx-app服务入口或独立服务走任务服务入口;

4、xxx-rpc可引入xxx-enum模块,也可以根据需要使用xxx-app服务入口或独立服务走任务服务入口。

服务启动入口 xxx-app

xxxApplication.java为服务启动入口类,主要包含springboot服务启动main方法和部分启动注解;

cn.echo.xxx.config为服务配置包,主要包含服务初始化各项配置类,如:database、redis、cache、mq、mvc、job等配置;

cn.echo.xxx.controller为接口控制包,包含api(业务接口)、portal(后台接口)、rpc(rpc接口)控制实现类,其中rpc为继承xxx-rpc模块等实现类;

cn.echo.xxx.execption为服务异常处理包,默认包含GlobalExceptionHandler继承实现全局异常处理类cn.echo.framework.response.DefaultGlobalExceptionHandler。

业务功能核心 xxx-core

cn.echo.xxx.core.dao为数据处理包,主要包含mybatis调用数据源接口类;

cn.echo.xxx.core.entity为数据实体包,主要包含数据库表对应字段实体类;

cn.echo.xxx.core.pojo为业务实体包,主要为业务上下文封装需要的相关实体类;

cn.echo.xxx.core.event为MQ事件包,主要包含constant(常量)、receiver(接收处理)、sender(发送处理),其中constant主要包含queue、routing key常量定义;

cn.echo.xxx.core.service为业务逻辑接口包,主要定义业务逻辑功能接口,impl为逻辑接口的实现类。

服务全局枚举 xxx-enum

cn.echo.xxx.em.enums为全局枚举包,主要配合业务需要定义各类枚举;

cn.echo.xxx.em.response为全局服务响应码包,主要特殊业务状况下返回的信息提示码(警告、异常等),此异常码在服务创建时统一分配前缀,各服务维护自己的异常码,异常码类继承自框架类cn.echo.framework.response.ResultCode。

定时任务包 xxx-job

cn.echo.xxx.job为定时任务实现包,利用xxljob实现任务调度工作,根据最新2.2.0版本实现,在方法体注解@XxlJob(“xxxHandler”)并按照官方语法即可完成任务开发,结合后台配置规则实现动态任务调度管理。

远程调用接口SDK xxx-rpc

cn.echo.xxx.rpc.client远程调用SDK接口包,用于定义FeignClient提供给调用方的接口;

cn.echo.xxx.rpc.dto远程调用SDK接口实体包,主要为SDK接口上下文封装需要的相关实体类。