1. 程式人生 > >微服務架構案例(04):中介軟體整合,公共服務封裝

微服務架構案例(04):中介軟體整合,公共服務封裝

本文原始碼:GitHub·點這裡 || GitEE·點這裡

更新進度(共6節):

01:專案技術選型簡介,架構圖解說明

02:業務架構設計,系統分層管理

03:資料庫選型,業務資料設計規劃

04:中介軟體整合,公共服務管理

一、中介軟體簡介

中介軟體是基礎軟體的一類, 屬於複用性極高的軟體。處於作業系統軟體與應用程式的之間。是一種獨立的系統軟體,也可以是公共的服務程式,分散式架構系統藉助中介軟體,可以在不同的技術之間共享資源,或者不同的服務直接傳遞資訊。中介軟體位作業系統之上,管理計算機資源和網路通訊。是連線兩個獨立應用程式或獨立系統的軟體,例如:

  1. 訊息佇列中介軟體,在兩個服務之間進行非同步的訊息傳遞;
  2. 資料快取中介軟體,快取整合系統的熱點資料,提高程式的響應速度;
  3. Nginx中介軟體,提供負載均衡,服務代理,等功能;

二、公共服務簡介

公共服務,顧名思義就是系統內通用的服務,例如使用者身份驗證,訊息傳送,監控預警,閘道器服務等。

該案例的中介軟體和公共服務,都是基於Feign介面統一的方式提供服務。

三、中介軟體整合

1、訊息中介軟體

  • RocketMq簡介

RocketMq 是一款分散式、佇列模型的訊息中介軟體,有兩個核心角色:訊息生產者和訊息消費者。作為高併發系統的核心元件之一,能夠幫助業務系統解構提高系統穩定性。

  • 應用流程
  1. 訊息生產者
@Component
public class MsgSendService {
    @Resource
    private 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 {
    @Resource
    private BookEsAnalyFeign bookEsAnalyFeign ;
    @Override
    public void readMsg(String msg) throws Exception {
        LOGGER.info("【使用者搜尋訊息監聽 Msg】:{}",msg) ;
        // 轉發請求資料分析服務
        bookEsAnalyFeign.sendBookEsMsg(msg);
    }
}
  1. 提供Feign介面
@RestController
public class UserSearchController implements UserSearchFeign {
    @Resource
    private SendMsgService sendMsgService ;
    @Override
    public 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 {
    @Resource
    private RedisTemplate<Object,Object> redisTemplate ;
    @Override
    public boolean set(Object key, Object value) {
        boolean redisFlag = true ;
        try {
            redisTemplate.opsForValue().set(key,value);
        } catch (Exception e){
            redisFlag = false ;
            e.printStackTrace();
        }
        return redisFlag ;
    }
    @Override
    public 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 ;
    }
    @Override
    public 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 {
    @Resource
    private RedisService redisService ;
    @Override
    public boolean set (String key, String value) {
        return redisService.set(key,value) ;
    }
    @Override
    public boolean setTimeOut (String key, String value,long expire){
        return redisService.set(key,value,expire) ;
    }
    @Override
    public String get (String key) {
        return redisService.get(key) ;
    }
}

3、搜素中介軟體

  • ES搜尋簡介

ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful的 web介面。是當前流行的企業級搜尋引擎。

  • 應用流程
  1. 封裝操作方法
@Service
public class BookInfoEsServiceImpl implements BookInfoEsService {
    @Resource
    private BookInfoRepository bookInfoRepository ;
    @Override
    public void batchSave(List<EsBookInfo> bookInfoList) {
        bookInfoRepository.saveAll(bookInfoList) ;
    }
    @Override
    public List<EsBookInfo> queryList() {
        Iterable<EsBookInfo> bookInfoIterable = bookInfoRepository.findAll() ;
        List<EsBookInfo> esBookInfoList = Lists.newArrayList(bookInfoIterable) ;
        if (esBookInfoList == null){
            esBookInfoList = new ArrayList<>() ;
        }
        return esBookInfoList;
    }
    @Override
    public 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 {
    @Resource
    private BookInfoEsService bookInfoEsService ;
    @Override
    public void batchSave(List<EsBookInfo> bookInfoList) {
        bookInfoEsService.batchSave(bookInfoList);
    }
    @Override
    public List<EsBookInfo> queryList() {
        return bookInfoEsService.queryList();
    }
    @Override
    public List<EsBookInfo> getByKeyWord(String keyWord) {
        return bookInfoEsService.getByKeyWord(keyWord);
    }
}

4、定時器中介軟體

