本文源码:GitHub·点这里 || GitEE·点这里

更新进度(共6节):

01:项目技术选型简介,架构图解说明
02:业务架构设计,系统分层管理
03:数据库选型,业务数据设计规划
04:中间件集成,公共服务管理

一、中间件简介

中间件是基础软件的一类, 属于复用性极高的软件。处于操作系统软件与应用程序的之间。是一种独立的系统软件,也可以是公共的服务程序,分布式架构系统借助中间件,可以在不同的技术之间共享资源,或者不同的服务直接传递信息。中间件位操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件,例如:

  1. 消息队列中间件,在两个服务之间进行异步的消息传递;
  2. 数据缓存中间件,缓存整合系统的热点数据,提高程序的响应速度;
  3. Nginx中间件,提供负载均衡,服务代理,等功能;

二、公共服务简介

公共服务,顾名思义就是系统内通用的服务,例如用户身份验证,消息发送,监控预警,网关服务等。

该案例的中间件和公共服务,都是基于Feign接口统一的方式提供服务。

三、中间件集成

1、消息中间件

  • RocketMq简介

RocketMq 是一款分布式、队列模型的消息中间件,有两个核心角色:消息生产者和消息消费者。作为高并发系统的核心组件之一,能够帮助业务系统解构提高系统稳定性。

  • 应用流程
  1. 消息生产者
@Component
public class MsgSendService {@Resourceprivate ProducerConfig producerConfig ;public void sendMsg (MsgWrap msgWrap) {producerConfig.sendMsg(msgWrap.getGroup(),msgWrap.getTopic(),msgWrap.getTag(),msgWrap.getContent());}
}
  1. 消息消费者
@Component
@Consumer(group = MsgRoute.husky_group_1,topic = MsgRoute.husky_topic_1 ,tag = MsgRoute.husky_tag_1)
public class UserSearchListener implements MsgReadService {@Resourceprivate BookEsAnalyFeign bookEsAnalyFeign ;@Overridepublic void readMsg(String msg) throws Exception {LOGGER.info("【用户搜索消息监听 Msg】:{}",msg) ;// 转发请求数据分析服务bookEsAnalyFeign.sendBookEsMsg(msg);}
}
  1. 提供Feign接口
@RestController
public class UserSearchController implements UserSearchFeign {@Resourceprivate SendMsgService sendMsgService ;@Overridepublic void sendBookSearch(String msgContent) {MsgWrap msgWrap = new MsgWrap() ;msgWrap.setContent(msgContent);msgWrap.setGroup(MsgRoute.husky_group_1);msgWrap.setTopic(MsgRoute.husky_topic_1);msgWrap.setTag(MsgRoute.husky_tag_1);sendMsgService.sendMsg(msgWrap);}
}

2、缓存中间件

  • Redis简介

Redis 是一个基于内存的高性能key-value数据库。对高并发系统提供各种场景的支撑:热点数据缓存,计数器,流量削峰等。

  • 应用流程
  1. 封装操作方法
@Service
public class RedisServiceImpl implements RedisService {@Resourceprivate RedisTemplate<Object,Object> redisTemplate ;@Overridepublic boolean set(Object key, Object value) {boolean redisFlag = true ;try {redisTemplate.opsForValue().set(key,value);} catch (Exception e){redisFlag = false ;e.printStackTrace();}return redisFlag ;}@Overridepublic boolean set(Object key,Object value, long expire) {boolean redisFlag = true ;try {redisTemplate.opsForValue().set(key,value,expire,TimeUnit.SECONDS);} catch (Exception e){redisFlag = false ;e.printStackTrace();}return redisFlag ;}@Overridepublic String get(Object key) {String value = null ;try {value = String.valueOf(redisTemplate.opsForValue().get(key)) ;} catch (Exception e){e.printStackTrace();}return value ;}
}
  1. 提供Feign服务
@RestController
public class RedisController implements RedisFeign {@Resourceprivate RedisService redisService ;@Overridepublic boolean set (String key, String value) {return redisService.set(key,value) ;}@Overridepublic boolean setTimeOut (String key, String value,long expire){return redisService.set(key,value,expire) ;}@Overridepublic String get (String key) {return redisService.get(key) ;}
}

3、搜素中间件

  • ES搜索简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful的 web接口。是当前流行的企业级搜索引擎。

