微服務(wù),簡(jiǎn)單來(lái)說(shuō),是一種設(shè)計(jì)方法,其中一個(gè)應(yīng)用程序是作為一組小的、自治的服務(wù)組織的,它們可以獨(dú)立運(yùn)行,并通常圍繞業(yè)務(wù)功能構(gòu)建。這些服務(wù)獨(dú)立于彼此運(yùn)行,并通過(guò)明確定義的API進(jìn)行通信。與單體應(yīng)用相比,微服務(wù)架構(gòu)提供了更大的靈活性和可擴(kuò)展性,允許團(tuán)隊(duì)獨(dú)立開(kāi)發(fā)、部署和擴(kuò)展服務(wù)。
1.服務(wù)注冊(cè)與發(fā)現(xiàn)
在微服務(wù)的世界中,服務(wù)注冊(cè)與發(fā)現(xiàn)是確保每個(gè)獨(dú)立服務(wù)能夠找到并與其他服務(wù)交互的關(guān)鍵機(jī)制。隨著應(yīng)用程序的規(guī)模和復(fù)雜性的增加,明確了解和管理這些服務(wù)之間的交互就變得至關(guān)重要。
1.1. 客戶端注冊(cè) (ZooKeeper)
Apache ZooKeeper,作為分布式系統(tǒng)的堅(jiān)固基石,已經(jīng)贏得了大量的業(yè)界尊重。許多分布式系統(tǒng),包括各種微服務(wù)框架,都依賴ZooKeeper來(lái)為其提供關(guān)鍵的服務(wù),如命名、配置管理、分組服務(wù)和分布式同步。但在這里,我們將重點(diǎn)關(guān)注其在微服務(wù)架構(gòu)中作為客戶端注冊(cè)中心的應(yīng)用。
ZooKeeper簡(jiǎn)介
ZooKeeper下載鏈接
ZooKeeper最初是由雅虎創(chuàng)建的,但后來(lái)成為Apache的一個(gè)頂級(jí)項(xiàng)目。它是為分布式應(yīng)用設(shè)計(jì)的,并提供了一系列服務(wù),通過(guò)這些服務(wù)可以使分布式應(yīng)用在出現(xiàn)部分故障時(shí)繼續(xù)工作。這是通過(guò)ZooKeeper的核心架構(gòu)實(shí)現(xiàn)的,該架構(gòu)旨在將小型計(jì)算機(jī)節(jié)點(diǎn)連接起來(lái),形成一個(gè)強(qiáng)大的分布式框架。
ZooKeeper的數(shù)據(jù)模型
ZooKeeper的數(shù)據(jù)結(jié)構(gòu)很像一個(gè)分布式文件系統(tǒng),由目錄和文件組成。但在ZooKeeper中,每一個(gè)節(jié)點(diǎn)都被稱為一個(gè)“znode”。每一個(gè)znode都可以存儲(chǔ)數(shù)據(jù),并且可以擁有子節(jié)點(diǎn)。
當(dāng)微服務(wù)要注冊(cè)自己時(shí),它會(huì)在ZooKeeper中為自己創(chuàng)建一個(gè)znode。通常,這個(gè)znode會(huì)存儲(chǔ)關(guān)于服務(wù)的關(guān)鍵信息,如其IP地址、端口和任何其他的元數(shù)據(jù)。
服務(wù)注冊(cè)的過(guò)程
- 啟動(dòng)和連接: 當(dāng)微服務(wù)啟動(dòng)時(shí),它會(huì)初始化一個(gè)到ZooKeeper集群的連接。
- 創(chuàng)建znode: 微服務(wù)會(huì)在一個(gè)指定的路徑下創(chuàng)建一個(gè)znode,通常這個(gè)路徑會(huì)基于服務(wù)的名稱。
- 存儲(chǔ)數(shù)據(jù): 服務(wù)會(huì)將其元數(shù)據(jù)存儲(chǔ)在這個(gè)znode中。這些元數(shù)據(jù)可能包括IP地址、端口、版本號(hào)、啟動(dòng)時(shí)間等。
- 周期性心跳: 為了讓ZooKeeper知道服務(wù)仍然是活躍的,服務(wù)會(huì)周期性地發(fā)送心跳到其znode。
- 注銷: 當(dāng)服務(wù)關(guān)閉時(shí),它會(huì)刪除其在ZooKeeper中的znode。
【ZooKeeper客戶端注冊(cè)】
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
// 初始化ZooKeeper客戶端并注冊(cè)服務(wù)
public class ServiceRegistry {
private static final String ZK_ADDRESS = "localhost:2181";
private ZooKeeper zooKeeper;
public ServiceRegistry() throws Exception {
// 連接ZooKeeper
this.zooKeeper = new ZooKeeper(ZK_ADDRESS, 5000, watchedEvent -> {});
}
// 注冊(cè)服務(wù)
public void registerService(String serviceName, String serviceInfo) throws Exception {
String path = "/services/" + serviceName;
if (zooKeeper.exists(path, false) == null) {
zooKeeper.create(path, serviceInfo.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
}
// 使用方法:
ServiceRegistry registry = new ServiceRegistry();
registry.registerService("myService", "serviceInstanceInfo");
ZooKeeper的一致性模型
ZooKeeper使用了一個(gè)稱為“Zab”的協(xié)議來(lái)保證其數(shù)據(jù)的一致性。Zab協(xié)議確保了所有的寫(xiě)操作都是有序的,這意味著在多個(gè)節(jié)點(diǎn)上的所有操作都是按照相同的順序執(zhí)行的。
安全性
ZooKeeper提供了基于ACL的安全模型,允許管理員控制哪些客戶端可以執(zhí)行哪些操作。這對(duì)于防止惡意的或誤配置的客戶端對(duì)系統(tǒng)造成傷害是非常有用的。
總結(jié)
ZooKeeper,作為分布式系統(tǒng)的關(guān)鍵組件,為微服務(wù)提供了一個(gè)可靠的、高度可用的服務(wù)注冊(cè)平臺(tái)。通過(guò)了解其內(nèi)部工作原理,我們可以更好地利用其為我們的微服務(wù)架構(gòu)提供支持。
1.2. 第三方注冊(cè) (獨(dú)立的服務(wù)Registrar)
隨著微服務(wù)架構(gòu)的日益普及,有時(shí)直接注冊(cè)每個(gè)服務(wù)可能會(huì)變得復(fù)雜和費(fèi)時(shí)。因此,有必要引入一個(gè)第三方服務(wù)注冊(cè)機(jī)制,即獨(dú)立的服務(wù)Registrar,來(lái)幫助管理這些服務(wù)。
什么是第三方服務(wù)Registrar?
第三方服務(wù)Registrar是一個(gè)中間層,它介于微服務(wù)和服務(wù)注冊(cè)中心之間。它可以自動(dòng)檢測(cè)、注冊(cè)和注銷微服務(wù)。而不是直接依賴每個(gè)微服務(wù)來(lái)注冊(cè)自己,這種方法為管理和監(jiān)控提供了一個(gè)集中的位置。
為什么需要第三方注冊(cè)?
- 自動(dòng)化管理:隨著微服務(wù)的增加,手動(dòng)注冊(cè)、更新和注銷服務(wù)實(shí)例可能會(huì)變得非常麻煩。第三方注冊(cè)可以自動(dòng)處理這些任務(wù)。
- 集中的監(jiān)控:使用第三方注冊(cè),開(kāi)發(fā)人員和操作團(tuán)隊(duì)可以在一個(gè)地方監(jiān)控所有服務(wù)的狀態(tài)和健康狀況。
- 更好的安全性:由于所有的注冊(cè)和注銷操作都通過(guò)一個(gè)中心點(diǎn),可以更好地控制哪些服務(wù)被允許注冊(cè),防止惡意服務(wù)的注冊(cè)。
第三方注冊(cè)的工作原理
- 服務(wù)檢測(cè):Registrar會(huì)定期掃描網(wǎng)絡(luò)或特定的端點(diǎn),查找新的服務(wù)實(shí)例。
- 服務(wù)注冊(cè):一旦發(fā)現(xiàn)新的服務(wù)實(shí)例,Registrar會(huì)自動(dòng)將其注冊(cè)到服務(wù)注冊(cè)中心。
- 健康檢查:Registrar會(huì)定期檢查每個(gè)服務(wù)實(shí)例的健康狀況。如果發(fā)現(xiàn)服務(wù)實(shí)例不再健康或無(wú)法訪問(wèn),它將從服務(wù)注冊(cè)中心中注銷該實(shí)例。
- 元數(shù)據(jù)管理:對(duì)于需要額外配置的服務(wù),Registrar可以存儲(chǔ)和管理這些元數(shù)據(jù),確保每個(gè)服務(wù)都按照預(yù)期運(yùn)行。
使用場(chǎng)景
以下是幾種可能需要第三方服務(wù)Registrar的場(chǎng)景:
- 大型部署:在數(shù)百或數(shù)千的微服務(wù)實(shí)例中,手動(dòng)管理每個(gè)實(shí)例是不切實(shí)際的。
- 動(dòng)態(tài)環(huán)境:在云環(huán)境中,服務(wù)實(shí)例可能會(huì)頻繁啟動(dòng)和關(guān)閉。第三方注冊(cè)可以確保服務(wù)注冊(cè)中心始終是最新的。
- 高安全性需求:在高安全性的環(huán)境中,可能需要確保只有被信任的服務(wù)可以注冊(cè)。
挑戰(zhàn)和注意事項(xiàng)
- 網(wǎng)絡(luò)開(kāi)銷:由于需要頻繁地檢查服務(wù)實(shí)例的健康狀況,可能會(huì)產(chǎn)生大量的網(wǎng)絡(luò)流量。
- 單點(diǎn)故障:如果Registrar本身出現(xiàn)故障,可能會(huì)影響到所有的服務(wù)注冊(cè)和注銷操作。
使用第三方服務(wù)Registrar可以大大簡(jiǎn)化微服務(wù)的管理和監(jiān)控。但是,選擇和部署適當(dāng)?shù)腞egistrar解決方案需要仔細(xì)的規(guī)劃和測(cè)試,以確保它滿足特定環(huán)境的需求。
1.3. 客戶端發(fā)現(xiàn)
在微服務(wù)的世界里,服務(wù)發(fā)現(xiàn)是核心組件之一。當(dāng)一個(gè)服務(wù)需要與另一個(gè)服務(wù)交互時(shí),它首先需要知道其他服務(wù)的位置。這就是服務(wù)發(fā)現(xiàn)的目的。而在客戶端發(fā)現(xiàn)模式中,調(diào)用方服務(wù)負(fù)責(zé)知道它應(yīng)該與哪個(gè)服務(wù)實(shí)例進(jìn)行交互。
什么是客戶端發(fā)現(xiàn)?
客戶端發(fā)現(xiàn)是服務(wù)發(fā)現(xiàn)的一種模式,其中客戶端或消費(fèi)者服務(wù)負(fù)責(zé)確定網(wǎng)絡(luò)中的可用服務(wù)實(shí)例,然后直接與一個(gè)實(shí)例進(jìn)行通信。這與服務(wù)端發(fā)現(xiàn)模式形成對(duì)比,后者由API網(wǎng)關(guān)或負(fù)載均衡器來(lái)決定應(yīng)與哪個(gè)服務(wù)實(shí)例通信。
客戶端發(fā)現(xiàn)的工作原理
- 注冊(cè):每當(dāng)一個(gè)服務(wù)實(shí)例啟動(dòng)并變得可用時(shí),它都會(huì)將自己的地址注冊(cè)到服務(wù)注冊(cè)中心。
- 查詢:客戶端需要與服務(wù)進(jìn)行通信時(shí),首先查詢服務(wù)注冊(cè)中心,獲取所有可用的服務(wù)實(shí)例的列表。
- 選擇:客戶端從獲取的服務(wù)列表中選擇一個(gè)進(jìn)行通信。這通常涉及某種形式的負(fù)載均衡,例如輪詢或隨機(jī)選擇。
- 通信:客戶端直接與所選的服務(wù)實(shí)例通信。
優(yōu)點(diǎn)
- 靈活性:客戶端可以根據(jù)需要實(shí)現(xiàn)自己的負(fù)載均衡策略。
- 減少延遲:沒(méi)有中間組件(如API網(wǎng)關(guān)或負(fù)載均衡器)來(lái)處理請(qǐng)求,從而減少了通信的延遲。
缺點(diǎn)
- 客戶端復(fù)雜性:每個(gè)客戶端都必須實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡的邏輯。
- 一致性挑戰(zhàn):所有客戶端都必須一致地更新其服務(wù)發(fā)現(xiàn)邏輯和策略。
實(shí)現(xiàn)客戶端發(fā)現(xiàn)的工具和技術(shù)
許多服務(wù)發(fā)現(xiàn)工具,如Eureka、Consul和Zookeeper,都支持客戶端發(fā)現(xiàn)模式。
- Eureka:Netflix創(chuàng)建的Eureka是微服務(wù)架構(gòu)中最受歡迎的服務(wù)發(fā)現(xiàn)工具之一。Eureka客戶端提供了內(nèi)置的負(fù)載均衡策略,可以很容易地與Spring Cloud集成。
- Consul:由HashiCorp開(kāi)發(fā)的Consul提供了一個(gè)多功能的服務(wù)發(fā)現(xiàn)解決方案,支持健康檢查、KV存儲(chǔ)和多數(shù)據(jù)中心。
- Zookeeper:如前文所述,Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù),它也常被用作服務(wù)發(fā)現(xiàn)。
客戶端發(fā)現(xiàn)為微服務(wù)提供了一種靈活、低延遲的方式來(lái)找到并與其他服務(wù)進(jìn)行通信。然而,它也增加了客戶端的復(fù)雜性,并要求所有客戶端都保持邏輯和策略的一致性。選擇是否使用客戶端發(fā)現(xiàn)取決于特定的需求和約束。
1.4. 服務(wù)端發(fā)現(xiàn)
服務(wù)端發(fā)現(xiàn)是微服務(wù)架構(gòu)中常見(jiàn)的一種服務(wù)發(fā)現(xiàn)模式。與客戶端發(fā)現(xiàn)相對(duì),服務(wù)端發(fā)現(xiàn)把找到服務(wù)的責(zé)任從客戶端移到了服務(wù)端。
什么是服務(wù)端發(fā)現(xiàn)?
服務(wù)端發(fā)現(xiàn)中,客戶端應(yīng)用首先請(qǐng)求一個(gè)中心負(fù)載均衡器或API網(wǎng)關(guān),要求知道服務(wù)的位置。這個(gè)中心組件查詢服務(wù)注冊(cè)中心,確定服務(wù)實(shí)例的位置,然后將請(qǐng)求路由到那個(gè)服務(wù)實(shí)例。
服務(wù)端發(fā)現(xiàn)的工作原理
- 注冊(cè):與客戶端發(fā)現(xiàn)相同,服務(wù)實(shí)例在啟動(dòng)時(shí)將其位置注冊(cè)到服務(wù)注冊(cè)中心。
- 路由請(qǐng)求:客戶端發(fā)送其請(qǐng)求到中心負(fù)載均衡器或API網(wǎng)關(guān),而不是直接發(fā)送到服務(wù)實(shí)例。
- 選擇服務(wù)實(shí)例:負(fù)載均衡器查詢服務(wù)注冊(cè)中心,找到可用的服務(wù)實(shí)例并決定將請(qǐng)求路由到哪個(gè)實(shí)例。
- 請(qǐng)求轉(zhuǎn)發(fā):負(fù)載均衡器將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到選定的服務(wù)實(shí)例。
【從ZooKeeper中發(fā)現(xiàn)服務(wù)】
// 從ZooKeeper中發(fā)現(xiàn)服務(wù)
public List<String> discoverService(String serviceName) throws Exception {
String path = "/services/" + serviceName;
return zooKeeper.getChildren(path, false);
}
// 使用方法:
List<String> serviceInstances = discoverService("myService");
優(yōu)點(diǎn)
- 簡(jiǎn)化客戶端:客戶端邏輯更簡(jiǎn)單,只需知道中心負(fù)載均衡器的位置。
- 集中的流量管理:流量形狀、路由和負(fù)載均衡策略可以在中央位置統(tǒng)一管理。
缺點(diǎn)
- 增加延遲:請(qǐng)求需要經(jīng)過(guò)額外的跳轉(zhuǎn),可能導(dǎo)致輕微的延遲。
- 單點(diǎn)故障風(fēng)險(xiǎn):如果中心負(fù)載均衡器或API網(wǎng)關(guān)出現(xiàn)問(wèn)題,可能影響到所有的請(qǐng)求。
使用場(chǎng)景
服務(wù)端發(fā)現(xiàn)特別適合那些客戶端多樣性很高的環(huán)境,例如:移動(dòng)應(yīng)用、第三方開(kāi)發(fā)者或多個(gè)前端界面。
1.5. Consul
Consul是HashiCorp開(kāi)發(fā)的一種服務(wù)發(fā)現(xiàn)和配置分發(fā)工具。它旨在提供高可用性和跨數(shù)據(jù)中心的支持。
Consul的主要特點(diǎn)
- 服務(wù)發(fā)現(xiàn):Consul使應(yīng)用可以提供和發(fā)現(xiàn)其他服務(wù),提供健康檢查來(lái)確定服務(wù)實(shí)例的健康狀態(tài)。
- 鍵/值存儲(chǔ):一個(gè)用于配置和動(dòng)態(tài)服務(wù)配置的分布式鍵/值存儲(chǔ)。
- 多數(shù)據(jù)中心:Consul支持多數(shù)據(jù)中心,這使得它成為大型應(yīng)用的理想選擇。
如何使用Consul
- 安裝和運(yùn)行:Consul是一個(gè)單一的二進(jìn)制文件,可以在其官網(wǎng)下載。它以代理模式運(yùn)行,每個(gè)節(jié)點(diǎn)上都有一個(gè)Consul代理。
-
服務(wù)注冊(cè):服務(wù)可以通過(guò)定義一個(gè)服務(wù)定義文件然后使用
consul agent
命令來(lái)注冊(cè)。 - 健康檢查:Consul可以通過(guò)各種方式(如HTTP、TCP和執(zhí)行指定的腳本)來(lái)定期檢查服務(wù)實(shí)例的健康狀況。
Consul與其他服務(wù)發(fā)現(xiàn)工具的對(duì)比
雖然Eureka、Zookeeper和其他工具也為服務(wù)發(fā)現(xiàn)提供了功能,但Consul提供了一些獨(dú)特的功能,如多數(shù)據(jù)中心支持和鍵/值存儲(chǔ)。
1.6. Eureka
Eureka是Netflix開(kāi)源的一種服務(wù)發(fā)現(xiàn)工具,特別適用于云環(huán)境中的大型分布式系統(tǒng)。它的名稱源自希臘語(yǔ)“我找到了!”的意思。
Eureka的核心組件
- Eureka服務(wù)器:提供服務(wù)注冊(cè)服務(wù)。所有提供服務(wù)的客戶端應(yīng)用都應(yīng)向Eureka注冊(cè),并提供元數(shù)據(jù)信息。
- Eureka客戶端:是一個(gè)Java客戶端,用于簡(jiǎn)化與Eureka服務(wù)器的交互??蛻舳艘灿幸粋€(gè)內(nèi)置的負(fù)載均衡器。
Eureka的工作原理
- 服務(wù)注冊(cè):當(dāng)Eureka客戶端啟動(dòng)時(shí),它將自己的信息注冊(cè)到Eureka服務(wù)器,并定期發(fā)送心跳來(lái)續(xù)約。
- 服務(wù)消費(fèi):服務(wù)消費(fèi)者從Eureka服務(wù)器獲取注冊(cè)表信息,并緩存在本地。消費(fèi)者將使用這些信息找到服務(wù)提供者。
- 服務(wù)下線:當(dāng)客戶端關(guān)閉時(shí),它會(huì)向Eureka服務(wù)器發(fā)送一個(gè)請(qǐng)求,要求其刪除注冊(cè)表中的該實(shí)例。
Eureka的特點(diǎn)
- 可用性:Eureka可以很好地處理因網(wǎng)絡(luò)問(wèn)題導(dǎo)致的部分故障。如果因?yàn)榫W(wǎng)絡(luò)分區(qū),客戶端不能聯(lián)系到服務(wù),客戶端會(huì)緩存服務(wù)器的狀態(tài),并使用此信息來(lái)處理其請(qǐng)求。
- 負(fù)載均衡:Eureka客戶端包含一個(gè)負(fù)載均衡器,可以為請(qǐng)求到服務(wù)實(shí)例提供負(fù)載均衡。
- 與Spring Cloud的集成:Eureka可以與Spring Cloud無(wú)縫集成,使其成為Spring Boot應(yīng)用的理想選擇。
1.7. SmartStack
SmartStack是Airbnb開(kāi)發(fā)的服務(wù)發(fā)現(xiàn)工具,它基于兩個(gè)主要組件:Nerve和Synapse。
Nerve
Nerve是一個(gè)被設(shè)計(jì)為在每個(gè)服務(wù)實(shí)例上運(yùn)行的守護(hù)程序。它負(fù)責(zé)將服務(wù)注冊(cè)到Zookeeper。如果服務(wù)實(shí)例變得不健康,Nerve將負(fù)責(zé)將其從Zookeeper中注銷。
Synapse
Synapse是另一個(gè)守護(hù)程序,被設(shè)計(jì)為在每個(gè)需要發(fā)現(xiàn)服務(wù)的機(jī)器上運(yùn)行。它定期從Zookeeper中拉取服務(wù)注冊(cè)信息,并更新其本地負(fù)載均衡器(如HAProxy)的配置。
SmartStack的特點(diǎn)
- 自動(dòng)健康檢查:Nerve和Synapse聯(lián)合工作,確保只有健康的服務(wù)實(shí)例會(huì)被路由請(qǐng)求。
- 彈性與可靠性:SmartStack確保服務(wù)的高可用性,即使在面對(duì)網(wǎng)絡(luò)分區(qū)或其他故障時(shí)。
- 與現(xiàn)有技術(shù)的集成:使用Zookeeper作為中心存儲(chǔ),HAProxy作為負(fù)載均衡器,使SmartStack可以很容易地與現(xiàn)有技術(shù)棧集成。
1.8. Etcd
Etcd是一個(gè)開(kāi)源的、高可用的分布式鍵值存儲(chǔ),它主要用于共享配置和服務(wù)發(fā)現(xiàn)。由CoreOS開(kāi)發(fā),etcd是為大型集群設(shè)計(jì)的,特別是為Kubernetes提供可靠的數(shù)據(jù)存儲(chǔ)。
Etcd的核心特點(diǎn)
- 一致性和高可用性:Etcd基于Raft算法,確保分布式系統(tǒng)中的數(shù)據(jù)一致性。
- 分布式鎖:使用etcd可以為分布式系統(tǒng)實(shí)現(xiàn)鎖機(jī)制。
- 監(jiān)控和警報(bào):可以監(jiān)控鍵值對(duì)的更改,例如配置更改或服務(wù)注冊(cè)/注銷。
- 簡(jiǎn)單的API:etcd提供了一個(gè)簡(jiǎn)單的RESTful API,使其易于與各種應(yīng)用程序集成。
如何使用Etcd
- 安裝與啟動(dòng):可以從etcd的GitHub存儲(chǔ)庫(kù)下載其二進(jìn)制文件。啟動(dòng)etcd后,它將開(kāi)始監(jiān)聽(tīng)客戶端請(qǐng)求。
-
鍵值操作:使用HTTP API或提供的命令行客戶端
etcdctl
,用戶可以設(shè)置、獲取、刪除和監(jiān)控鍵值對(duì)。 - 服務(wù)發(fā)現(xiàn):在etcd中,服務(wù)實(shí)例在啟動(dòng)時(shí)將其地址和其他元數(shù)據(jù)作為鍵值對(duì)存儲(chǔ)。需要這些服務(wù)的客戶端可以查詢etcd來(lái)發(fā)現(xiàn)它們。
Etcd與其他服務(wù)發(fā)現(xiàn)工具的對(duì)比
與Zookeeper和Consul等工具相比,etcd提供了一個(gè)更為簡(jiǎn)單和直接的API。它的設(shè)計(jì)初衷是為了滿足現(xiàn)代容器集群(如Kubernetes)的需求,因此它非常適合在這種環(huán)境中使用。
2. API 網(wǎng)關(guān)
在微服務(wù)架構(gòu)中,API網(wǎng)關(guān)是一個(gè)服務(wù)器,它是系統(tǒng)的入口點(diǎn),負(fù)責(zé)請(qǐng)求路由、組成API、負(fù)載均衡、身份驗(yàn)證、授權(quán)、安全等。
為什么需要API網(wǎng)關(guān)?
API Gateway 是一個(gè)服務(wù)器,也可以說(shuō)是進(jìn)入系統(tǒng)的唯一節(jié)點(diǎn)。這跟面向?qū)ο笤O(shè)計(jì)模式中的Facade 模式很像。API Gateway 封裝內(nèi)部系統(tǒng)的架構(gòu),并且提供 API 給各個(gè)客戶端。它還可能有其他功能,如授權(quán)、監(jiān)控、負(fù)載均衡、緩存、請(qǐng)求分片和管理、靜態(tài)響應(yīng)處理等。
- 單一入口:為外部消費(fèi)者提供一個(gè)統(tǒng)一的API入口,隱藏系統(tǒng)的內(nèi)部結(jié)構(gòu)。
- API組合:將多個(gè)微服務(wù)的操作組合成單個(gè)復(fù)合操作,從而減少客戶端與服務(wù)器之間的請(qǐng)求和響應(yīng)的次數(shù)。
- 負(fù)載均衡:分發(fā)傳入的請(qǐng)求到多個(gè)實(shí)例上,提高系統(tǒng)的可伸縮性和可用性。
- 安全:集中化的安全措施,如身份驗(yàn)證、授權(quán)和SSL處理。
API網(wǎng)關(guān)的常見(jiàn)特性
- 請(qǐng)求路由:將API請(qǐng)求轉(zhuǎn)發(fā)到適當(dāng)?shù)奈⒎?wù)。
- 請(qǐng)求/響應(yīng)轉(zhuǎn)換:修改客戶端和服務(wù)之間的請(qǐng)求和響應(yīng)格式。
- API聚合:將多個(gè)服務(wù)的數(shù)據(jù)和功能組合為單一的、一致的API。
- 安全性:包括速率限制、身份驗(yàn)證和授權(quán)。
- 緩存:為常見(jiàn)請(qǐng)求提供緩存,減少響應(yīng)時(shí)間和背后的服務(wù)負(fù)載。
【API網(wǎng)關(guān)功能示例】
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
// Spring Cloud Gateway的一個(gè)簡(jiǎn)單配置示例
public class ApiGatewayConfiguration {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/service-api/**")
.uri("http://localhost:8080/"))
.build();
}
}
API Gateway 負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)、合成和協(xié)議轉(zhuǎn)換。所有來(lái)自客戶端的請(qǐng)求都要先經(jīng)過(guò) API Gateway,然后路由這些請(qǐng)求到對(duì)應(yīng)的微服務(wù)。API Gateway 將經(jīng)常通過(guò)調(diào)用多個(gè)微服務(wù)來(lái)處理一個(gè)請(qǐng)求以及聚合多個(gè)服務(wù)的結(jié)果。它可以在 web 協(xié)議與內(nèi)部使用的非 Web 友好型協(xié)議間進(jìn)行轉(zhuǎn)換,如HTTP 協(xié)議、WebSocket 協(xié)議。下圖展示了一個(gè)適應(yīng)當(dāng)前架構(gòu)的 API Gateway。
2.1. 請(qǐng)求轉(zhuǎn)發(fā)
在微服務(wù)架構(gòu)中,請(qǐng)求轉(zhuǎn)發(fā)是API網(wǎng)關(guān)的核心功能之一。當(dāng)客戶端發(fā)出請(qǐng)求時(shí),API網(wǎng)關(guān)的責(zé)任是確定哪個(gè)服務(wù)應(yīng)該處理該請(qǐng)求,并將其轉(zhuǎn)發(fā)到適當(dāng)?shù)姆?wù)實(shí)例。
工作原理
- 動(dòng)態(tài)路由:網(wǎng)關(guān)不是硬編碼到特定服務(wù)的地址,而是動(dòng)態(tài)地決定路由。這通?;诜?wù)發(fā)現(xiàn)機(jī)制,例如前面討論過(guò)的Eureka或etcd。
- 負(fù)載均衡:請(qǐng)求不僅僅是轉(zhuǎn)發(fā)到任意服務(wù)實(shí)例,而是考慮到每個(gè)實(shí)例的負(fù)載和健康狀況。
- 過(guò)濾器鏈:在轉(zhuǎn)發(fā)請(qǐng)求之前和之后,網(wǎng)關(guān)可以應(yīng)用一系列過(guò)濾器,例如安全過(guò)濾器、響應(yīng)轉(zhuǎn)換過(guò)濾器等。
轉(zhuǎn)發(fā)策略
- 循環(huán)Robin:按順序選擇每個(gè)服務(wù)實(shí)例。
- 最少連接:將請(qǐng)求轉(zhuǎn)發(fā)到連接數(shù)最少的實(shí)例。
- 延遲感知:考慮每個(gè)實(shí)例的延遲來(lái)決定轉(zhuǎn)發(fā)。
- 地理位置:基于請(qǐng)求來(lái)源的地理位置來(lái)轉(zhuǎn)發(fā)。
2.2. 響應(yīng)合并
在微服務(wù)環(huán)境中,一個(gè)客戶端請(qǐng)求可能需要多個(gè)服務(wù)協(xié)同工作才能產(chǎn)生最終的響應(yīng)。API網(wǎng)關(guān)可以聚合多個(gè)服務(wù)的響應(yīng),為客戶端提供一個(gè)統(tǒng)一的、一致的響應(yīng)。
使用場(chǎng)景
- 組合視圖:例如,一個(gè)用戶的個(gè)人資料視圖可能需要從用戶服務(wù)、訂單服務(wù)和評(píng)論服務(wù)獲取數(shù)據(jù)。
- 分析和報(bào)告:聚合多個(gè)服務(wù)提供的數(shù)據(jù),以生成復(fù)雜的報(bào)告。
實(shí)現(xiàn)
- 并行請(qǐng)求:API網(wǎng)關(guān)可以并行地向多個(gè)服務(wù)發(fā)送請(qǐng)求,從而減少總的響應(yīng)時(shí)間。
- 數(shù)據(jù)轉(zhuǎn)換:轉(zhuǎn)換和標(biāo)準(zhǔn)化來(lái)自不同服務(wù)的數(shù)據(jù)格式。
- 錯(cuò)誤處理:當(dāng)其中一個(gè)服務(wù)返回錯(cuò)誤或超時(shí)時(shí),決定如何處理。
2.3. 協(xié)議轉(zhuǎn)換
隨著技術(shù)的發(fā)展,不同的服務(wù)可能使用不同的通信協(xié)議。API網(wǎng)關(guān)可以充當(dāng)協(xié)議轉(zhuǎn)換器,將客戶端的請(qǐng)求從一種協(xié)議轉(zhuǎn)換為另一種協(xié)議。
例子
- HTTP到gRPC:客戶端可能使用HTTP/REST,而內(nèi)部服務(wù)使用gRPC。API網(wǎng)關(guān)可以轉(zhuǎn)換這兩種通信。
- 版本轉(zhuǎn)換:舊的客戶端可能使用過(guò)時(shí)的API版本。網(wǎng)關(guān)可以將這些請(qǐng)求轉(zhuǎn)換為新版本的請(qǐng)求。
2.4. 數(shù)據(jù)轉(zhuǎn)換
在微服務(wù)架構(gòu)中,由于歷史原因、技術(shù)選擇或團(tuán)隊(duì)偏好,不同的服務(wù)可能會(huì)使用不同的數(shù)據(jù)格式。API網(wǎng)關(guān)作為微服務(wù)與客戶端之間的中介,有時(shí)需要進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換。
使用場(chǎng)景
- 版本兼容性:當(dāng)服務(wù)升級(jí)并更改其數(shù)據(jù)格式時(shí),為了確保舊的客戶端仍然可以工作,網(wǎng)關(guān)可以將舊格式的數(shù)據(jù)轉(zhuǎn)換為新格式。
- 格式標(biāo)準(zhǔn)化:將XML轉(zhuǎn)換為JSON,或者將特定于供應(yīng)商的格式轉(zhuǎn)換為標(biāo)準(zhǔn)格式。
數(shù)據(jù)轉(zhuǎn)換策略
- XSLT轉(zhuǎn)換:對(duì)于XML數(shù)據(jù),可以使用XSLT來(lái)轉(zhuǎn)換數(shù)據(jù)。
- JSON轉(zhuǎn)換:使用庫(kù)如Jackson或Gson進(jìn)行JSON數(shù)據(jù)的轉(zhuǎn)換。
- 數(shù)據(jù)映射:定義源和目標(biāo)數(shù)據(jù)結(jié)構(gòu)之間的映射。
2.5. 安全認(rèn)證
API網(wǎng)關(guān)經(jīng)常承擔(dān)應(yīng)用安全的責(zé)任,因?yàn)樗撬腥胝菊?qǐng)求的第一個(gè)接觸點(diǎn)。
主要安全功能
- 身份驗(yàn)證:確定請(qǐng)求者是誰(shuí)。常見(jiàn)的方法包括基于令牌的身份驗(yàn)證,例如JWT。
- 授權(quán):確定請(qǐng)求者可以做什么。例如,某些用戶可能只能訪問(wèn)讀取操作,而其他用戶則有寫(xiě)權(quán)限。
- 限速:基于用戶或IP地址限制請(qǐng)求的速率,以防止濫用或攻擊。
- 防火墻功能:阻止來(lái)自惡意來(lái)源的請(qǐng)求,或阻止某些類型的請(qǐng)求。
實(shí)施策略
- API密鑰:每個(gè)請(qǐng)求必須包括一個(gè)API密鑰,網(wǎng)關(guān)使用該密鑰來(lái)確定和驗(yàn)證請(qǐng)求者。
- OAuth:一個(gè)標(biāo)準(zhǔn)的授權(quán)框架,允許第三方應(yīng)用程序有限的訪問(wèn)用戶帳戶。
- JWT (JSON Web Tokens):一種簡(jiǎn)潔的、自包含的方式,用于表示受方之間信息的聲明。
3. 配置中心
在微服務(wù)架構(gòu)中,配置中心是一個(gè)存儲(chǔ)外部配置的服務(wù)。外部配置是與應(yīng)用程序分開(kāi)的配置,可以在不重啟應(yīng)用程序的情況下更改。
為什么需要配置中心?
- 動(dòng)態(tài)更改:在運(yùn)行時(shí)動(dòng)態(tài)地更改配置,而無(wú)需重啟服務(wù)。
- 集中管理:對(duì)于擁有大量微服務(wù)的大型系統(tǒng),集中管理配置是必要的。
- 版本控制:保存配置的歷史版本,并能夠回滾到以前的版本。
3.1. Zookeeper 配置中心
Apache ZooKeeper是一個(gè)高性能的、分布式的、開(kāi)源的協(xié)調(diào)服務(wù),用于分布式應(yīng)用。盡管它不是專門(mén)為配置管理設(shè)計(jì)的,但它經(jīng)常在這個(gè)場(chǎng)景中使用。
ZooKeeper配置中心的優(yōu)勢(shì)
- 高可用性:由于其分布式特性,ZooKeeper能夠提供高可用性和容錯(cuò)能力。
- 實(shí)時(shí)性:當(dāng)配置更改時(shí),可以實(shí)時(shí)通知相關(guān)的服務(wù)實(shí)例。
- 分布式鎖:ZooKeeper支持分布式鎖,這對(duì)于在多個(gè)服務(wù)間同步配置非常有用。
如何使用ZooKeeper作為配置中心
- 創(chuàng)建節(jié)點(diǎn):在ZooKeeper中,可以創(chuàng)建持久節(jié)點(diǎn)或臨時(shí)節(jié)點(diǎn)來(lái)存儲(chǔ)配置信息。臨時(shí)節(jié)點(diǎn)在客戶端斷開(kāi)連接時(shí)會(huì)消失。
- 監(jiān)聽(tīng)配置變化:服務(wù)可以監(jiān)聽(tīng)其配置節(jié)點(diǎn)的變化。當(dāng)其他服務(wù)或管理員更改配置時(shí),服務(wù)會(huì)收到通知并可以重新加載配置。
- 版本控制:ZooKeeper為每個(gè)znode(ZooKeeper中的數(shù)據(jù)節(jié)點(diǎn))提供了一個(gè)版本號(hào),這有助于避免并發(fā)更改的問(wèn)題。
【從ZooKeeper獲取配置】
// 從ZooKeeper獲取配置
public String getConfig(String configKey) throws Exception {
String path = "/config/" + configKey;
if (zooKeeper.exists(path, false) != null) {
return new String(zooKeeper.getData(path, false, null));
}
return null;
}
// 使用方法:
String myConfigValue = getConfig("myConfigKey");
3.2. 配置中心數(shù)據(jù)分類
在大型微服務(wù)環(huán)境中,配置數(shù)據(jù)可能很龐大,需要進(jìn)行有效的管理和分類。
按環(huán)境分類
- 開(kāi)發(fā)環(huán)境:開(kāi)發(fā)人員本地使用的配置。
- 測(cè)試環(huán)境:用于QA和自動(dòng)化測(cè)試的環(huán)境。
- 生產(chǎn)環(huán)境:實(shí)際用戶使用的環(huán)境。
按服務(wù)分類
對(duì)于每個(gè)微服務(wù),都有其專屬的配置。
按功能分類
例如,數(shù)據(jù)庫(kù)配置、消息隊(duì)列配置、第三方服務(wù)配置等。
權(quán)限和訪問(wèn)控制
不是每個(gè)服務(wù)或人員都應(yīng)該能夠訪問(wèn)所有的配置。配置中心應(yīng)支持基于角色的訪問(wèn)控制,確保只有授權(quán)的服務(wù)或人員能夠讀取或修改配置。
4. 事件調(diào)度 (Kafka)
Apache Kafka是一個(gè)分布式流處理平臺(tái),用于構(gòu)建實(shí)時(shí)的、容錯(cuò)的、高吞吐量的數(shù)據(jù)流管道。在微服務(wù)架構(gòu)中,Kafka經(jīng)常用作事件驅(qū)動(dòng)架構(gòu)的核心組件。
Kafka的優(yōu)勢(shì)
- 高吞吐量:Kafka設(shè)計(jì)用于處理每秒數(shù)百萬(wàn)的事件或消息。
- 持久性:即使消費(fèi)者暫時(shí)不可用或崩潰,消息也會(huì)被保存。
- 分布式:Kafka集群可以分布在多臺(tái)機(jī)器上,以提供容錯(cuò)性和高可用性。
Kafka在微服務(wù)中的應(yīng)用
- 事件源:記錄每一個(gè)發(fā)生的事件,用于事務(wù)、審計(jì)或恢復(fù)。
- 數(shù)據(jù)集成:將多個(gè)微服務(wù)的數(shù)據(jù)集成到一個(gè)大型的數(shù)據(jù)倉(cāng)庫(kù)或數(shù)據(jù)湖中。
- 異步處理:通過(guò)Kafka解耦生產(chǎn)者和消費(fèi)者,允許異步處理。
【使用Kafka發(fā)布事件】
import org.apache.kafka.clients.producer.*;
// Kafka事件發(fā)布服務(wù)
public class KafkaProducerService {
private final Producer<String, String> producer;
private static final String TOPIC = "event-topic";
public KafkaProducerService(Properties properties) {
this.producer = new KafkaProducer<>(properties);
}
public void sendEvent(String key, String value) {
producer.send(new ProducerRecord<>(TOPIC, key, value));
producer.close();
}
}
// 使用方法:
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducerService kafkaService = new KafkaProducerService(properties);
kafkaService.sendEvent("eventKey", "eventValue");
5. 服務(wù)跟蹤 (starter-sleuth)
在復(fù)雜的微服務(wù)環(huán)境中,了解請(qǐng)求如何通過(guò)各種服務(wù)傳播變得至關(guān)重要。這有助于診斷性能問(wèn)題、跟蹤錯(cuò)誤以及優(yōu)化系統(tǒng)的整體行為。這就是服務(wù)跟蹤的目的。
Spring Cloud Sleuth 是 Spring Cloud 家族的一個(gè)組件,它為 Spring Boot 應(yīng)用程序提供了一種簡(jiǎn)單而有效的方式來(lái)添加跟蹤。
Spring Cloud Sleuth的工作方式
- 請(qǐng)求 ID:Sleuth 為每個(gè)進(jìn)入系統(tǒng)的請(qǐng)求自動(dòng)生成一個(gè)唯一ID,稱為"trace id"。此ID隨請(qǐng)求在整個(gè)系統(tǒng)中傳播。
- Span ID:每當(dāng)請(qǐng)求到達(dá)一個(gè)新服務(wù)或新的活動(dòng)開(kāi)始,Sleuth 生成一個(gè)新的 “span id”。這有助于區(qū)分同一請(qǐng)求在不同服務(wù)中的不同部分。
【Spring Cloud Sleuth配置】
import org.springframework.cloud.sleuth.zipkin2.ZipkinSpanReporter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SleuthConfig {
@Bean
public ZipkinSpanReporter makeZipkinSpanReporter() {
return new ZipkinSpanReporter() {
@Override
public void report(zipkin2.Span span) {
System.out.println(
String.format("Reporting span [%s] to Zipkin", span)
);
}
};
}
}
此代碼展示了如何配置Spring Cloud Sleuth與Zipkin集成,以向Zipkin報(bào)告跟蹤數(shù)據(jù)。
與其他工具集成
Spring Cloud Sleuth 可以與 Zipkin、Elasticsearch、Logstash、Kibana (ELK stack) 等工具集成,以可視化和分析跟蹤數(shù)據(jù)。
6. 服務(wù)熔斷 (Hystrix)
在微服務(wù)架構(gòu)中,當(dāng)一個(gè)服務(wù)失敗時(shí),它可能會(huì)引發(fā)連鎖反應(yīng),導(dǎo)致整個(gè)系統(tǒng)崩潰。服務(wù)熔斷器的作用就像電路中的熔斷器:當(dāng)檢測(cè)到異常情況時(shí),它會(huì)“跳閘”以防止進(jìn)一步的損害。
Netflix Hystrix 是最知名的服務(wù)熔斷實(shí)現(xiàn)之一。
Hystrix如何工作
- 命令模式:使用 Hystrix,你將調(diào)用遠(yuǎn)程服務(wù)的代碼封裝在 HystrixCommand 對(duì)象中。
- 隔離:Hystrix 通過(guò)線程池或信號(hào)量為每個(gè)服務(wù)調(diào)用提供隔離,確保一個(gè)服務(wù)的失敗不會(huì)影響到其他服務(wù)。
- 熔斷:如果遠(yuǎn)程服務(wù)連續(xù)失敗達(dá)到一個(gè)閾值,Hystrix 將“跳閘”并自動(dòng)停止對(duì)該服務(wù)的所有調(diào)用。
。
【Hystrix斷路器示例】
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
public class SimpleHystrixCommand extends HystrixCommand<String> {
private final String name;
public SimpleHystrixCommand(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
@Override
protected String run() throws Exception {
// 這里放可能會(huì)失敗的代碼
return "Hello, " + name + "!";
}
@Override
protected String getFallback() {
return "Fallback for: " + name;
}
}
// 使用方法:
String response = new SimpleHystrixCommand("Test").execute();
6.1. Hystrix 斷路器機(jī)制
斷路器是 Hystrix 的核心。其工作原理與現(xiàn)實(shí)生活中的電路熔斷器類似:
- 關(guān)閉狀態(tài):這是正常的狀態(tài),所有請(qǐng)求都會(huì)正常處理。如果失敗率超過(guò)預(yù)定閾值,斷路器轉(zhuǎn)到“打開(kāi)”狀態(tài)。
- 打開(kāi)狀態(tài):在此狀態(tài)下,為了防止進(jìn)一步的傷害,所有請(qǐng)求都會(huì)自動(dòng)失敗,而不嘗試調(diào)用遠(yuǎn)程服務(wù)。
- 半打開(kāi)狀態(tài):在一段時(shí)間后,斷路器將轉(zhuǎn)到半打開(kāi)狀態(tài),允許部分請(qǐng)求通過(guò)。如果這些請(qǐng)求成功,斷路器將返回關(guān)閉狀態(tài);否則,它將再次打開(kāi)。
這三種狀態(tài)確保了系統(tǒng)在面對(duì)失敗時(shí)能夠迅速恢復(fù),同時(shí)還為遠(yuǎn)程服務(wù)提供了緩沖,以便有時(shí)間恢復(fù)。
7. API管理
隨著微服務(wù)的廣泛應(yīng)用,API的數(shù)量、種類和復(fù)雜性急劇增加。有效的API管理旨在簡(jiǎn)化API的設(shè)計(jì)、部署、維護(hù)和監(jiān)視,同時(shí)確保其安全性、可靠性和可用性。
API管理的核心組件
- API網(wǎng)關(guān):作為API的入口點(diǎn),負(fù)責(zé)請(qǐng)求路由、組合、轉(zhuǎn)換、驗(yàn)證、限速等。
- API設(shè)計(jì)和文檔:提供一套規(guī)范的API設(shè)計(jì)指南并持續(xù)維護(hù)API的文檔。
- API監(jiān)控和分析:監(jiān)視API的使用情況、性能和錯(cuò)誤,并提供數(shù)據(jù)驅(qū)動(dòng)的洞察。
API管理的挑戰(zhàn)
- 版本控制:隨著業(yè)務(wù)需求的變化,API可能會(huì)發(fā)生變化。如何不影響現(xiàn)有的客戶端管理API版本是一個(gè)重要的考慮。
- 限速和配額:為了防止濫用和確保公平使用,需要為API設(shè)置使用率限制。
- 安全性:包括認(rèn)證、授權(quán)、防止惡意攻擊等。
- 兼容性:新的API版本應(yīng)向下兼容,以便不影響現(xiàn)有用戶。
API管理的最佳實(shí)踐
- 開(kāi)放API規(guī)范(OAS):使用標(biāo)準(zhǔn)的API描述格式,如OpenAPI,以保證一致性。
- API測(cè)試:與軟件測(cè)試類似,但更加集中于API的合約、性能和安全性。
- API的生命周期管理:定義API從設(shè)計(jì)到棄用的完整生命周期,并按照此生命周期管理API。
在微服務(wù)架構(gòu)中,API管理成為了關(guān)鍵的組成部分。當(dāng)服務(wù)數(shù)量增加時(shí),沒(méi)有有效的API管理策略,會(huì)很快導(dǎo)致混亂。而通過(guò)上述的方法和工具,組織可以確保其API的健康、安全和高效。
【API流量控制示例】
// 使用Spring Boot Rate Limiter進(jìn)行API流量控制
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Refill;
import io.github.bucket4j.local.LocalBucketBuilder;
import java.time.Duration;
public class RateLimiterService {
private Bucket createNewBucket() {
Refill refill = Refill.greedy(10, Duration.ofMinutes(1));
Bandwidth limit = Bandwidth.classic(10, refill).withInitialTokens(1);
return LocalBucketBuilder.builder().addLimit(limit).build();
}
public boolean tryConsumeToken(Bucket bucket) {
return bucket.tryConsume(1);
}
}
// 使用方法:
RateLimiterService rateLimiter = new RateLimiterService();
Bucket bucket = rateLimiter.createNewBucket();
boolean canProcessRequest = rateLimiter.tryConsumeToken(bucket);
if (canProcessRequest) {
// 處理API請(qǐng)求
} else {
// 超出限額,拒絕請(qǐng)求或等待
}
上述代碼顯示了如何使用Bucket4j庫(kù)在Spring Boot應(yīng)用中實(shí)現(xiàn)API的速率限制。
微服務(wù)的安全性是另一個(gè)重要領(lǐng)域。主要的關(guān)注點(diǎn)包括通信安全(如使用TLS加密)、API認(rèn)證和授權(quán)、以及數(shù)據(jù)安全等。
【API安全認(rèn)證示例】文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-726261.html
// 使用Spring Security進(jìn)行API安全認(rèn)證
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@EnableWebSecurity
public class APISecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/private/**").authenticated()
.and()
.httpBasic();
}
}
上述代碼段展示了如何使用Spring Security為API路徑設(shè)置基本認(rèn)證。/public/
下的API是公開(kāi)的,而/private/
下的API需要認(rèn)證。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-726261.html
到了這里,關(guān)于微服務(wù)全棧:深入核心組件與開(kāi)發(fā)技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!