在服務提供者的 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...