瘋狂Spring Cloud連載(22)Web項目中使用Zuul

 本文節選自《瘋狂Spring Cloud微服務架構實戰》

京東購買地址:https://item.jd.com/12256011.html

噹噹網購買地址:http://product.dangdang.com/25201393.html

Spring Cloud教學視頻http://blog.csdn.net/boxiong86/article/details/78399104

Spring Cloud電子書http://blog.csdn.net/boxiong86/article/details/78488226

 

Web項目中使用Zuul

關於Zuul

SpringCloud集羣提供了多個組件,用於進行集羣內部的通信,例如服務管理組件Eureka,負載均衡組件Ribbon。如果集羣提供了API或者Web服務,需要與外部進行通信,比較好的方式是添加一個網關,將集羣的服務都隱藏到網關後面。這樣的做法,對於外部客戶端來說,無需關心集羣的內部結構,只需關心網關的位置等信息;對於SpringCloud集羣來說,不必過多的暴露服務,提升了集羣的安全性。

代理層作爲應用集羣的大門,在技術選取上尤爲重要,很多傳統的解決方案,在軟件上選擇了NginxApache服務器Netflix提供了自己的解決方案:ZuulZuulNetflix的一個子項目,SpringCloudZuul做進一步的實現與封裝,整合到spring-netflix項目中,爲微服務集羣提供過代理、過濾、路由等功能。

Web項目整合Zuul

新建一個名稱爲“first-routerMaven項目,項目使用的依賴如下:

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-zuul</artifactId>

        </dependency>

        <dependency>

            <groupId>org.apache.httpcomponents</groupId>

            <artifactId>httpclient</artifactId>

            <version>4.5.3</version>

        </dependency>

需要加入“spring-cloud-starter-zuul”的依賴,由於Zuul底層使用了HttpClient,因此要加入相應的依賴。爲了能讓Web項目開啓對Zuul的支持,在應用類中加入@EnableZuulProxy註解,請見代碼清單7-1

代碼清單7-1codes\07\02\first-router\src\main\java\org\crazyit\cloud\GatewayApplication.java

@EnableZuulProxy

@SpringBootApplication

public class GatewayApplication {

 

    public static void main(String[] args) {

        new SpringApplicationBuilder(GatewayApplication.class).properties(

                "server.port=8080").run(args);

    }

}

注意該項目的啓動端口爲8080。完成以上工作後,一個擁有Zuul功能的Web項目已經建立,接下來,將測試它的路由功能。

測試路由功能

前一小節已經建立了路由器項目,接下來建立源服務的項目,測試例子的結構請見圖7-1所示。


7-1測試例子結構圖

新建名稱爲“book-server”的Maven項目,該項目是一個最普通的Spring Boot項目,使用以下的依賴:

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

            <version>1.5.4.RELEASE</version>

        </dependency>

爲“book-server”添加一個“/hello”的服務項目的啓動類以及控制器,請見代碼清單7-2

代碼清單7-2codes\07\02\book-server\src\main\java\org\crazyit\cloud\BookApplication.java

@SpringBootApplication

@RestController

public class BookApplication {

 

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)   public String hello(@PathVariable String name) {

        return "hello " + name;

    }

 

    public static void main(String[] args) {

        new SpringApplicationBuilder(BookApplication.class).properties(

                "server.port=8090").run(args);

    }

}

爲了簡單起見,本例將啓動類與控制器寫到一起,注意“book-server”的端口爲8090。在控制器中,建立了一個“/hello/{name}”的服務,成功調用後,會返回相應的字符串。接下來,修改“first-router”項目的配置文件,讓其進行轉發工作

修改“first-router”項目的application.yml文件,加入以下內容:

zuul:

  routes:

    books:

      url: http://localhost:8090

加入以上配置後,發送給http://localhost:8080/books的所有請求,都會被轉發到8090端口,也就是訪問“first-router”項目,實際上最終會調用“book-server”的服務。啓動兩個應用,在瀏覽器中輸入以下地址:http://localhost:8080/books/hello/crazyit,可以看到瀏覽器輸出如下:

hello crazyit

根據輸出結果可知,發送的請求已經被轉發到“book-server”進行處理。

過濾器運行機制

前面例子的路由項目,我們使用了@EnableZuulProxy註解,開啓該註解後,Spring容器初始化時,會將Zuul配置初始化,其中包含一個Spring BootbeanServletRegistrationBean,該類主要用於註冊ServletZuul提供了一個ZuulServlet類,Servletservice方法中,執行各種Zuul過濾器(ZuulFilter)。圖7-2HTTP請求在ZuulServlet中的生命週期。


7-2 HTTP請求生命週期

ZuulServletservice方法接收到請求後,會執行“pre”階段的過濾器,再執行“routing”階段的過濾器,最後執行“post”階段的過濾器。其中“routing”的過濾器,會將請求轉發到源服務,源服務可以是第三方的Web服務,也可以是Spring Cloud的集羣服務。在執行prerouting階段的濾器時,如果出現異常,則會執行“error”過濾器。整個過程的HTTP請求、HTTP響應、狀態等數據,都會封裝到一個RequestContext對象中,這將在後面章節中講述。

大致瞭解了Zuul的運行機制後,下面將開始講解Spring Cloud中使用Zuul

 

 

 

 本文節選自《瘋狂Spring Cloud微服務架構實戰》

Spring Cloud教學視頻http://blog.csdn.net/boxiong86/article/details/78399104

Spring Cloud電子書http://blog.csdn.net/boxiong86/article/details/78488226

本書代碼共享地址:https://gitee.com/yangenxiong/SpringCloud

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