日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微服务架构案例(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):中间件集成,公共服务封装的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。