springCloud zuul網關(五)

zuul 是什麼?
     做爲微服務的網關,管理全部微服務的路由,用戶只訪問zuul,再經過zuul 分發路由調用不一樣的微服務接口。
爲何用好處什麼?
     監控請求,請求的鑑權,使用過濾器過濾大流量訪問保證服務可用,分發路由負載均衡等等
怎麼用?
     步驟一、POM文件增長依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--因爲zuul 也是微服務因此應該屬於euaeka的客戶端,因此須要引入這個-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
     步驟2:啓動類增長註解
/* * zuul 的第一個功能就是路由轉發功能,全部的請求訪問第一個訪問是經過zuul * */ @EnableZuulProxy //用這個會提供不少過濾器,@EnableZuulServer 會減小不少功能
@SpringCloudApplication public class GetWayApplication { public static void main(String[] args) { SpringApplication.run(GetWayApplication.class); } }
     步驟3:application.yml路由配置:
server: port: 10010 eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka registry-fetch-interval-seconds: 50 #客戶端拉取註冊中心的服務列表 spring: application: name: getway zuul: routes: USER-SERVICE: /user-service/** #haha: #path: /user/** # 第一步簡化:這裏是寫死的地址,因此應該經過Eureka 來獲取對應的服務器 因此應該配置serviceId #url: 127.0.0.1:8982 #serviceId: USER-SERVICE
#第二步簡化:因爲haha 這個名字隨便起 而重要的只有path 和serviceId 因此簡化配置 serviceId: path配置便可
#第三部簡化: zuul 其實默認配置了serviceId: path 這種配置因此你能夠什麼都不配置 但若是你想忽略一些微服務不暴露出來須要配值ignor-xxx請百度
Zuul做爲網關的其中一個重要功能,就是實現請求的鑑權。而這個動做咱們每每是經過Zuul提供的過濾器來實現的。
   過濾器生命週期:
正常流程:
     請求到達首先會通過pre類型過濾器,然後到達routing類型,進行路由,請求就到達真正的服務提供者,執行請求,返回結果後,會到達post過濾器。然後返回響應。
異常流程:
      整個過程當中,pre或者routing過濾器出現異常,都會直接進入error過濾器,再error處理完畢後,會將請求交給POST過濾器,最後返回給用戶。
     若是是error過濾器本身出現異常,最終也會進入POST過濾器,然後返回。    
     若是是POST過濾器出現異常,會跳轉到error過濾器,可是與pre和routing不一樣的時,請求不會再到達POST過濾器了。

場景很是多:spring

     請求鑑權:通常放在pre類型,若是發現沒有訪問權限,直接就攔截了
     異常處理:通常會在error類型和post類型過濾器中結合來處理。
     服務調用時長統計:pre和post結合使用。
 
實現:如下模擬用戶請求若是請求中不帶access-token參數則返回403沒權限
@Component public class LoginFiter extends ZuulFilter { /* - pre:請求在被路由以前執行 - routing:在路由請求時調用 - post:在routing和errror過濾器以後調用 - error:處理請求時發生錯誤調用 */ @Override public String filterType() { return FilterConstants.PRE_TYPE; } /*經過返回的int值來定義過濾器的執行順序,數字越小優先級越高。*/ @Override public int filterOrder() { return FilterConstants.PRE_DECORATION_FILTER_ORDER-1; } @Override //是否開啓此過濾器
    public boolean shouldFilter() { return true; } @Override //執行邏輯
    public Object run() throws ZuulException { //獲取request
        RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); //判斷是否帶有access-token 參數
        String token = request.getParameter("access-token"); if(StringUtils.isEmpty(token)){ //沒有就返回無權限403
             ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(HttpStatus.SC_FORBIDDEN); } //若是有就默認返回true 因爲默認就不須要處理了返回null便可
        return null; } }
https://files.cnblogs.com/files/lanSeGeDiao/springCloud-demo.zip 
以上是springCloud的DEMO例子 請自行復制路徑到瀏覽器
相關文章
相關標籤/搜索