  • Quartz 簡介

Quartz是由Java編寫的開源任務排程的框架,通過觸發器設定作業定時執行規則,控制任務的執行時間。其中quartz叢集通過故障切換和負載平衡的功能,能給排程器帶來高可用性和伸縮性。

  • 應用流程
@Component("SendMsgJob")
public class SendMsgJob implements TaskJobService {
    @Resource
    private SendEmailFeign sendEmailFeign ;
    @Override
    public 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 {
    @Resource
    private UserBaseMapper userBaseMapper ;
    @Resource
    private RedisFeign redisFeign ;
    @Override
    public 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)) {
                // 返回 Token
                String 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;
    }
    @Override
    public 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) ;
    }
    @Override
    public 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 {
    @Override
    public 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)中介軟體整合公共服務封裝

本文原始碼:GitHub·點這裡 || GitEE·點這裡 更新進度(共6節): 01:專案技術選型簡介,架構圖解說明 02:業務架構設計,系統分層管理 03:資料庫選型,業務資料設計規劃 04:中介軟體整合,公共服務管理 一、中介軟體簡介 中介軟體是基礎軟體的一類, 屬於複用性極高的軟體。

服務架構案例(03)資料庫選型簡介業務資料規劃設計

更新進度(共6節): 01:專案技術選型簡介,架構圖解說明 02:業務架構設計,系統分層管理 03:資料庫選型,業務資料設計規劃 一、資料庫選擇 1、資料庫分類 資料庫型別 常見資料庫 關係型 MySQL、Oracle、DB2、SQLServer等。 非關係型 Hbase、Red

服務架構案例(05)SpringCloud 基礎元件應用設計

本文原始碼:GitHub·點這裡 || GitEE·點這裡 更新進度(共6節): 01:專案技術選型簡介,架構圖解說明 02:業務架構設計,系統分層管理 03:資料庫選型,業務資料設計規劃 04:中介軟體整合,公共服務管理 05:SpringCloud 基礎元件應用設計 一、元件應用規劃 1、註冊中心

架構設計 | 基於Seata中介軟體服務模式下事務管理

原始碼地址:[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base) || [GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base) # 一、Seata簡介 ## 1、Sea

構建服務架構Spring Cloud服務註冊與發現(Eureka、Consul)

comm 簡介 foundry 架構 eas args 包含 什麽 其他 Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全

構建服務架構Spring Cloud服務消費(基礎)

成了 cloud framework shadow 即將 nbu 註冊中心 obj client 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口,包括DiscoveryClient、這裏我們即將介紹

構建服務架構Spring Cloud服務消費(Ribbon)

架構 pid 編寫 動手 tap consumer pre 攔截器 over Spring Cloud Ribbon Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。它是一個基於HTTP和TCP的客戶端負載均衡器。它可

構建服務架構Spring Cloud分布式配置中心

文件的 文件 項目 proc enc tid 部分 中心 並且 Spring Cloud Config是Spring Cloud團隊創建的一個全新項目,用來為分布式系統中的基礎設施和微服務應用提供集中化的外部配置支持,它分為服務端與客戶端兩個部分。其中服務端也稱為分布式配置

構建服務架構Spring Cloud服務消費(Feign)

進行 string oca 成對 rest server 之前 int netflix Spring Cloud Feign Spring Cloud Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。我們只需

Spring-cloud 服務架構搭建 04 - Hystrix 監控配合turbine的配置使用

文章目錄 1. Hystrix儀表盤和Turbine叢集監控簡介 2. hystrix-dashboard-turbine 模組快速搭建 1. Hystrix儀表盤和Turbine叢集監控簡介

服務架構--它適合您的軟體開發嗎?

微服務體系架構提供了一系列技術好處,這些好處有助於軟體專案的開發速度和產品質量,同時也有助於整體業務敏捷性”– Mark Emeis, CA技術公司軟體技術高階總監 自從“微服務”這個術語出現以來,它在軟體開發方面已經取得了進展。微服務,又名微服務體系結構,是面向服務體系結

服務架構框架選擇Spring Cloud 和 Dubbo對比

知乎轉載 樓層1: 從專案的背景來看,Dubbo 國內用的公司挺多,國內影響力大,Spring Cloud 自然在國外影響力較大,所以這個來看不分伯仲了,畢竟都有大公司在使用。 從社群的活躍度來看,可以看下各自的Github託管專案來區分。Dubbo ·

一個經過優化的服務架構案例

http://www.infoq.com/cn/articles/an-optimized-micro-service-architecture-case?utm_source=tuicool&utm_medium=referral 前言 大家都知道,基於單

黑客滲透、網絡運維、服務架構、電商平臺高可用??????更多好文請看本期推薦文章精選

黑客滲透 微服務 架構 因為最近手頭事情比較多,有好幾周沒有更新文章精選了。不知道大家有沒有想我啊。好了廢話不多說,開始更新精選文章: Redis漏洞利用與防禦 作者:simeon2005簡介:Redis在大公司被大量應用,通過筆者的研究發現,目前在互聯網上已經出現Redis未經授權病毒似自動

服務架構下處理分布式事務你必須知道的事兒

時機 一致性 cloud 困難 都是 upd 數據庫 dynamo 應用 根據微服務架構的鼻祖 Martin Fowler 的忠告,微服務架構中應當盡量避免分布式事務。然而,在某些領域,分布式事務如同宿命中的對手無法避免。 在工程領域,分布式事務的討論主要聚焦於強一致性和

Java架構-spring+springmvc+kafka分散式訊息中介軟體整合方案

Honghu的訊息服務平臺已經拋棄了之前的ActiveMQ,改用高吞吐量比較大的Kafka分散式訊息中介軟體方案: kafka訊息平臺使用spring+kafka的整合方案,詳情如下: 使用最高版本2.1.0.RELEASE整合jar包:spring-integration

【分散式架構】分散式訊息中介軟體MQ開發教程

關於分散式訊息中介軟體MQ的詳細介紹: 【分散式架構】分散式訊息中介軟體MQ開發教程 (阿里雲訊息佇列MQ(Message Queue)是企業級網際網路架構的核心產品,服務於整個阿里巴巴集團已超過8年,經過阿里巴巴交易核心鏈路反覆打磨與歷年雙十一嚴苛考驗,是一個真正具備低延遲、高併發、高可用

如何將報表服務部署到金蝶中介軟體

1. 獲取潤乾的應用包 demo(此應用包可從設計器安裝目錄…\report5\web\webapps 下獲取) 放到金蝶的…\AAS-V9.0\domains\mydomain\applications 目錄下 2. 放置資料庫的驅動包至…\AAS-V9.0\lib 目錄下或者在金蝶控制

ASP.NET Core 開發中介軟體

ASP.NET Core開發,開發並使用中介軟體(Middleware)。中介軟體是被組裝成一個應用程式管道來處理請求和響應的軟體元件。每個元件選擇是否傳遞給管道中的下一個元件的請求,並能之前和下一組分在管道中呼叫之後執行特定操作。 具體如圖: 開發中間件(Mid

循序漸進學.Net Core Web Api開發系列【13】中介軟體(Middleware)

系列目錄 一、概述 本篇介紹如何使用中介軟體(Middleware)。 二、初步演練 先寫幾個中介軟體 public class DemoAMiddleware { private readonly RequestDelegate _next;