  • 应用流程
  1. 封装操作方法
@Service
public class BookInfoEsServiceImpl implements BookInfoEsService {@Resourceprivate BookInfoRepository bookInfoRepository ;@Overridepublic void batchSave(List<EsBookInfo> bookInfoList) {bookInfoRepository.saveAll(bookInfoList) ;}@Overridepublic List<EsBookInfo> queryList() {Iterable<EsBookInfo> bookInfoIterable = bookInfoRepository.findAll() ;List<EsBookInfo> esBookInfoList = Lists.newArrayList(bookInfoIterable) ;if (esBookInfoList == null){esBookInfoList = new ArrayList<>() ;}return esBookInfoList;}@Overridepublic List<EsBookInfo> getByKeyWord(String keyWord) {QueryStringQueryBuilder builder = new QueryStringQueryBuilder(keyWord);Iterable<EsBookInfo> bookInfoIterable = bookInfoRepository.search(builder) ;List<EsBookInfo> esBookInfoList = Lists.newArrayList(bookInfoIterable) ;if (esBookInfoList == null){esBookInfoList = new ArrayList<>() ;}return esBookInfoList ;}
}
  1. 提供Feign服务
@RestController
public class BookInfoEsController implements BookInfoEsFeign {@Resourceprivate BookInfoEsService bookInfoEsService ;@Overridepublic void batchSave(List<EsBookInfo> bookInfoList) {bookInfoEsService.batchSave(bookInfoList);}@Overridepublic List<EsBookInfo> queryList() {return bookInfoEsService.queryList();}@Overridepublic List<EsBookInfo> getByKeyWord(String keyWord) {return bookInfoEsService.getByKeyWord(keyWord);}
}

4、定时器中间件

  • Quartz 简介

Quartz是由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制任务的执行时间。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。

  • 应用流程
@Component("SendMsgJob")
public class SendMsgJob implements TaskJobService {@Resourceprivate SendEmailFeign sendEmailFeign ;@Overridepublic void run(String param) {String nowDate = TimeUtil.formatDate(new Date(),TimeUtil.FORMAT_01) ;LOGGER.info("SendMsgJob Execute Time:{}",nowDate);sendEmailFeign.sendEmail("","定时邮件通知",""+nowDate);}
}

四、公共服务管理

1、Token服务

  • Token服务简介

通过一个公共的Token管理服务,对访问系统的用户身份做管理:身份令牌创建,校验,刷新等。

  • 应用流程
  1. 封装操作方法
@Service
public class UserTokenServiceImpl implements UserTokenService {@Resourceprivate UserBaseMapper userBaseMapper ;@Resourceprivate RedisFeign redisFeign ;@Overridepublic String getToken(String userName, String passWord) throws Exception {UserBaseExample example = new UserBaseExample() ;example.createCriteria().andUserNameEqualTo(userName) ;UserBase userBase = selectByExample(example) ;if (userBase != null){String secrete = userBase.getPassWord() ;if (secrete.equals(passWord)) {// 返回 TokenString value = userBase.getId().toString() ;String publicKeyStr = RsaCryptUtil.getKey(RsaCryptUtil.PUB_KEY) ;String token = RsaCryptUtil.encrypt(RsaCryptUtil.createPublicKey(publicKeyStr),value.getBytes()) ;String key = RedisUtil.formatUserTokenKey(userBase.getId()) ;redisFeign.setTimeOut(key,token, Constant.USER_TOKEN_EXPIRE) ;return token ;}}return null;}@Overridepublic Integer verifyToken(String token) throws Exception {String privateKeyStr = RsaCryptUtil.getKey(RsaCryptUtil.PRI_KEY) ;String userId = RsaCryptUtil.decrypt(RsaCryptUtil.createPrivateKey(privateKeyStr),RsaCryptUtil.parseBase64Binary(token));return Integer.parseInt(userId) ;}@Overridepublic boolean refreshToken(String token) throws Exception {Integer userId = verifyToken(token) ;if (userId > 0 ){String key = RedisUtil.formatUserTokenKey(userId) ;// 判断Token 是否过期String cacheToken = redisFeign.get(key) ;if (StringUtils.isEmpty(cacheToken)){return false ;}redisFeign.setTimeOut(key,token, Constant.USER_TOKEN_EXPIRE) ;return true ;}return false ;}
}
  1. 提供Feign服务
@FeignClient("MOPSZ-BASIS-TOKEN")
public interface UserTokenFeign {/*** 获取 TOKEN*/@PostMapping("/token/getToken")RespObject getToken (@RequestParam("userName") String userName,@RequestParam("passWord") String passWord) ;/*** 验证 TOKEN*/@PostMapping("/token/verifyToken")RespObject verifyToken (@RequestParam("token") String token) ;/*** 刷新 TOKEN*/@PostMapping("/token/refreshToken")boolean refreshToken (@RequestParam("token") String token) ;
}

2、消息服务

  • Msg服务简介

在一个复杂的系统中,消息通知是一个必备模块,一般封装方式主要从下面两个方式入手,消息类型:用户消息,系统消息等,消息接收方式:邮件,短信,应用端等。

