SpringCloud服務網關Zuul搭建

簡介

Zuul在SpringCloud微服務架構中扮演服務網關的角色,對外部應用訪問後端服務進行路由和過濾,服務網關(API網關)的作用的示意圖如下:
在這裏插入圖片描述
本文介紹搭建一個Zuul服務網關具體步驟。

Zuul服務搭建

我們一共需要創建兩個Spring應用,一個用於提供Zuul API網關服務,一個用來作爲後端服務真正處理API網關轉發過來的請求。

後端服務book搭建

創建一個web應用

利用Spring Initializr初始化我們的應用,在這裏book服務只要是一個普通的Web服務就可以了,所以添加一個Spring Web依賴即可:
在這裏插入圖片描述
將得到的壓縮包解壓後導入到idea中。

主程序

主程序可以參考:

package com.example.zuulbackendservicebook;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class ZuulBackendServiceBookApplication {

	@RequestMapping(value = "/available")
	public String available() {
		return "Spring in Action";
	}

	@RequestMapping(value = "/checked-out")
	public String checkedOut() {
		return "Spring Boot in Action";
	}

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

配置application.properties

spring.application.name=book
server.port=8090

完成以上配置以後就可以把該服務啓動起來了。

訪問book服務

打開瀏覽器,輸入地址http://localhost:8090/available,出現以下界面則表示服務運行成功:
在這裏插入圖片描述

Zuul服務搭建

創建應用

利用Spring Initializr初始化我們的應用,我們需要添加兩個依賴Spring WebZuul,如下:
在這裏插入圖片描述
將得到的壓縮包解壓後導入到idea中。

添加一個pre過濾器

Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命週期有4個,分別是“PRE”、“ROUTING”、“POST”、“ERROR”,整個生命週期可以用下圖來表示:
在這裏插入圖片描述
其中PRE過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。

以下實現一個pre過濾器:

package com.example.zuul.filters.pre;

import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.ZuulFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleFilter extends ZuulFilter {
    private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);


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

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

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

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));

        return null;
    }
}

Filter過濾器實現4個方法:

  • filterType():返回一個字符串表示該過濾器的類型
  • filterOrder():指定該過濾器相對於其它過濾器的執行順序
  • shouldFilter():包含判斷該過濾器是否應該執行的邏輯,在本例中直接返回true,表示該過濾器一定會執行
  • run(): 包含該過濾器的功能
    Zuul 過濾器把請求和狀態信息存儲在RequestContext中。

主程序

主程序參考以下代碼:

package com.example.zuul;

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

@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {

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

	@Bean
	public SimpleFilter simpleFilter() {
		return new SimpleFilter();
	}
}

配置application.properties

zuul.routes.books.url=http://localhost:8090
ribbon.eureka.enabled=false
server.port=8081
  • zuul.routes.books.url: zuul會將/books的請求代理到http://localhost:8090,即我們的後端服務
  • ribbon.eureka.enabled:Spring Netflix Zuul會使用Netflix的Ribbon來進行client-side的負載均衡,默認情況下,Ribbon會使用Netflix Eureka來進行服務註冊,在這個簡單的示例中,我們可以跳過服務註冊,把它設爲false。由於Ribbon不能使用Eureka來找到相應的服務,所以我們需要顯式指定book服務的url。

完成以上配置以後就可以把Zunl服務啓動起來了。

通過Zuul服務網關訪問book服務

打開瀏覽器,輸入地址http://localhost:8081/books/available:
在這裏插入圖片描述
從輸出可以看到,我們訪問的是Zuul服務網關,但結果卻是後端服務book的輸出,表明請求已經成功被轉發到後端服務中。

參考資料

https://spring.io/guides/gs/routing-and-filtering/

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