微服务架构案例(04):中间件集成,公共服务封装
本文源码:GitHub·点这里 || GitEE·点这里
更新进度(共6节):
01:项目技术选型简介,架构图解说明
02:业务架构设计,系统分层管理
03:数据库选型,业务数据设计规划
04:中间件集成,公共服务管理
一、中间件简介
中间件是基础软件的一类, 属于复用性极高的软件。处于操作系统软件与应用程序的之间。是一种独立的系统软件,也可以是公共的服务程序,分布式架构系统借助中间件,可以在不同的技术之间共享资源,或者不同的服务直接传递信息。中间件位操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件,例如:
- 消息队列中间件,在两个服务之间进行异步的消息传递;
- 数据缓存中间件,缓存整合系统的热点数据,提高程序的响应速度;
- Nginx中间件,提供负载均衡,服务代理,等功能;
二、公共服务简介
公共服务,顾名思义就是系统内通用的服务,例如用户身份验证,消息发送,监控预警,网关服务等。
该案例的中间件和公共服务,都是基于Feign
接口统一的方式提供服务。
三、中间件集成
1、消息中间件
RocketMq
简介
RocketMq
是一款分布式、队列模型的消息中间件,有两个核心角色:消息生产者和消息消费者。作为高并发系统的核心组件之一,能够帮助业务系统解构提高系统稳定性。
- 应用流程
- 消息生产者
@Component
public class MsgSendService {@Resourceprivate ProducerConfig producerConfig ;public void sendMsg (MsgWrap msgWrap) {producerConfig.sendMsg(msgWrap.getGroup(),msgWrap.getTopic(),msgWrap.getTag(),msgWrap.getContent());}
}
- 消息消费者
@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);}
}
- 提供
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
数据库。对高并发系统提供各种场景的支撑:热点数据缓存,计数器,流量削峰等。
- 应用流程
- 封装操作方法
@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 ;}
}
- 提供
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接口。是当前流行的企业级搜索引擎。
- 应用流程
- 封装操作方法
@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 ;}
}
- 提供
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
管理服务,对访问系统的用户身份做管理:身份令牌创建,校验,刷新等。
- 应用流程
- 封装操作方法
@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 ;}
}
- 提供
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
服务简介
在一个复杂的系统中,消息通知是一个必备模块,一般封装方式主要从下面两个方式入手,消息类型:用户消息,系统消息等,消息接收方式:邮件,短信,应用端等。
- 应用流程
- 封装邮件发送
@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());}}
}
- 提供
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):中间件集成,公共服务封装相关推荐
- 微服务架构案例(06):通过业务、应用、技术、存储方面,聊聊架构
更新进度(共6节): 源码地址:GitHub·点这里 || GitEE·点这里 章节 文章标题 01 项目技术选型简介,架构图解说明 02 业务架构设计,系统分层管理 03 数据库选型,业务数据设计规 ...
- 微服务架构案例(01):项目技术选型简介,架构图解说明
本文源码:GitHub·点这里 || GitEE·点这里 一.单体架构 单体架构在中等偏小的业务中比较常见,场景模式就是单个应用.单个数据库.一个程序包(例如war格式或者Jar格式)包含所有业务需求 ...
- 微服务_SpringCloud微服务架构实战:高并发微服务架构设计
高并发微服务架构设计 作为一个 IT 从业人员,我们经常会碰到类似于下面的一些问题: 单个项目巨大而沉重,难以维护. 系统稳定性得不到更有效的保证. 怎样才能持续地提升系统的性能. 怎样才能快速地响应 ...
- 《可伸缩服务架构 框架与中间件》综合(1)
=======开篇吐槽:最近一段时间刚好碰上中秋国庆双节,而且工作任务繁重,基本很难保证有时间来写文章了======= <可伸缩服务架构 框架与中间件>与<分布式服务架构 原理.设计 ...
- 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端
在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...
- 微服务架构案例(05):SpringCloud 基础组件应用设计
本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 04:中间件 ...
- 微服务架构案例(02):业务架构设计,系统分层管理
本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 一.业务架构设计 1.基础概念 服务的架构设计决 ...
- 微服务架构案例(03):数据库选型简介,业务数据规划设计
本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 一.数据库选 ...
- 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进
1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...
最新文章
- android布局加色,android – 如何以编程方式将LinearLayout添加背景颜色,并将权重添加到另一个布局...
- shell脚本常用命令
- windows+caffe(三)——求取图片的均值
- android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)
- 【Python学习】 - sklearn学习 - 交叉验证中的常用函数
- linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库
- npm以及gulp相关操作
- 太阳的光和灯光有什么区别_防蓝光眼镜的原理是什么,为什么这么多人用?
- 为什么我的数据库应用程序这么慢?
- matlab 分水岭法,matlab中的分水岭算法
- DEM数据获取方法与采样基础理论
- python实现多线程输出123123
- Flask图片验证码注册功能
- 扩展卡尔曼滤波EKF进行锂电池SOC估计的C语言版本实现,和matlab版本一样包含定参和FFRLS两种情况
- html里怎么旋转视频文件,拍摄的视频如何旋转 三种方法教你旋转视频
- android 点赞源码,【Ctrl.js】微信给最新一条消息点赞源码
- ios15.6RC-15.7.1系统降级iOS14,适用于checkm8机型
- 3d可视化虚拟建模vr展示三维模型方案
- 米拓5.3 mysql支持off,Metinfo 5.3.17 前台SQL注入漏洞分析
- Could not resolve
热门文章
- bin文件编辑_为MediaWiki安装可视化编辑器VisualEditor
- 使用 GDB 恢复堆栈信息
- Python判断两个域名的主域名是否相同
- Python中使用Redis的批处理工具pipeline(这种方法从底层思考效率还是低于“订阅发布机制”)
- twisted系列教程十九–cancel deferred
- linux查看服务端口号、查看端口(netstat、lsof)
- Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令
- 排序算法:快速排序算法实现及分析(递归形式和非递归形式)
- ReportViewer中设置ServerReport.ReportServerCredentials属性的方法(WEB版)
- CSS3动画常用贝塞尔曲线-效果演示