InfiniGate自研網關實現五

17.核心通信組件管理和處理服務映射

引入模塊api-gateway-core 到 api-gateway-assist 中進行創建和使用,并拉取自注冊中心的映射信息注冊到本地的網關通信組件中。

第17節是在第15節的基礎上繼續完善服務發現的相關功能,把從注冊中心拉取的網關映射信息【系統、接口、方法】映射到本地通信組件中。這樣就算完成了注冊中心到本地服務的一個打通處理,映射完成后就可以通過HTTP請求到網關通信層,完成對RPC的泛化調用。

要在poom文件中引入之前寫的核心通信組件(打包成jar包,放到本地的maven倉庫中),通過 GatewayAutoConfig 配置類對網關通信組件進行 Bean 對象的創建和啟動。

具體實現步驟:

1.引入api-gateway-core的依賴

2.在application包下的GatewayApplication類中注入api-gateway-core中的配置類Configuration,讀取配置文件GatewayServiceProperties,調用gatewayCenterService的doRegister方法將網關配置傳到注冊中心上進行注冊網關服務,調用gatewayCenterService的pullApplicationSystemRichInfo拉取網關配置并把對應的配置信息裝配到Configuration中。

3.在GatewayAutoConfig類初始化網關服務。創建核心通信組件的Configuration對象并交給Spring容器管理。初始化網關服務,創建服務端 Channel 對象,方便獲取和控制網關操作。先基于配置構建會話工廠,然后創建啟動網關網絡服務。

18容器關閉監聽和異常管理

把網關在注冊和拉取時的異常拋出來,交給容器管理做關閉動作,以及處理網關的服務關閉。

按照網關設計的架構圖,api-gateway-assist 助手工程會被引入到 api-gateway-engine 網關引擎中啟動。那么在 api-gateway-assist 啟動的過程中,我們希望它所發生的一些動作,包括啟動中的異常、拉取接口信息的失敗以及容器關閉后優雅的處理網關通信的關閉。那么這些內容,就是本節需要完成的事情。????????

基于上一節對api-gateway-assist模塊的完善,這里需要把網關的注冊和拉取配置操作,放到 ApplicationContextAware 接口對應的 setApplicationContext 方法中。這樣可以在注冊服務以及拉取配置的過程中出現失敗情況時,則直接拋異常關閉容器。另外這里還需要做一個容器關閉的監聽動作 ApplicationListener<ContextClosedEvent> 容器關閉時則把網關中的通信模塊下的 Netty 服務也一起關閉掉。

下面先來講一下ApplicationContextAwareApplicationListener<ContextClosedEvent>這兩個接口

ApplicationContextAware

ApplicationContextAware接口是一個標記接口,主要用于標識一個類可以被Spring容器識別并注入應用上下文(ApplicationContext)。這個接口定義了一個方法:

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

當Spring容器創建實現了ApplicationContextAware接口的Bean時,它會自動調用這個方法,并傳遞應用上下文對象。

ApplicationListener<ContextClosedEvent>

ApplicationListener接口是一個事件監聽器接口,用于監聽Spring框架中的各種事件。這個接口定義了一個方法:

void onApplicationEvent(ApplicationEvent event);

當Spring容器發布某個事件時,所有實現了ApplicationListener接口的Bean的onApplicationEvent方法會被調用。這樣,開發者可以自定義事件處理邏輯。

ContextClosedEvent是Spring框架中的一個事件,當Spring容器關閉時發布。因此,實現ApplicationListener<ContextClosedEvent>接口的類可以監聽到Spring容器的關閉事件,并執行相應的清理工作,比如關閉數據庫連接、釋放資源等。

具體實現:

  1. 在service包下對服務注冊和配置拉取這兩個http請求用try catch進行異常管理
  2. 感知容器,GatewayApplication實現ApplicationContextAware接口,重寫setApplicationContext方法,將注冊網關服務和拉取網關配置放到這個方法里面并使用try catch捕獲異常,當出現異常時就直接捕獲拋出,關閉容器。
  3. 監聽動作,GatewayApplication實現GatewayApplication實現接口,重寫onApplicationEvent方法,監聽到Spring 的容器關閉通知時,則把 Netty 服務關閉掉。

19網關引擎打包鏡像部署

把網關在注冊和拉取時的異常拋出來,交給容器管理做關閉動作,以及處理網關的服務關閉。為了方便網關算力節點的分布式部署,我會把網關引擎工程 api-gateway-engine 打包成 Jar 放到 Docker 中啟動。

api-gateway-engine 是一個用于啟動網關算力服務的引擎工程,它的代碼內容幾乎沒有多少,主要負責的是工程的啟動操作。因為鏡像的打包也是從這個工程中處理。

具體實現:

1.在poom.xml文件中引入api-gateway-assist的依賴。

2.編寫Dockerfile文件構建網關引擎的鏡像。

3.編寫一個shell腳本build.sh用于執行Dockerfile文件

