【springcloud】zuul的使用

創建zuul工程時選擇Cloud Routing-Zuul

在啓動類上添加@EnableZuulProxy註解

@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(ApiGatewayApplication.class, args);
	}
}

訪問其他應用的頁面

zuul服務的端口爲8020,使用localhost:8020/應用名稱/路徑,進行訪問

應用名稱爲其他應用註冊在eureka的名稱,路徑爲在該應用下的路徑

如,我order服務下的一個url地址爲http://localhost:8081/buyer/order/profiles,我通過zuul來訪問的話,使用http://localhost:8020/order/buyer/order/profiles來訪問

擴充或更改代理路由

使用zuul訪問時,默認是ip:port/applicationName/來方法,如果不想使用應用名稱,想自定義的話,可以在yml文件中進行配置

zuul:
  routes:
    order: /myOrder/**

配置之後,可以同時使用order和myOrder進行訪問

禁止通過路由訪問

如果應用的url不想通過路由訪問,可以在zuul服務的yml配置中進行如下設置

zuul:
  ignored-patterns:
    - /order/buyer/order/profiles

配置後該url無法訪問到,但是通過myOrder仍可以訪問

也可以通過使用通配符的方式

zuul:
  ignored-patterns:
    - /**/buyer/order/profiles

這樣,通過order和myOrder都將不能訪問。

cookie和敏感頭

在同一個系統中的服務之間共享標題是可行的,但是您可能不希望敏感標頭泄漏到外部服務器的下游。您可以在路由配置中指定被忽略頭文件列表。

zuul中默認是將"Cookie", "Set-Cookie", "Authorization"設置爲敏感頭,不對外部提供的,如果需要調整敏感頭,需要在yml文件中進行如下設置

zuul:
  routes:
    order:
      path: /morder/**
      serviceId: order
      sensitiveHeaders:

sensitiveHeaders後面沒有參數,即不設置敏感頭

下面進行測試

在order應用的controller中,添加一個設置cookie的方法

    @RequestMapping("cookie")
    public String cookie(HttpServletResponse Response) {
        Cookie c = new Cookie("name", "aaralyn");

        Response.addCookie(c);
        return "";
    }

先通過應用名稱order進行訪問:http://localhost:8020/order/buyer/order/cookie,來添加cookie,再訪問另一個url 來查看request中是否有cookie

從上圖的結果中可以看到,由於/order這個路徑的敏感頭中仍然包括cookie,所以response中沒有設置cookie,request中也查不到設置的cookie

下面使用將敏感頭置爲空的/morder來進行訪問

創建cookie:http://localhost:8020/morder/buyer/order/cookie

訪問其他url:http://localhost:8020/morder/buyer/order/profiles

自定義過濾器

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;

/**
 * @Auther: aaralyn
 * @Date: 2018/8/9 13:42
 * @Description:
 */
@Component
public class TokenFilter extends ZuulFilter {
    /**
     * 設置過濾器的類型
     *
     * @return
     */
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    /**
     * 設置過濾器的順序,數字越小越靠前
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return PRE_DECORATION_FILTER_ORDER - 1;
    }

    /**
     * 是否使用此過濾器
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 寫過濾器的邏輯
     * 模擬所有的url必須帶有token參數,如果沒有的話,不通過
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (StringUtils.isEmpty(token)) {
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
        }
        return null;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章