首頁  >  文章  >  Java  >  使用Spring Cloud Netflix Zuul代理網關存取後台REST服務的實作(程式碼)

使用Spring Cloud Netflix Zuul代理網關存取後台REST服務的實作(程式碼)

不言
不言原創
2018-09-11 14:12:252272瀏覽

這篇文章帶給大家的內容是關於使用Spring Cloud Netflix Zuul代理網關存取後台REST服務的實現(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1.概述

在本文中,我們將探討如何在互相單獨部署的前端應用程式和後端REST API服務之間進行通訊。目的是解決瀏覽器的跨網域資源存取和同源策略限制,讓頁面UI能夠呼叫後台的API,即使它們不在同一個伺服器中。

我們在這裡創建了兩個獨立的應用程式 - 一個UI應用程式和一個簡單的REST API,我們將在UI應用程式中使用Zuul代理程式來代理對REST API的呼叫。 Zuul是Netflix基於JVM的路由器和伺服器端負載平衡器。 Spring Cloud與嵌入式Zuul代理程式有很好的整合。

2.REST應用程式

我們的REST API應用程式是一個簡單的Spring Boot應用程式。在本文中將在連接埠8081上執行伺服器中部署的API 。

設定檔

server.contextPath=/spring-zuul-foos-resourceserver.port=80
81

讓我們先為我們將要使用的資源定義基本DTO:

public class Foo {
    private long id;    
    private String name;    
    // standard getters and setters
    }

定義一個簡單的控制器:

@Controllerpublic class FooController {

    @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")    
    @ResponseBody
    public Foo findById(
      @PathVariable long id, HttpServletRequest req, HttpServletResponse res) {        
      return new Foo(Long.parseLong(randomNumeric(2)), randomAlphabetic(4));
    }
}

3 . 前端應用程式

我們的UI應用程式也是一個簡單的Spring Boot應用程式。在本文中此應用運行在連接埠8080上。

首先,我們需要透過Spring Cloud向我們的UI應用程式的pom.xml添加對zuul支援的依賴:

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

接下來- 我們需要配置Zuul,因為我們正在使用Spring Boot,所以我們將在application.yml中執行此操作:

zuul:
  routes:
    foos:
      path: /foos/**
      url: http://localhost:8081/spring-zuul-foos-resource/foos

注意:

  • 我們代理我們的資源伺服器Foos。

  • 來自UI的所有以「 / foos / 」開頭的請求將被路由到我們的Foos資源伺服器,位址為:http:// loclahost:8081/spring-zuul- foos-resource / foos /

然後寫我們的主頁index.html — 這裡使用一些AngularJS:

<html>
<body ng-app="myApp" ng-controller="mainCtrl">
<script src="angular.min.js"></script>
<script src="angular-resource.min.js"></script>
<script>
var app = angular.module(&#39;myApp&#39;, ["ngResource"]);

app.controller(&#39;mainCtrl&#39;, function($scope,$resource,$http) {
    $scope.foo = {id:0 , name:"sample foo"};
    $scope.foos = $resource("/foos/:fooId",{fooId:&#39;@id&#39;});

    $scope.getFoo = function(){
        $scope.foo = $scope.foos.get({fooId:$scope.foo.id});
    }  
});</script><p>
    <h1>Foo Details</h1>
    <span>{{foo.id}}</span>
    <span>{{foo.name}}</span>
    <a href="#" ng-click="getFoo()">New Foo</a>
    </p>
    </body>
    </html>

這裡最重要的方面是我們如何使用相對URL訪問API !
請記住,API應用程式未部署在與UI應用程式相同的伺服器上,因此相對URL不起作用,並且在沒有代理程式的情況下不起作用。
但是,透過代理,我們透過Zuul代理存取Foo資源,Zuul代理配置為將這些請求路由到實際部署API的位置。

最後,啟用Boot的應用程式:

@EnableZuulProxy@SpringBootApplicationpublic class UiApplication extends SpringBootServletInitializer {

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

這裡使用@EnableZuulProxy註解來啟動Zuul代理,這非常乾淨和簡潔。

4.執行測試

分別啟動2個應用系統,在瀏覽器中輸入http://localhost:8080/index  
每點擊一次「New Foo」按鈕就訪問後台REST API一次。
使用Spring Cloud Netflix Zuul代理網關存取後台REST服務的實作(程式碼)

5.自訂Zuul過濾器

有多個Zuul過濾器可用,我們也可以創建自己的自訂過濾器:

@Componentpublic class CustomZuulFilter extends ZuulFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.addZuulRequestHeader("Test", "TestSample");        
        return null;
    }    @Override
    public boolean shouldFilter() {       
    return true;
    }    // ...}

這個簡單的過濾器只是在請求頭中添加了一個名為“ Test ” 的屬性- 當然,我們可以根據需要增加我們的請求。

6.測試自訂Zuul過濾器

最後,讓我們測試一下,確保我們的自訂過濾器正常運作- 首先我們將在Foos資源伺服器上修改我們的FooController:

@Controllerpublic class FooController {

    @GetMapping("/foos/{id}")    @ResponseBody
    public Foo findById(
      @PathVariable long id, HttpServletRequest req, HttpServletResponse res) {        
      if (req.getHeader("Test") != null) {
            res.addHeader("Test", req.getHeader("Test"));
        }        return new Foo(Long.parseLong(randomNumeric(2)), randomAlphabetic(4));
    }
}

現在- 讓我們測試一下:

@Testpublic void whenSendRequest_thenHeaderAdded() {    
Response response = RestAssured.get("http://localhost:8080/foos/1");

    assertEquals(200, response.getStatusCode());
    assertEquals("TestSample", response.getHeader("Test"));
}

7.結論

在這篇文章中,我們專注於使用Zuul將請求從UI應用程式路由到REST API。我們成功地解決了CORS和同源策略,我們也設法客製化和擴充了傳輸中的HTTP請求。

相關推薦:

spring cloud 之Feign 使用HTTP請求遠端服務

spring-cloud-sleuth zipkin追蹤服務實作(二)

以上是使用Spring Cloud Netflix Zuul代理網關存取後台REST服務的實作(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn