文章目錄
簡介
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 Web
和Zuul
,如下:
將得到的壓縮包解壓後導入到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/