微服务架构案例(02):业务架构设计,系统分层管理
本文源码:github·点这里 || gitee·点这里
更新进度(共6节):
02:业务架构设计,系统分层管理
一、业务架构设计
1、基础概念
服务的架构设计决定软件的业务支撑能力,清晰的业务设计可以帮助开发人员理解系统。在业务架构设计过程中,需要根据用户需求作为核心方向,根据用户需求确定产品设计、框架搭建、服务划分、数据库规划。如果需求比较单一,单个应用服务可以支撑,则不需要设计复杂的微服务系统,如果根据对业务的判断,会在一段时间内出现业务并发,则最好开始的时候就考虑业务的扩展性,架构的支撑能力。
2、案例架构图
基于该项目的架构设计,下面逐个描述一下业务设计。
二、业务流程
1、数据入库服务
- 流程图解
- 流程描述
1. 请求入库服务接口; 2. 搜索数据,通过搜索服务feign接口写入es服务器; 3. 相同的搜索数据,写入用户数据库;
- 程序入口
所属代码包:mopsz-data-form
@restcontroller @requestmapping("/search/data") public class searchdatacontroller { // 调用搜索服务feign接口 @resource private bookinfoesfeign bookinfoesfeign ; @resource private bookinfoservice bookinfoservice ; @requestmapping("/batchsave") public string batchsave (){ // 省略业务代码 } }
2、用户api服务
- 流程图解
- 流程描述
1. 用户请求进入,网关服务拦截; 2. 调用token管理服务,验证用户的身份令牌,使用redis存储token; 3. 如果身份验证通过,则网关放行用户请求; 4. 执行用户搜索请求处理; 5、根据搜索条件,调用es搜索服务,返回结果; 6、将用户的搜索动作进行封装,请求mq服务; 7、mq服务请消息转发到数据分析服务 ; 8、数据分析服务安装策略分析用户请求,存储分析结果;
- 程序入口
(1)、网关拦截
所属代码包:mopsz-cloud-gateway
@component public class filterconfig extends zuulfilter { public static final logger logger = loggerfactory.getlogger(filterconfig.class) ; private static final string get_token = "/token/gettoken"; private static final string verify_token = "/token/verifytoken"; private static final string refresh_token = "/token/refreshtoken"; /** * 拦截处理 */ @override public object run() throws zuulexception { requestcontext requestcontext = requestcontext.getcurrentcontext() ; try { dotokenprocess (requestcontext); } catch (exception e){ logger.info("异常:{}",e.getmessage()); throw new zuulexception(e.getmessage(), 403, e.getmessage()); } return null ; } public void dotokenprocess (requestcontext requestcontext) throws exception { httpservletrequest request = requestcontext.getrequest() ; string requri = request.getrequesturi() ; if (!requri.contains(get_token)) { string token = request.getheader("token") ; boolean flag = usertokenfeign.refreshtoken(token) ; if (!flag){ throw new serviceexception("token 校验失败") ; } logger.info("token 校验通过"); } } }
(2)、token管理
所属代码包:mopsz-basis-token
@restcontroller @requestmapping("/token") public class usertokencontroller implements usertokenfeign { @resource private usertokenservice tokenservice ; /** * 获取token */ @override @requestmapping("/gettoken") public respobject gettoken (@requestparam("username") string username, @requestparam("password") string password){ try { string token = tokenservice.gettoken(username,password) ; return respobject.ok().put(constant.map_key,token) ; } catch (exception e){ e.printstacktrace(); return respobject.error() ; } } /** * 校验token */ @override @requestmapping("/verifytoken") public respobject verifytoken(string token) { try { integer userid = tokenservice.verifytoken(token) ; return respobject.ok().put(constant.map_key,userid) ; } catch (exception e){ e.printstacktrace(); return respobject.error() ; } } /** * 刷新token */ @override @requestmapping("/refreshtoken") public boolean refreshtoken(string token) { try { return tokenservice.refreshtoken(token) ; } catch (exception e){ e.printstacktrace(); return false ; } } }
(3)、搜索接口
所属代码包:mopsz-user-client
@restcontroller @requestmapping("/search/book/") public class booksearchcontroller { @resource private bookinfoesfeign bookinfoesfeign ; @resource private usersearchfeign usersearchfeign ; /** * 关键字全文搜索 */ @requestmapping("/getbykeyword") public list<esbookinfo> getbykeyword (@requestparam("keyword") string keyword, @requestparam("userid") integer userid){ // 搜索引擎执行 list<esbookinfo> esbookinfolist = bookinfoesfeign.getbykeyword(keyword) ; // 执行异步分析 if (stringutils.isnotempty(keyword) && esbookinfolist != null){ keysearchmodel keysearchmodel = new keysearchmodel() ; keysearchmodel.setuserid(userid); keysearchmodel.setkeyword(keyword); keysearchmodel.setsearchresult(esbookinfolist); usersearchfeign.sendbooksearch(jsonutil.objtojson(keysearchmodel)); } return esbookinfolist ; } }
(4)、请求分析
所属代码包:mopsz-data-analy
@restcontroller public class bookesdatacontroller implements bookesanalyfeign { @resource private bookesdataservice bookesdataservice ; @override public void sendbookesmsg(string msgbody) { bookesdataservice.savebookesdata(msgbody); } }
3、系统管理服务
- 流程图解
- 流程描述
整合流程基础springsecurity,jwt等组件开发。所属代码包:mopsz-admin-client。
1. 系统用户登录,安全配置:securityconfig ; 2. 登录成功处理:loginsuccesshandler ; 3. 登录失败处理:loginfailhandler ; 4. 系统服务具备管理:业务数据库,缓存数据,es服务等功能 ;
4、数据分析服务
- 流程图解
- 流程描述
所属代码包:mopsz-data-analy
1. 接收mq服务转发数据分析请求 ; 2. 按照指定策略,分析数据,分析结果存储 ;
三、系统分层管理
1、分层示意图
2、结构层次描述
- 公共代码块层
管理系统工具类、数据表结构实体类、mapper层、service服务层等,按照数据库服务规划划分,作为整个系统的公共依赖代码块。
- 数据管理层
管理数据入库服务api,数据分析服务api两个模块。
- 客户端接口层
管理用户服务api,后台系统服务api。
- 微服务接口层
微服务之间的调用采用feign接口的方式,按照不同服务提供的feign接口进行封装,在该层统一管理,进行服务间的请求调用。
- 通用业务服务层
管理通用token服务,消息发送服务,作为系统共用的业务服务层。
- 中间件服务层
管理rocketmq消息队列服务、redis缓存服务、quart定时器服务、es搜索服务,提供统一的feign服务接口。
- 微服务组件层
管理整个系统的网关拦截服务、eureka服务注册和发现 等微服务基础组件。
四、源代码地址
github·地址 https://github.com/cicadasmile/husky-spring-cloud gitee·地址 https://gitee.com/cicadasmile/husky-spring-cloud
上一篇: 《资治通鉴》是谁写的?《资治通鉴》为什么只剩残稿了?
下一篇: Ribbon架构剖析