Sidecar是在分散式系統中,由於服務拓撲結構或某些原因造成服務間呼叫缺乏適當的支援而產生的解決方案。在服務間呼叫中,Sidecar充當了代理角色,將所有進入和離開的請求分配給其它服務、負載平衡、流量整形和安全處理等等。這次的主題是Sidecar在Golang中的實現,接下來本文將詳細介紹Sidecar構建的重要性、Sidecar如何運作以及如何使用Golang實現Sidecar服務。
首先需要明確Sidecar的作用。在服務化的架構下,許多服務之間需要相互調用,那麼在這樣的情況下,一些問題就隨之而來。例如服務A想要存取服務B,那麼就需要製定一個呼叫客戶端,在這個客戶端中,我們需要確定呼叫方式、位址、連接埠和協定等等,如果服務越多,呼叫關係就會越複雜。而使用Sidecar的方式,我們只需要在每個服務實例中部署一個Sidecar,它能夠攔截所有請求,並針對請求進行相應的處理,以此消除訪問關係的複雜性,提供了更為化簡的服務調用方式。
Sidecar主要的工作流程如下:
Step 1: Sidecar負責攔截所有客戶端的請求。
Step 2: Sidecar將攔截的請求轉化為正常的協議,然後將請求傳送給服務。
Step 3: 當服務回應到達時,Sidecar從服務中提取回應,並進行反向轉化,將回應傳回給客戶端。
一個具有Sidecar功能的架構圖如下:
首先,需要確定很多服務需要呼叫的客戶端的名稱和地址以及端口,以便進行調用,我們稱之為服務發現。具體步驟如下:
Step 1: 服務發現:Sidecar需要從配置中心或註冊中心中了解目前應用程式的服務發現資訊。這些服務發現資訊記錄了應用的所有服務以及它們的位址和連接埠信息,可以利用這些資訊讓Sidecar完成服務的呼叫。
Step 2: 代理設定:Sidecar需要對請求進行攔截並進行代理設定。如果客戶端請求具有相應的標示符,那麼就將請求轉換為正常的協定格式後發送給服務,如果沒有,那麼Sidecar就拒絕它。
透過上述這些步驟,就可以實現Golang中的Sidecar服務。程式碼實作可以參考以下流程:
//定義服務發現位址
const discoverUrl = "https://srv. discover.local/path"
type ServiceDiscoveryClient interface{
FindService(serviceName string) ([]string, error)
}
func NewServiceDiscoveryClient() ServiceDiscoveryClient {
return &serviceDiscoveryClient{discoverUrl}
}
type serviceDiscoveryClient struct{
url string
}
func (c* serviceDiscoveryClient) FindService(serviceName string) (
func (c* serviceDiscoveryClient) FindService(serviceName string) (
funcing, error){
//定義代理連接埠與服務名稱
const serviceName string = "my-service"
type Proxy interface {
Start() error
}
func NewProxy(serviceDiscoveryClient ServiceDiscoveryClient) Proxy {
}
type proxy struct {
##}}
func (p* proxy) Start() error {
//開始監聽埠並進行請求攔截
func (p* proxy) Stop() error {
//停止監聽埠
以上是聊聊如何使用Golang實作Sidecar服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!