服务框架之接口路由(路由接口 子接口)
前言
無論是web server框架還是rpc框架,接口作為服務的對外入口,其背后可能包含復雜的后端流程,不限于業務邏輯處理、數據處理&操作、基礎能力調用等。所以接口和“后端流程”之間必然存在著映射交付關系。
原理
路由機制
以下均以web框架為例,rpc框架相比web更為直接,即指定方法調用
http api 請求 和 rpc調用本質上都是通過網絡完成通信雙方交互。我們不局限在業內常見的平臺化、微服務化中對兩者的應用,其實可以這樣泛化理解所有“交互”有如下要素:
- 協議
通信雙方約定好的通信規則。
統一的通信規則能夠保證通信的準確性,避免二義性;
根據交互場景和限制條件選擇合適的協議,例如app中前后端交互常用http/https,IoT場景中就可能使用MQTT/CoAP,可以提高通信效率,減低通信成本;
- 通信內容
通信的任務就是傳遞信息,無非就是數據,結構化數據、非結構化數據都有相應的表示形式,輔之以眾多協議,能夠有效地被組織起來進行傳輸。例如,最常見的http請求get參數、json格式參數、rpc protobuf等
- 通信目標
數據送達至何處。
這也是接口概念的關鍵,在計算機網絡中能夠定位到網絡中確定主機和進程,如何將網絡請求交付處理呢?那么接口就是網絡請求對號入座的入口,常見框架中路由匹配規則也都大同小異。
路由注冊
路由注冊實現接口到控制器的映射,以此為基礎完成后續處理流程
同時還可以注冊中間件,構建請求處理過程的執行鏈路
路由注冊方式多種,原理上歸納為以下幾種:
基于配置(靜態)
- 解析配置文件
// For example, PHP framework register controller with Array
class ActionControllerConfig extends ActionBaseConfig {
public static ControllerConfig => array (
array(
'action_id' => 'action_name' // action唯一標識,后續用作router map key
'pattern' => '/^\/rest\/2\.0\/module\/operation/?params'// 框架規則不盡相同,本例為正則表達式 + 請求參數組合匹配
'path' => 'controller class path'
'controller_class' => 'controller1.class.php'
),
...
)
}
- 手動注冊路由
// 代碼來源 https://github.com/go-chi/chi
r.Route("/parent/pattern", func(r Router) {
r.Use(middleware2.SetContextUser) // 設置中間件
r.Mount("/xxx1", NewXxx1Router())
r.Mount("/xxx2", NewXxx2Router(boot))
r.Mount("/xxx3", NewXxx3Router(boot))
r.Mount("/xxx4", NewXxx4Router(boot))
r.Mount("/xxx5", NewXxx5Router(boot))
})
基于反射、注解、動態代理(動態)
- 再次理解“反射”:
golang / java 此類編譯型語言,編譯結束后具體實現均已存在,但是程序如何得知呢?利用反射能夠在運行時獲得具體Type&Value - 工作過程:
新建路由實例
coding階段配置handler到Router
服務啟動時初始化注冊,反射獲取Router.Type&Router.Value(方式多樣,不限于此)
整理得到“路由器”持有的“路由表”,路由表本質是url <—> 處理函數地址的映射表。 - 常見框架路由注冊case:SpringMVC 注解Go Web 框架
路由匹配規則
精確匹配
模式匹配
參數輔助匹配
路由維護
最終路由注冊產出結果主要如下兩種形式(求見多識廣的小伙伴補充~)
路由表
路由樹
常用最左前綴匹配
總結
以上是生活随笔為你收集整理的服务框架之接口路由(路由接口 子接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联发科或引领路由器进入软路由时代
- 下一篇: 微信(新版)GIF动图教程