springcloud demo---zuul(api網關)


1.作用

請求路由。請求過濾。

通過使用Zuul來創建各種校驗過濾器,然后指定哪些規則的請求需要執行校驗邏輯,只有通過校驗的才會被路由到具體的微服務接口,不然就返回錯誤提示

2.zuul-client

  2.1 配置文件

server:
port: 8766 #端口號
spring:
application:
name: service-zuul #服務注冊中心測試名
zuul:
routes:
api-a:
path: /ribbon/**
serviceId: ribbon-provider #如果是/ribbon/**路徑下的請求,則跳轉到service-ribbon
api-b:
path: /feign/**
serviceId: feign-provider #如果是/feign/**路徑下的請求,則跳轉到service-feign
eureka:
client:
serviceUrl:
defaultZone: http://admin:123@localhost:8761/eureka/ #服務注冊中心

  2.2 依賴和注解

    依賴:spring-cloud-starter-netflix-zuul; spring-cloud-starter-netflix-eureka-client

    注解:在啟動類上增加注解:@EnableZuulProxy;@EnableEurekaClient

  2.3 通配符說明

    ?:匹配任意單個字符
    * :匹配任意數量的字符
    **:匹配任意數量的字符,並支持多級目錄

  2.4 過濾類

    在啟動類上增加過濾類:

@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}

    編寫過濾類:AccessFilter

public class AccessFilter extends ZuulFilter {

private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

@Override
public String filterType() {
return "pre";
}

@Override
public int filterOrder() {
return 0;
}

@Override
public boolean shouldFilter() {
return true;
}

@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
log.warn("accessToken is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("accessToken is empty");
} catch (Exception e) {
}
return null;
}
log.info("access is ok");
return null;
}
}

  2.5 過濾類說明

  • filterType: 過濾器的類型,它決定過濾器在請求的哪個生命周期中執行。這里定義為pre,代表會在請求被路由之前執行。
  • filterOrder: 過濾器的執行順序。當請求在一個階段中存在多個過濾器時,需要根據該方法返回的值來依次執行。
  • shouldFilter: 判斷該過濾器是否需要被執行。這里我們直接返回了true,因此該過濾器對所有請求都會生效。實際運用中我們可以利用該函數來指定過濾器的有效范圍。
  • run: 過濾器的具體邏輯。這里我們通過ctx.setSendZuulResponse(false)令zuul過濾該請求,不對其進行路由,然后通過ctx.setResponseStatusCode(401)設置了其返回的錯誤碼,當然也可以進 一步優化我們的返回,比如,通過ctx.setResponseBody(body)對返回的body內容進行編輯等。

  2.6 訪問地址

    訪問http://localhost:8766/ribbon/test?accessToken=ribbon,跳轉到ribbon服務的接口下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM