微服务架构案例(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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2019 中国开源年会即将开启
2019 中国开源年会(COSCon'19)为业界最具影响力的开源年度盛会,将于 11 月 2 日至 3 日在华东师范大学(上海普陀区中山北路校区)由开源社举办。 中国开源年会 COSCon 作为一场专属于开源人的聚会,吸引了越来越多的社区小伙伴加入。阿里巴巴作为白金赞助商和参展商参加了此次年会,并将有 5 位技术专家带来演讲,其中阿里巴巴资深技术专家姬风将发表《开源的黄金时代,阿里巴巴云原生开源的探索与实践》的主题演讲。 时间:2019 年 11 月 2 日09:00 至 11 月 3 日17:00地址:上海普陀区上海普陀区中山北路 3663 号华东师范大学(中北校区) 赠送 3 张门票: 关注「阿里巴巴云原生」公众号,回复关键词“年会”即可参与价值 199 的门票抽奖啦! 嘉宾阵容 圆桌会议 圆桌会议仅限受邀人员参加,自 2015 年
- 下一篇
牛!阿里云位居中国金融云市场第一
近日,全球权威市场研究机构IDC发布《中国金融云解决方案市场跟踪研究,2019H1》报告:阿里云位居中国金融云解决方案市场第一,并成为市场份额突破两位数的唯一厂商,同比增长超过90%。 IDC统计数据显示,阿里云在金融云解决方案市场上份额为12.2%,排名第一,远超后者。 报告指出,金融业务面临的监管压力和经营压力倒推产业创新升级,云计算和分布式架构成为金融机构自主可控、管理优化和业务敏捷的不二选择。 “金融行业作为传统行业信息科技应用的领头羊,正成为既互联网行业之后云化转型的排头兵。”IDC认为,从底层IT基础设施,到上层平台和应用解决方案,中国企业全面朝云计算架构转型已成必然。 此前中国金融IT解决方案市场一直由国内外金融垂直行业解决方案商主导,但是今天以阿里云为代表的金融云厂商正通过从底层分布式架构改造或新建,以及大数据和AI驱动的
相关文章
文章评论
共有0条评论来说两句吧...