Tavaszi REST egy Zuul proxyval

1. Áttekintés

Ebben a cikkben a kommunikáció a front-end alkalmazás és a külön telepített REST API között.

A cél az, hogy megkerülje a CORS-t és a böngésző azonos származási házirend-korlátozását, és lehetővé tegye az UI számára az API hívását, annak ellenére, hogy nem azonos eredetűek.

Alapvetően két külön alkalmazást fogunk létrehozni - egy felhasználói felületet és egy egyszerű REST API-t, és használni fogjuk a Zuul proxy az UI alkalmazásban a REST API-hoz történő hívások proxy-jához.

A Zuul egy JVM alapú útválasztó és szerveroldali terheléselosztó a Netflix részéről. A Spring Cloud pedig szépen integrálódik egy beágyazott Zuul-proxyval - amit itt fogunk használni.

2. Maven konfiguráció

Először hozzá kell adnunk egy függőséget a Spring Cloud zuul támogatásához felhasználói felületünkön pom.xml:

 org.springframework.cloud spring-cloud-starter-netflix-zuul 2.2.0. KÖZLEMÉNY 

A legújabb verzió itt található.

3. Zuul Tulajdonságok

Következő - be kell állítanunk a Zuul-t, és mivel a Spring Boot-ot használjuk, ezt a alkalmazás.yml:

zuul: útvonalak: foos: path: / foos / ** url: // localhost: 8081 / spring-zuul-foos-resource / foos

Vegye figyelembe, hogy:

  • Közvetlenül az erőforrás-kiszolgálónkon vagyunk Foos.
  • A felhasználói felület minden olyan kérése, amely „/ foos /”Lesz irányítva a mi Foos Erőforrás-kiszolgáló itt: // loclahost: 8081 / spring-zuul-foos-resource / foos /

4. Az API

Az API alkalmazásunk egy egyszerű Spring Boot alkalmazás.

Ebben a cikkben megvizsgáljuk az futó kiszolgálón telepített API-t a 8081-es porton.

Először határozzuk meg az alap DTO-t az erőforráshoz, amelyet használni fogunk:

nyilvános osztály Foo {private long id; privát karakterlánc neve; // szabványos mérőeszközök és beállítók}

És egy egyszerű vezérlő:

@RestController public class FooController {@GetMapping ("/ foos / {id}") public Foo findById (@PathVariable long id, HttpServletRequest req, HttpServletResponse res) {return new Foo (Long.parseLong (randomNumeric (2)), 4)); }}

5. Az UI alkalmazás

UI alkalmazásunk szintén egy egyszerű Spring Boot alkalmazás.

Ebben a cikkben megvizsgáljuk az futó kiszolgálón telepített API-t a 8080-as porton.

Kezdjük a fővel index.html - egy kis AngularJS használatával:

     var app = szögletes.modul ('myApp', ["ngResource"]); app.controller ('mainCtrl', function ($ hatókör, $ erőforrás, $ http) {$ hatókör.foo = {id: 0, név: "minta foo"}; : fooId ", {fooId: '@ id'}); $ scope.getFoo = function () {$ scope.foo = $ scope.foos.get ({fooId: $ scope.foo.id});}}) ; {{foo.id}} {{foo.name}} Új Foo 

A legfontosabb szempont itt az, hogyan érjük el az API-t relatív URL-ek használatával!

Ne feledje, hogy az API-alkalmazás nem ugyanazon a kiszolgálón van telepítve, mint a felhasználói felület, ezért a relatív URL-eknek nem kellene működniük, és nem fog működni proxy nélkül.

A proxyval azonban hozzáférünk a Foo erőforrásokat a Zuul proxyn keresztül, amely természetesen úgy van konfigurálva, hogy továbbítsa ezeket a kéréseket, bárhova is telepítse az API-t.

Végül pedig a valójában a Boot engedélyezett alkalmazás:

@EnableZuulProxy @SpringBootApplication nyilvános osztály Az UiApplication kiterjeszti a SpringBootServletInitializer {public static void main (String [] argumentum) {SpringApplication.run (UiApplication.class, args); }}

Az egyszerű Boot kommentár mellett vegye figyelembe, hogy a Zuul proxy esetében is használjuk az annotation engedélyezési stílusát, ami nagyon jó, tiszta és tömör.

6. Tesztelje az útválasztást

Most - teszteljük a felhasználói felületet - az alábbiak szerint:

@Test public void whenSendRequestToFooResource_thenOK () {Response response = RestAssured.get ("// localhost: 8080 / foos / 1"); assertEquals (200, response.getStatusCode ()); }

7. Egyéni Zuul szűrő

Több Zuul szűrő áll rendelkezésre, és létrehozhatunk saját egyedi szűrőt is:

@Component public class CustomZuulFilter kiterjeszti a ZuulFilter {@Orride public Object run () {RequestContext ctx = RequestContext.getCurrentContext (); ctx.addZuulRequestHeader ("Test", "TestSample"); return null; } @Orride public boolean shouldFilter () {true true; } // ...}

Ez az egyszerű szűrő csak hozzáad egy fejlécet,Teszt”A kérésnek - de természetesen olyan bonyolulttá válhatunk, amennyire csak szükségünk van, itt bővíthetjük kéréseinket.

8. Tesztelje az egyedi Zuul szűrőt

Végül teszteljük, győződjön meg arról, hogy az egyéni szűrőnk működik-e - először módosítjuk a szűrőnket FooController a Foos erőforrás-kiszolgálón:

@RestController public class FooController {@GetMapping ("/ foos / {id}") 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)); }}

Most - próbáljuk ki:

@Test public void whenSendRequest_thenHeaderAdded () {Response response = RestAssured.get ("// localhost: 8080 / foos / 1"); assertEquals (200, response.getStatusCode ()); assertEquals ("TestSample", response.getHeader ("Test")); }

9. Következtetés

Ebben az írásban arra összpontosítottunk, hogy a Zuul-t felhasználjuk egy felhasználói felületről érkező kérelmek REST API-ba történő továbbításához. Sikeresen dolgoztuk ki a CORS-t és az azonos eredetű házirendet, valamint sikerült testreszabnunk és kibővítenünk a HTTP-kérést az átutazás során.

A teljes végrehajtása ennek az oktatóanyagnak a GitHub projektjében található meg - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.