Proljetni ODMOR sa Zuul proxyjem

1. Pregled

U ovom ćemo članku istražiti komunikacija između prednje aplikacije i REST API-ja koji su raspoređeni odvojeno.

Cilj je zaobići CORS i ograničenja Preglednika istih pravila i omogućiti korisničkom sučelju da pozove API iako ne dijele isto podrijetlo.

U osnovi ćemo stvoriti dvije zasebne aplikacije - UI aplikaciju i jednostavni REST API, i koristit ćemo Zuulov proxy u UI aplikaciji za proxy pozive REST API-ju.

Zuul je usmjerivač i uravnoteživač opterećenja sa strane poslužitelja tvrtke Netflix. A Spring Cloud ima lijepu integraciju s ugrađenim Zuul proxyjem - što ćemo ovdje koristiti.

2. Konfiguracija Maven

Prvo, trebamo dodati ovisnost podršci zuul iz Spring Cloud-a u našu UI aplikaciju pom.xml:

 org.springframework.cloud proljeće-oblak-starter-netflix-zuul 2.2.0.OBLAŽENJE 

Najnoviju verziju možete pronaći ovdje.

3. Zuul svojstva

Dalje - trebamo konfigurirati Zuul, a budući da koristimo Spring Boot, to ćemo učiniti u primjena.iml:

zuul: rute: foos: staza: / foos / ** url: // localhost: 8081 / spring-zuul-foos-resource / foos

Imajte na umu da:

  • Proksiramo naš poslužitelj resursa Foos.
  • Svi zahtjevi iz korisničkog sučelja koji započinju s „/ foos /”Bit će preusmjeren na naš Foos Resursni poslužitelj na // loclahost: 8081 / spring-zuul-foos-resource / foos /

4. API

Naša API aplikacija jednostavna je aplikacija Spring Boot.

U ovom ćemo članku razmotriti API postavljen na poslužitelju koji radi na luci 8081.

Prvo definirajmo osnovni DTO za resurs koji ćemo koristiti:

javna klasa Foo {private long id; privatni naziv niza; // standardni geteri i postavljači}

I jednostavan kontroler:

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

5. UI aplikacija

Naša UI aplikacija također je jednostavna aplikacija Spring Boot.

U ovom ćemo članku razmotriti API postavljen na poslužitelju koji radi na luci 8080.

Krenimo s glavnim index.html - koristeći malo AngularJS:

     var app = angular.module ('myApp', ["ngResource"]); app.controller ('mainCtrl', funkcija ($ opseg, $ resurs, $ http) {$ scope.foo = {id: 0, name: "sample foo"}; $ scope.foos = $ resource ("/ foos / : fooId ", {fooId: '@ id'}); $ scope.getFoo = function () {$ scope.foo = $ scope.foos.get ({fooId: $ scope.foo.id});}}) ; {{foo.id}} {{foo.name}} Novi Foo 

Ovdje je najvažniji aspekt kako pristupamo API-ju koristeći relativne URL-ove!

Imajte na umu da API aplikacija nije postavljena na istom poslužitelju kao i UI aplikacija, tako da relativni URL-ovi ne bi trebali raditi, i neće raditi bez proxyja.

Međutim, s proxyjem pristupamo Foo resurse preko Zuul proxyja, koji je naravno konfiguriran za usmjeravanje tih zahtjeva tamo gdje je API zapravo raspoređen.

I na kraju, zapravo aplikacija s omogućenim pokretanjem:

@EnableZuulProxy @SpringBootApplication javna klasa UiApplication proširuje SpringBootServletInitializer {javna statička void glavna (String [] args) {SpringApplication.run (UiApplication.class, args); }}

Osim jednostavne napomene Boot, primijetite da koristimo i napomenu u stilu enable za Zuul proxy, koja je prilično cool, čista i sažeta.

6. Testirajte usmjeravanje

Sada - testirajmo našu UI aplikaciju - kako slijedi:

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

7. Prilagođeni Zuul filtar

Dostupno je više Zuul filtara, a možemo stvoriti i vlastiti prilagođeni:

@Component javna klasa CustomZuulFilter proširuje ZuulFilter {@Override public Object run () {RequestContext ctx = RequestContext.getCurrentContext (); ctx.addZuulRequestHeader ("Test", "TestSample"); return null; } @Override public boolean shouldFilter () {return true; } // ...}

Ovaj jednostavni filtar samo dodaje zaglavlje pod nazivom „Test”Na zahtjev - ali naravno, možemo postati toliko složeni koliko nam je potrebno da bismo ovdje proširili svoje zahtjeve.

8. Testirajte prilagođeni Zuul filtar

Na kraju, testirajmo da li naš prilagođeni filtar radi - prvo ćemo izmijeniti svoj FooController na Foosovom poslužitelju resursa:

@RestController javna klasa FooController {@GetMapping ("/ foos / {id}") javni Foo findById (@PathVariable long id, HttpServletRequest req, HttpServletResponse res) {if (req.getHeader ("Test {))! = Null .addHeader ("Test", req.getHeader ("Test")); } vrati novi Foo (Long.parseLong (randomNumeric (2)), randomAlphabetic (4)); }}

A sada - isprobajmo:

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

9. Zaključak

U ovom tekstu usredotočili smo se na korištenje Zuula za usmjeravanje zahtjeva iz UI aplikacije u REST API. Uspješno smo zaobišli CORS i politike istog podrijetla, a uspjeli smo prilagoditi i povećati HTTP zahtjev u prijevozu.

The puna provedba ovog vodiča možete pronaći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.