  • 应用流程
  1. 封装邮件发送
@Service
public class SendEmailServiceImpl implements SendEmailService {@Overridepublic void sendEmail(String receive, String title, String msg) {try {EmailUtil.sendEmail01(receive,title,msg);} catch (Exception e){e.printStackTrace() ;LOGGER.info("邮件发送失败:{}",e.getMessage());}}
}
  1. 提供Feign服务
@FeignClient("MOPSZ-BASIS-MSGBOX")
public interface SendEmailFeign {/*** 发送Email*/@PostMapping("/msgBox/sendEmail")void sendEmail (@RequestParam("receive") String receive,@RequestParam("title") String title,@RequestParam("msg") String msg) ;
}

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/husky-spring-cloud
GitEE·地址
https://gitee.com/cicadasmile/husky-spring-cloud

微服务架构案例(04):中间件集成,公共服务封装相关推荐

  1. 微服务架构案例(06):通过业务、应用、技术、存储方面,聊聊架构

    更新进度(共6节): 源码地址:GitHub·点这里 || GitEE·点这里 章节 文章标题 01 项目技术选型简介,架构图解说明 02 业务架构设计,系统分层管理 03 数据库选型,业务数据设计规 ...

  2. 微服务架构案例(01):项目技术选型简介,架构图解说明

    本文源码:GitHub·点这里 || GitEE·点这里 一.单体架构 单体架构在中等偏小的业务中比较常见,场景模式就是单个应用.单个数据库.一个程序包(例如war格式或者Jar格式)包含所有业务需求 ...

  3. 微服务_SpringCloud微服务架构实战:高并发微服务架构设计

    高并发微服务架构设计 作为一个 IT 从业人员,我们经常会碰到类似于下面的一些问题: 单个项目巨大而沉重,难以维护. 系统稳定性得不到更有效的保证. 怎样才能持续地提升系统的性能. 怎样才能快速地响应 ...

  4. 《可伸缩服务架构 框架与中间件》综合(1)

    =======开篇吐槽:最近一段时间刚好碰上中秋国庆双节,而且工作任务繁重,基本很难保证有时间来写文章了======= <可伸缩服务架构 框架与中间件>与<分布式服务架构 原理.设计 ...

  5. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  6. 微服务架构案例(05):SpringCloud 基础组件应用设计

    本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 04:中间件 ...

  7. 微服务架构案例(02):业务架构设计,系统分层管理

    本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 一.业务架构设计 1.基础概念 服务的架构设计决 ...

  8. 微服务架构案例(03):数据库选型简介,业务数据规划设计

    本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 一.数据库选 ...

  9. 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进

    1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...

最新文章

  1. android布局加色,android – 如何以编程方式将LinearLayout添加背景颜色,并将权重添加到另一个布局...
  2. shell脚本常用命令
  3. windows+caffe(三)——求取图片的均值
  4. android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)
  5. 【Python学习】 - sklearn学习 - 交叉验证中的常用函数
  6. linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库
  7. npm以及gulp相关操作
  8. 太阳的光和灯光有什么区别_防蓝光眼镜的原理是什么,为什么这么多人用?
  9. 为什么我的数据库应用程序这么慢?
  10. matlab 分水岭法,matlab中的分水岭算法
  11. DEM数据获取方法与采样基础理论
  12. python实现多线程输出123123
  13. Flask图片验证码注册功能
  14. 扩展卡尔曼滤波EKF进行锂电池SOC估计的C语言版本实现,和matlab版本一样包含定参和FFRLS两种情况
  15. html里怎么旋转视频文件,拍摄的视频如何旋转 三种方法教你旋转视频
  16. android 点赞源码,【Ctrl.js】微信给最新一条消息点赞源码
  17. ios15.6RC-15.7.1系统降级iOS14,适用于checkm8机型
  18. 3d可视化虚拟建模vr展示三维模型方案
  19. 米拓5.3 mysql支持off,Metinfo 5.3.17 前台SQL注入漏洞分析
  20. Could not resolve

热门文章

  1. bin文件编辑_为MediaWiki安装可视化编辑器VisualEditor
  2. 使用 GDB 恢复堆栈信息
  3. Python判断两个域名的主域名是否相同
  4. Python中使用Redis的批处理工具pipeline(这种方法从底层思考效率还是低于“订阅发布机制”)
  5. twisted系列教程十九–cancel deferred
  6. linux查看服务端口号、查看端口(netstat、lsof)
  7. Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令
  8. 排序算法:快速排序算法实现及分析(递归形式和非递归形式)
  9. ReportViewer中设置ServerReport.ReportServerCredentials属性的方法(WEB版)
  10. CSS3动画常用贝塞尔曲线-效果演示