springCloud系列之(六) ---------- 網關zuul

構建最基本的網關

zuul的作用是:當啓動網關的時候,會將網關注冊到註冊中心,並且定時地從註冊中心獲取服務列表。當需要訪問的時候,是將服務名作爲一級路徑,然後之後纔是要訪問的API在該服務下的路徑。這時,zuul的工作是根據服務名獲得對應服務的地址,然後訪問對應的服務。

1、zuul網關的pom依賴

在構建zuul的時候所需要的最基本的pom依賴有:spring-cloud-starter-netflix-zuul、spring-cloud-starter-netflix-eureka-client,其中spring-cloud-starter-netflix-zuul依賴中包含了spring-boot-starter-web、spring-boot-starter-actuator、spring-cloud-starter-netflix-hystrix、spring-cloud-starter-netflix-ribbon、spring-cloud-starter-netflix-archaius這五個依賴,但是其中沒有註冊中心的依賴,所有需要導入eureka-client。

2、zuul網關的配置

在zuul網關的配置中需要的基本配置包括:服務的基本配置(appname、port)、註冊中心的配置、zuul的路由配置,這是最基本的配置,具體的配置如下:

spring.application.name=gateway

server.port=8888

eureka.instance.appname=gateway
eureka.instance.prefer-ip-address=true
eureka.instance.lease-renewal-interval-in-seconds=10

eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.region=sichuan
eureka.client.availability-zones.sichuan=chengdu
eureka.client.service-url.chengdu=http://192.168.1.194:58801/eureka

zuul.routes.payment.path=/payment/**
zuul.routes.payment.service-id=payment

3、服務引導類

在服務引導類上只需要添加兩個註釋:@SpringCloudApplication @EnableZuulProxy,其中@SpringCloudApplication的作用可以看註釋源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

可以發現,@SpringCloudApplication註釋實際上是包含類:@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBeaker這三個註釋。而@EnableZuulProxy這是開啓網關的註釋。

到這裏,其實最簡單的zuul網關就完成了,這個網關可以實現路由、負載均衡的功能。

zuul中的過濾器

通過以上內容,已經構建了一個簡單的zuul網關,但是,這個網關只有路由和負載均橫的功能,那麼的更過功能怎麼實現就需要使用到zuul提供的過濾器了。比如:訪問控制和權限校驗。

在zuul中添加過濾器只需要兩步,一:創建過濾器,二:將過濾器添加到zuul的filter chain中

1、創建過濾器

創建過濾器只需要繼承ZuulFilter類,如下:

public class AfterFilter extends ZuulFilter {

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

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

    @Override
    public Object run() { return null; }
}

然後重寫其中的幾個抽象方法就可以了,但是這裏需要注意一個問題,就是這幾個抽象方法的作用,這個後面說。

2、將過濾器添加到zuul的filter chain中

該步驟只需要在網關的啓動引導類中通過java的方式創建一個過濾器的bean就可以了,如下:

@SpringCloudApplication
@EnableZuulProxy
public class Application {

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

    @Bean
    public PreFilter preFilter()
    {
        return new PreFilter();
    }
}

到這裏就完成了將自定義的filter添加到zuul的filter chain中。但是filter中重寫的幾個方法的作用還不知道,下面就是這幾個方法的作用和具體實現的方法

3、自定義filter

自定義filter中會重寫zuulfilter中的幾個抽象方法,通過方法名大概可以知道這些方法的作用

filterType()

filterType()方法定義了該filter的類型,filter的類型分爲四種:pre、route、post、error,pre表示該filter是在請求被路由之前執行,route表死該filter是在執行路由的時候執行,post表示該filter是在路由的請求執行完成後返回到網關的時候執行,error表示該filter是在當post 之前的過程中拋異常的時候執行。

filterOrder()

filterOrder()方法定義了該filter的執行順序,但是這只是一個大概順序,它返回的是一個int數字,數字越小該filter就越先執行

shouldFilter()

shouldFilter()方法定義了該filter在什麼情況下執行,該方法中是一系列該filter執行的條件,當條件符合時就返回true,否則返回false

run()

run()方法是filter的核心,該方法中定義了filter的功能,就是filter要做的事情都在這個裏面。在filter中一般都是對請求和響應的處理,所以,一般在filter中首先要做的事情就是獲取到請求和響應,如下:

    @Override
    public Object run() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        HttpServletResponse response = currentContext.getResponse();
        return null;
    }

 

相關文檔:

springCloud zuul的作用:https://my.oschina.net/u/3768341/blog/1860214

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