第06課 服務閘道器

2021-09-13 11:06:04 字數 2992 閱讀 2532

在服務提供者的 module 下建立 hellocontroller 類,新增內容如下:

@restcontroller

public class hellocontroller

}

然後分別啟動服務註冊中心和服務提供者,瀏覽器輸入:http://localhost:8762/index,即可看見如下畫面:

在實際的專案中,乙個專案可能會包含很多個服務,每個服務的埠和 ip 都可能不一樣。那麼,如果我們以這種形式提供介面給外部呼叫,代價是非常大的。從安全性上考慮,系統對外提供的介面應該進行合法性校驗,防止非法請求,如果按照這種形式,那每個服務都要寫一遍校驗規則,維護起來也很麻煩。

這個時候,我們需要統一的入口,介面位址全部由該入口進入,而服務只部署在區域網內供這個統一的入口呼叫,這個入口就是我們通常說的服務閘道器。

spring cloud 給我們提供了這樣乙個解決方案,那就是 zuul,它的作用就是進行路由**、異常處理和過濾攔截。下面,我將演示如果使用 zuul 建立乙個服務閘道器。

建立 gateway 工程

在父專案上右鍵 -> new -> module,建立乙個名為 gateway 的工程,在其 pom.xml 中,加入如下依賴:

我們可以看到,服務閘道器的配置多了幾項,具體含義如下。

我們修改服務提供者的 controller 如下:

由此可以得出,當乙個服務啟動多個埠時,zuul 服務閘道器會依次請求不同埠,以達到負載均衡的目的。

服務攔截

前面我們提到,服務閘道器還有個作用就是介面的安全性校驗,這個時候我們就需要通過 zuul 進行統一攔截,zuul 通過繼承過濾器 zuulfilter 進行處理,下面請看具體用法。

新建乙個類 apifilter 並繼承 zuulfilter:

@component

public class apifilter extends zuulfilter

@override

public int filterorder()

@override

public boolean shouldfilter()

@override

public object run()

}

其中:

下面,我們來做乙個簡單的安全驗證:

@override

public object run() catch (exception e){}

}return null;

}

錯誤攔截在乙個大型系統中,服務是部署在不同的伺服器下面的,我們難免會遇到某乙個服務掛掉或者請求不到的時候,如果不做任何處理,服務閘道器請求不到會丟擲500錯誤,對使用者是不友好的。

我們為了提供使用者的友好性,需要返回友好性提示,zuul 為我們提供了乙個名叫 zuulfallbackprovider 的介面,通過它我們就可以對這些請求不到的服務進行錯誤處理。

新建乙個類 apifallbackprovider 並且實現 zuulfallbackprovider 介面:

其中,getroute 方法返回要處理錯誤的服務名,fallbackresponse 方法返回錯誤的處理規則。

SpringCloud 服務閘道器

上篇部落格 springcloud eureka服務註冊和發現 中介紹了註冊中心eureka 服務提供者和服務消費者。這篇部落格我們將介紹服務閘道器。圖 1 未使用服務閘道器的做法 圖 2 服務閘道器的做法 服務閘道器,英文service gateway,他是微服務框架中唯一的入口。有些類似外觀模式...

SpringCloud 服務閘道器

上篇部落格 springcloud eureka服務註冊和發現 中介紹了註冊中心eureka 服務提供者和服務消費者。這篇部落格我們將介紹服務閘道器。圖 1 未使用服務閘道器的做法 圖 2 服務閘道器的做法 服務閘道器,英文service gateway,他是微服務框架中唯一的入口。有些類似外觀模式...

SpringCloud 服務閘道器

是程式或者系統之間的連線節點,扮演著程式或系統之間的門戶,允許它們之間通過通訊協議交換資訊,它們可能是同構和異構的異同。比如新增依賴 org.springframework.cloudgroupid spring cloud starter zuulartifactid dependency org...