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 服務也一起關閉掉。
下面先來講一下ApplicationContextAware
和ApplicationListener<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容器的關閉事件,并執行相應的清理工作,比如關閉數據庫連接、釋放資源等。
具體實現:
- 在service包下對服務注冊和配置拉取這兩個http請求用try catch進行異常管理
- 感知容器,GatewayApplication實現ApplicationContextAware接口,重寫setApplicationContext方法,將注冊網關服務和拉取網關配置放到這個方法里面并使用try catch捕獲異常,當出現異常時就直接捕獲拋出,關閉容器。
- 監聽動作,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對象。