大使模式(Ambassador)
目的
在客戶端上提供助手服務例項,並從共享資源中解除安裝常用功能。
說明
遠端服務有許多客戶端訪問它所提供的功能。該服務是遺留應用程式,無法更新。來自使用者的大量請求導致連線問題。應實施新的請求頻率規則以及延遲檢查和客戶端日誌記錄。
簡而言之
使用大使模式,我們可以實現從客戶端進行頻率較低的輪詢以及延遲檢查和日誌記錄。
Microsoft文件說明
大使服務可以被視為與客戶協同工作的程式外代理。此模式可用於以語言無關的方式解除安裝常見的客戶端連線任務,如監視,日誌記錄,路由,安全性(如TLS)和彈性模式。它通常與遺留應用程式或其他難以修改的應用程式一起使用,以擴充套件其網路功能。
程式示例
考慮到上面的例子,我們將以簡單的方式模仿功能。
我們有一個由遠端服務和大使服務實現的介面:
interface RemoteServiceInterface { long doRemoteFunction(int value) throws Exception; } |
表示為單例的遠端服務。
public class RemoteService implements RemoteServiceInterface { private static final Logger LOGGER = LoggerFactory.getLogger(RemoteService.class); private static RemoteService service = null;2 static synchronized RemoteService getRemoteService() { if (service == null) { service = new RemoteService(); } return service; } private RemoteService() {} @Override public long doRemoteFunction(int value) { long waitTime = (long) Math.floor(Math.random() * 1000); try { sleep(waitTime); } catch (InterruptedException e) { LOGGER.error("Thread sleep interrupted", e) } return waitTime >= 200 ? value * 10 : -1; } } |
服務大使新增其他功能,如日誌記錄,延遲檢查
public class ServiceAmbassador implements RemoteServiceInterface { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAmbassador.class); private static final int RETRIES = 3; private static final int DELAY_MS = 3000; ServiceAmbassador() {} @Override public long doRemoteFunction(int value) { return safeCall(value); } private long checkLatency(int value) { RemoteService service = RemoteService.getRemoteService(); long startTime = System.currentTimeMillis(); long result = service.doRemoteFunction(value); long timeTaken = System.currentTimeMillis() - startTime; LOGGER.info("Time taken (ms): " + timeTaken); return result; } private long safeCall(int value) { int retries = 0; long result = -1; for (int i = 0; i < RETRIES; i++) { if (retries >= RETRIES) { return -1; } if ((result = checkLatency(value)) == -1) { LOGGER.info("Failed to reach remote: (" + (i + 1) + ")"); retries++; try { sleep(DELAY_MS); } catch (InterruptedException e) { LOGGER.error("Thread sleep state interrupted", e); } } else { break; } } return result; } } |
客戶端有一個本地服務大使,用於與遠端服務進行互動:
public class Client { private ServiceAmbassador serviceAmbassador; Client() { serviceAmbassador = new ServiceAmbassador(); } long useService(int value) { long result = serviceAmbassador.doRemoteFunction(value); LOGGER.info("Service result: " + result) return result; } } |
這裡有兩個使用該服務的客戶端。
Client host1 = new Client(); Client host2 = new Client(); host1.useService(12); host2.useService(73); |
適用場景
大使模式適用於無法修改或極難修改的遺留遠端服務。可以在客戶端上實現連線功能,從而無需更改遠端服務。
- 大使為遠端服務提供本地介面。
- 大使在客戶端提供日誌記錄、斷路、重試和安全保護。
典型用例
- 控制對其他物件的訪問
- 實現日誌記錄
- 實現斷路
- 解除安裝遠端服務任務
- 促進網路連線
相關文章
- Laravel Conf China 大使Laravel
- 手把手一起入門 RabbitMQ 的六大使用模式(Java 客戶端)MQ模式Java客戶端
- Ambassador 0.52 新特性:會話親和性、負載均衡控制、gRPC-Web會話負載RPCWeb
- 必備技能|熊掌記app八大使用技巧APP
- 青年大使孫宇晨:用數字技術推動全球合作
- 德國大使:中德正籌備網路安全協議協議
- 全新比特幣大使館四月亮相美國比特幣
- 伺服器的大使用者量的承載方案伺服器
- “Lexar安全大使”稱號,授予首位破解成功的測試人員
- 比特幣現金大使館將在塞普勒斯亮相比特幣
- CNCF 官方大使張磊:Kubernetes 是一個“資料庫”嗎?資料庫
- 駐日大使接受NHK專訪:中日關係正站在新的歷史起點
- 俄羅斯駭客利用WinRAR漏洞針對大使館進行網路間諜行動
- 阿里雲ECS技術普惠廣大使用者,競價型例項全面開放阿里
- 移動應用推廣中容易被忽略的九大使用者獲取策略
- 地球日集合:微軟與英特爾邀你Get綠色大使徽章,予能負碳排!微軟
- 外媒:孫宇晨任格瑞那達駐WTO大使,或加速拉美國家加密貨幣合法化加密
- 格瑞那達常駐WTO大使孫宇晨釋出宣告祝賀北京冬奧會順利召開
- 請教關於大使用者量的全國性的線上交易網站的架構網站架構
- 根據大使館提供的資料,在烏克蘭的中國留學生共有2700人。使
- 東方證券:擁抱大產品、大使用者平臺的繁榮性成長(附下載)
- 年底覆盤遊戲留存表現前,這 6 大使用者屬性你需要了解一下遊戲
- 孫宇晨闢謠!作為格瑞那達駐WTO大使,將推動區塊鏈行業合規發展區塊鏈行業
- 我們總結了 3 大使用建議,並首次公開 Nacos 3.0 規劃圖 | Nacos 開源 4 週年
- 安全利器!龍蜥推出機密計算遠端證明服務—OAAS 誠邀廣大使用者測試
- 設計模式-單例模式、多例模式設計模式單例
- 設計模式 #5 (策略模式、代理模式)設計模式
- 建立型模式-單例模式-工廠模式模式單例
- 設計模式-單例模式,觀察者模式設計模式單例
- 設計模式--介面卡模式/代理模式設計模式
- 設計模式(二十):訪問者模式、迭代器模式、觀察者模式、原型模式、模板方法設計模式原型
- 共享模式 & 專有模式模式
- iOS模式分析 策略模式iOS模式
- 設計模式----代理模式設計模式
- 設計模式----中介模式設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-中介模式設計模式