'''
/**
- @author yangshaojun
- @title GatewayController
- @date 2019/10/29
- @description 網(wǎng)關Controller
- @version: v1.0
*/
@RestController
public class GatewayController {
@GetMapping("/clientGateway")
public String clientGateway() {
CurrentLimitHandler currentLimitHandler = FactoryHandler.getFirstGatewayHandler();
currentLimitHandler.service();
return "success";
}
}
'''
'''
/**
@author yangshaojun
@title FactoryHandler
@date 2019/10/29
@description 工廠工具類
-
@version: v1.0
*/
public class FactoryHandler {
public static CurrentLimitHandler getFirstGatewayHandler() {
CurrentLimitHandler currentLimitHandler = new CurrentLimitHandler();BlackListHandler blackListHandler = new BlackListHandler(); currentLimitHandler.setNextGatewayHandler(blackListHandler); ConversationHandler conversationHandler = new ConversationHandler(); blackListHandler.setNextGatewayHandler(conversationHandler); return currentLimitHandler;
}
}
'''
'''
/** @author yangshaojun
@title GatewayHandler
@date 2019/10/29
@description 網(wǎng)關抽象類定義公共行為
-
@version: v1.0
*/
public abstract class GatewayHandler {public GatewayHandler nextGatewayHandler;
public abstract void service();
public void setNextGatewayHandler(GatewayHandler gatewayHandler) {
this.nextGatewayHandler = gatewayHandler;
}public void nextService() {
if (nextGatewayHandler != null) {
nextGatewayHandler.service();
}
}
}
'''
'''
/** @author yangshaojun
@title CurrentLimitHandler
@date 2019/10/29
@description API限流判斷
-
@version: v1.0
*/
@Component
public class CurrentLimitHandler extends GatewayHandler {@Override
public void service() {
System.out.println("第一關 >> API限流判斷");
nextService();
}
}
'''
'''
/** @author yangshaojun
@title BlacklistHandler
@date 2019/10/29
@description 黑名單攔截
-
@version: v1.0
*/
@Component
public class BlackListHandler extends GatewayHandler {@Override
public void service() {
System.out.println("第二關 >> 黑名單攔截判斷");
nextService();
}
}
'''
'''
/** @author yangshaojun
@title ConversationHandler
@date 2019/10/29
@description 用戶會話攔截
-
@version: v1.0
*/
@Component
public class ConversationHandler extends GatewayHandler {@Override
public void service() {
System.out.println("第三關 >> 用戶會話攔截判斷");
}
}
'''
1.什么是責任鏈模式
客戶端發(fā)出一個請求屠橄,鏈上的對象都有機會來處理這一請求侈百,而客戶端不需要知道誰是具體的處理對象糙俗。這樣就實現(xiàn)了請求者和接受者之間的解耦篙螟,并且在客戶端可以實現(xiàn)動態(tài)的組合職責鏈洒嗤。使編程更有靈活性坯临。
定義:使多個對象都有機會處理請求霍殴,從而避免了請求的發(fā)送者和接受者之間的耦合關系涮帘。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求贬芥,直到有對象處理它為止吐辙。其過程實際上是一個遞歸調用。
要點主要是:
1蘸劈、有多個對象共同對一個任務進行處理昏苏。
2、這些對象使用鏈式存儲結構威沫,形成一個鏈贤惯,每個對象知道自己的下一個對象。
3棒掠、一個對象對任務進行處理孵构,可以添加一些操作后將對象傳遞個下一個任務。也可以在此對象上結束任務的處理烟很,并結束任務颈墅。
4、客戶端負責組裝鏈式結構雾袱,但是客戶端不需要關心最終是誰來處理了任務恤筛。
2.責任鏈模式類結構圖
1.抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要芹橡,接口可以定義 出一個方法以設定和返回對下家的引用叹俏。這個角色通常由一個Java抽象類或者Java接口實現(xiàn)。上圖中Handler類的聚合關系給出了具體子類對下家的引用僻族,抽象方法handleRequest()規(guī)范了子類處理請求的操作。
2.具體處理者(ConcreteHandler)角色:具體處理者接到請求后屡谐,可以選擇將請求處理掉述么,或者將請求傳給下家。由于具體處理者持有對下家的引用愕掏,因此度秘,如果需要,具體處理者可以訪問下家饵撑。
3.責任鏈模式優(yōu)缺點
優(yōu)點:
職責鏈模式的最主要功能就是:動態(tài)組合剑梳,請求者和接受者解耦。
請求者和接受者松散耦合:請求者不需要知道接受者滑潘,也不需要知道如何處理垢乙。每個職責對象只負責自己的職責范圍,其他的交給后繼者语卤。各個組件間完全解耦追逮。
動態(tài)組合職責:職責鏈模式會把功能分散到單獨的職責對象中酪刀,然后在使用時動態(tài)的組合形成鏈,從而可以靈活的分配職責對象钮孵,也可以靈活的添加改變對象職責骂倘。
缺點:
產(chǎn)生很多細粒度的對象:因為功能處理都分散到了單獨的職責對象中,每個對象功能單一巴席,要把整個流程處理完历涝,需要很多的職責對象,會產(chǎn)生大量的細粒度職責對象漾唉。
不一定能處理:每個職責對象都只負責自己的部分荧库,這樣就可以出現(xiàn)某個請求,即使把整個鏈走完毡证,都沒有職責對象處理它电爹。這就需要提供默認處理,并且注意構造鏈的有效性料睛。
4.責任鏈模式應用場景
1.多條件流程判斷 權限控制
2.ERP系統(tǒng) 流程審批 總經(jīng)理丐箩、人事經(jīng)理、項目經(jīng)理
3.Java過濾器的底層實現(xiàn)Filter
比如:在Java過濾器中客戶端發(fā)送請求到服務器端恤煞,過濾會經(jīng)過參數(shù)過濾屎勘、session過濾、表單過濾居扒、隱藏過濾概漱、檢測請求頭過濾
5.網(wǎng)關權限控制責任鏈模式
在網(wǎng)關作為微服務程序的入口,攔截客戶端所有的請求實現(xiàn)權限控制 喜喂,比如先判斷Api接口限流瓤摧、黑名單、用戶會話玉吁、參數(shù)過濾照弥。
Api接口限流→黑名單攔截→用戶會話。