20.服務注冊組件搭建采集接口信息

提供應用服務注冊的組件,采集RPC服務啟動時已經配置了標記注解的對象,摘取出類、接口、方法,用于后續注冊到網關中心。

首先我們知道網關的注冊中心維護著網關和RPC接口的信息,用于把RPC接口分配到網關算力上使用。那么前面已經實現了網關算力的自動注冊,同樣RPC接口也需要自動注冊,否則都是人工手動維護這個成本還是非常大的。

所以要開發一個api-gateway-sdk 組件,獲取 Spring Bean 對象的注冊結果,。并對已經使用注解標記了的接口進行攔截提取接口和方法信息。

具體實現:

1.在annotation包下自定義兩個注解ApiProducerClazz(作用到類上)、ApiProducerMethod(作用到方法上),用于對注冊到網關的接口進行標記,因為標記后就可以在讀取到 Bean 對象以后通過反射判斷是否需要提取信息并注冊。

2.在application包下創建GatewaySDKApplication實現BeanPostProcessor接口(后置處理器的接口),重寫postProcessAfterInitialization方法,該方法是Bean初始化之后調用,形參里面傳入了bean實例,對bean實例進行反射拿到接口信息。

3.為了這個模塊可以方便地服用,我們可以把這個模塊封住成一個SpringStarter組件,在config包下,定義GatewaySDKServiceProperties屬性類,用于封裝從配置文件中定義的信息,包括注冊中心和RPC服務的信息。定義GatewaySDKAutoConfig自動裝配類,加上@EnableConfigurationProperties里面傳入屬性類的字節碼,創建GatewaySDKServiceProperties類型的Bean對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13113.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPT3.5與GPT4.0的差別對比

隨著人工智能技術的飛速發展&#xff0c;GPT系列模型已成為自然語言處理&#xff08;NLP&#xff09;領域的翹楚。GPT3.5和GPT4.0作為這一系列的最新成員&#xff0c;各自在性能和應用上都有所突破。 GPT4.0預計將擁有數千億個參數&#xff0c;與前代GPT3.5相比&#xff0c;模…

ZYNQ之嵌入式驅動開發——字符設備驅動

文章目錄 Linux驅動程序分類Linux應用程序和驅動程序的關系簡單的測試驅動程序在petalinux中添加LED驅動新字符設備驅動 Linux驅動程序分類 驅動程序分為字符設備驅動、塊設備驅動和網絡設備驅動。 字符設備是按字節訪問的設備&#xff0c;比如以一個字節收發數據的串口&#…

軟信天成:業務流程管理驅動企業數字化轉型

近日&#xff0c;在國家發展改革委辦公廳、國家數據局綜合司聯合印發的《數字經濟2024年工作要點》中&#xff0c;明確強調了本年度大力推進重點領域數字化轉型&#xff0c;營造數字化轉型生態的戰略舉措&#xff0c;標志著國家對于企業數字化轉型的高度重視與積極倡導。 企業…

dubbo復習:(3) 服務超時時間配置

在dubbo admin中 可以進行類似如下配置 configVersion: v2.7 enabled: true configs:- side: consumeraddresses:- 0.0.0.0parameters:timeout: 55這樣配置之后&#xff0c;當服務端響應超過55毫秒時&#xff0c;在服務消費者的控制臺就會看到超時信息

(保姆級教程傻瓜式操作)樹莓派--基于opencv實現人臉識別

前言 因為當時沒有邊實驗邊記錄&#xff0c;所以這篇文章可能存在疏漏。不過很多地方我推薦了我參考過的博客或者視頻&#xff0c;希望盡可能地解答您的疑惑&#xff0c;如果您仍有不懂的地方&#xff0c;歡迎評論&#xff0c;如果我知道答案&#xff0c;我會很樂意為您解答。 …

私活更好用:SpringBoot開源項目!!【送源碼】

今天分享一款非常香的SpringBoot大屏開源項目&#xff0c;非常適合接私活用。 這是一款基于SpringBoot代碼生成器的快速開發平臺&#xff01;采用前后端分離架構&#xff1a;SpringBoot&#xff0c;Mybatis&#xff0c;Shiro&#xff0c;JWT&#xff0c;Vue&Ant Design。強…

MQTT_介紹_1.1

歷史 1999年&#xff1a;MQTT最初由IBM的Andy Stanford-Clark和Cirrus Link的Arlen Nipper開發&#xff0c;用于滿足石油和天然氣公司在遠程地區監控設備的需求。 2006年&#xff1a;IBM發布了MQTT的最初開源實現&#xff0c;但此時MQTT并未獲得廣泛的關注。 2010年&#xff…

三大平臺直播視頻下載保存方法

終于解決了視頻號下載的問題&#xff0c;2024年5月15日親測可用。 而且免費。 教程第二部分&#xff0c;有本地電腦無法下載的解決方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下載安裝包 下載迅雷網盤搜索&#xff1a;大海福利合集…

