1. 程式人生 > >SpringCloud學習 - 閘道器服務--ZUUL

SpringCloud學習 - 閘道器服務--ZUUL

zuul的主要作用是代理,路由、過濾(如許可權),對外提供統一訪問入口。

 

書籤:

1、小小例子

2、路由規則

3、小小過濾

  1. 小小例子

測試路由功能:新建一個專案:gateway-zuul

主要依賴:pom.xml

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

 

主啟動類加入註解:@EnableZuulProxy

package cn.ywj.gatewayzuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class GatewayZuulApplication {

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

 

application.yml 修改配置

#應用名
spring:
    application:
        name: gateway-zuul
# 埠號
server:
    port: 8803
# eureka配置
eureka:
    instance:
        hostname: localhost
    prefer-ip-address: true
    client:
        serviceUrl:
            defaultZone: http://eureka0:8080/eureka/,http://eureka1:8180/eureka/,http://eureka2:8280/eureka/


# 上面是普通的基本配置

zuul:
  routes:
    xxx-provider: # 指定一個路由,名字隨便寫,最好和服務名一樣
        path: /ep/** #當訪問/ep/** url時,就會請求到下面的serviceId對應的服務的請求中,如請求/ep/abc.do後會請求到eureka-provider的abc.do方法裡
        serviceId: eureka-provider # 配合上面的path跳轉使用

 

完畢。啟動訪問http://127.0.0.1:8803/ep/t 即可看到請求到結果。

 

  1. 路由規則
  1. 多個寫法,在配置檔案裡配置多個routes子節點即可

zuul:
  routes:


    xxx-provider:
        path: /ep/**
        serviceId: eureka-provider


    yyy-provider:
            path: /ep2/**
            serviceId: eureka-provider

 

  1. 忽略原服務名請求方式,之前可以通過http://127.0.0.1:8803/ep/t 訪問,也可以通過http://127.0.0.1:8803/eureka-provider/t 訪問,現在想禁止到通過服務名請求的方式,加上配置:ignored-services

zuul:
  routes:
    xxx-provider:
        path: /ep/**
        serviceId: eureka-provider

    yyy-provider:
            path: /ep2/**
            serviceId: eureka-provider

  ignored-services: eureka-provider #忽略服務名請求,多個就有逗號,隔開;如果想全部忽略,就用 * 符號

 

此時http://127.0.0.1:8803/ep/t可以訪問,而http://127.0.0.1:8803/eureka-provider/t 不再可以訪問

 

3、訪問加字首: prefix

zuul:
  routes:
    xxx-provider:
        path: /ep/**
        serviceId: eureka-provider

    yyy-provider:
            path: /ep2/**
            serviceId: eureka-provider
  

prefix: /ywj #訪問加字首,也就是最終訪問要在path前面加上 /ywj
  ignored-services: eureka-provider #忽略服務名請求,多個就有逗號,隔開;如果想全部忽略,就用 * 符號

此時訪問為:http://127.0.0.1:8803//ywj/ep/t

 

  1. 小小過濾

模擬過濾操作,也可以做相關許可權功能啦

建立一個類MyFilter繼承ZuulFilter

package cn.ywj.gatewayzuul;

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

import javax.servlet.http.HttpServletRequest;

/**
 * 參考:http://www.spring4all.com/article/303
 * 參考:https://www.cnblogs.com/qdhxhz/p/9601170.html
 */
@Component
public class MyFilter extends ZuulFilter {

    private static String FILTER_TYPE = "pre";

    @Override
    public String filterType() {
        return FILTER_TYPE;
    }

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

    @Override
    public boolean shouldFilter() {

        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String url = request.getRequestURI();
        // 這裡可以放開登入之類的請求,return false
        return true;
    }

    @Override
    public Object run() throws ZuulException {

        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();

        // 想怎麼搞都行
        String p = request.getParameter("p");
        if(!"ywj".equalsIgnoreCase(p)){

            // 許可權不對之類的就設定下面資訊就不會再訪問下去了

            // 過濾該請求,不對其進行路由
            requestContext.setSendZuulResponse(false);
            //返回錯誤程式碼
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            // 返回的描述資訊
            requestContext.setResponseBody("{\"result\":\"fk\"}");
        }
        // 一切沒問題,ok,放開訪問
        return null;
    }
}

 

Ok,完畢。

基佬網址:https://github.com/woshiyinweijian/SpringCloudTestV2