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.