【Python報錯】Python安裝模塊時報錯Fatal error in launcher

【Python報錯】Python安裝模塊時報錯Fatal error in launcher 最近需要用到python下載一個小工具&#xff0c;自信敲下回車鍵本想看到黑乎乎的終端上會出現快速跳躍的命令代碼&#xff0c;沒想到&#xff0c;報錯了...... Fatal error in launcher: Unable to create process …

關于Windows中的NTUSER.DAT文件的知識,看這篇文章就差不多了

每個用戶配置文件中都隱藏著一個名為NTUSER.DAT的文件。此文件包含每個用戶的設置和首選項,因此你不應該刪除它,也可能不應該編輯它。Windows會自動為你加載、更改和保存該文件。 NTUSER.DAT包含你的用戶配置文件設置 每次更改Windows和已安裝程序的外觀和行為時,無論是桌…

【Qt】Qt開源項目

1、Flameshot 截圖工具 1.1 簡介 Flameshot是一款功能強大但易于使用的屏幕截圖軟件,中文名稱火焰截圖。 Flameshot 簡單易用并有一個CLI版本,所以可以從命令行來進行截圖。 Flameshot 是一個Linux發行版中完全免費且開源的截圖工具 1.2 源碼 github:https://github.com…

智能監控與安全管理:安全帽檢測算法的實踐與應用

在工地、煤礦等高危工作環境中&#xff0c;安全帽的佩戴至關重要。安全帽能夠有效防止因墜落物體或碰撞等引起的頭部傷害&#xff0c;從而保護工作人員的生命安全。然而&#xff0c;傳統的檢查人員佩戴安全帽的方式主要依賴于現場監督和巡查&#xff0c;這種方法不僅耗費大量人…

分頁查詢(PageHelper)

PageHelper依賴 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper}</version> </dependency>DTO接收類 package com.sky.dto;import l…

不用投稿郵箱,怎樣向各大新聞媒體投稿?

身為單位的信息宣傳員,我深知肩上責任重大。每個月,完成單位在媒體上投稿發表文章的考核任務,就如同一場無聲的賽跑,既要保證速度,更要注重質量。起初,我遵循“前輩們”的老路,一頭扎進了郵箱投稿的海洋。但很快,現實給了我一記重拳——郵箱投稿的競爭猶如千軍萬馬過獨木橋,稿件…

Java練習題(二)

6、在異常處理中&#xff0c;如釋放資源&#xff0c;關閉數據庫、關閉文件應由&#xff08;C &#xff09;語 句來完成。 A.try子句 B.catch子句 C.finally子句 D.throw子句 finally子句一般是用來清理這些資源的 7、以下代碼段執行后的輸出結果為…

Hadoop3:客戶端向HDFS寫數據流的流程講解(較枯燥)

一、場景描述 我們登陸HDFS的web端&#xff0c;上傳一個大文件。 二、流程圖 三、講解 流程1&#xff08;Client與NameNode交互&#xff09; 1、HDFS client創建DistributedFileSystem&#xff0c;通過dfs與NameNode進行2次&#xff08;一來一回4次&#xff09;對話&#x…

x264 幀類型代價計算原理:slicetype_mb_cost 函數分析

slicetype_mb_cost 函數 函數功能 計算每個宏塊 MB 的代價 cost。函數參數分析 x264_t *h:全局編碼結構體x264_mb_analysis_t *a:宏塊分析結構體x264_frame_t **frames:系列幀數據結構體int p0:幀序號之一,一般指向靠前幀int p1:幀序號之一,一般指向靠后幀int b:幀標志…

如何修改antd的pagination翻頁組件為中文?

很簡單 加一個屬性 locale{{ items_per_page: 頁 }}<PaginationpageSize{pagination.pageSize}locale{{ items_per_page: 頁 }}current{pagination.current}showTotal{(total, range) > 共有 ${pagination.total} 條數據}style{{ textAlign: right }}onChange{(page: num…

Go微服務開源框架kratos的依賴注入關系總結

該文章為學習開源微服務框架kratos的學習筆記&#xff01;官方文檔見&#xff1a;簡介 | Kratos Kratos 一套輕量級 Go 微服務框架&#xff0c;包含大量微服務相關框架及工具。 一、Kratos 項目結構簡介 通過 Kratos 工具生成的 Go工程化項目模板如下&#xff1a; applicati…

【半夜學習MySQL】復合查詢(含多表查詢、自連接、單行/多行子查詢、多列子查詢、合并查詢等詳解)

&#x1f3e0;關于專欄&#xff1a;半夜學習MySQL專欄用于記錄MySQL數據相關內容。 &#x1f3af;每天努力一點點&#xff0c;技術變化看得見 文章目錄 回顧基本查詢多表查詢自連接子查詢單行子查詢多行子查詢多列子查詢在from子句中使用子查詢合并查詢 回顧基本查詢 下面使用…