이 기사의 내용은 Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드)에 대한 내용입니다. 필요한 친구가 참고할 수 있기를 바랍니다. .
이 기사에서는 서로 별도로 배포되는 프런트엔드 애플리케이션과 백엔드 REST API 서비스 간의 통신 방법을 살펴보겠습니다. 목적은 브라우저의 도메인 간 리소스 액세스 및 동일 출처 정책 제한을 해결하여 페이지 UI가 동일한 서버에 있지 않더라도 백그라운드 API를 호출할 수 있도록 하는 것입니다.
여기서 UI 애플리케이션과 간단한 REST API라는 두 개의 별도 애플리케이션을 만들었습니다. UI 애플리케이션에서 Zuul 프록시를 사용하여 REST API에 대한 호출을 프록시할 것입니다. Zuul은 Netflix의 JVM 기반 라우터이자 서버측 로드 밸런서입니다. Spring Cloud는 내장된 Zuul 프록시와 훌륭하게 통합됩니다.
우리의 REST API 애플리케이션은 간단한 Spring Boot 애플리케이션입니다. 이 문서에서는 서버에 배포된 API가 포트 8081에서 실행됩니다.
구성 파일
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)); } }
UI 애플리케이션도 간단한 Spring Boot 애플리케이션입니다. 이 문서에서는 애플리케이션이 포트 8080에서 실행되고 있습니다.
먼저 UI 애플리케이션의 pom에 Spring Cloud를 통한 zuul 지원에 대한 종속성을 추가해야 합니다. yml에서 수행하세요.
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
참고:
zuul: routes: foos: path: /foos/** url: http://localhost:8081/spring-zuul-foos-resource/foos
여기서 가장 중요한 측면은 상대 URL을 사용하여 API에 액세스하는 방법입니다!
API 애플리케이션은 UI 애플리케이션과 동일한 서버에 배포되지 않으므로 상대 URL은 작동하지 않으며 프록시 없이는 작동하지 않습니다.그러나 프록시를 통해 우리는 이러한 요청을 API가 실제로 배포된 위치로 라우팅하도록 구성된 Zuul 프록시를 통해 Foo 리소스에 액세스합니다.
마지막으로 부팅 가능 애플리케이션:
<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('myApp', ["ngResource"]); app.controller('mainCtrl', function($scope,$resource,$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}); } });</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>
이는 @EnableZuulProxy 주석을 사용하여 매우 깔끔하고 간결한 Zuul 프록시를 시작합니다.
4. 테스트 실행
5. 사용자 정의 Zuul 필터
@EnableZuulProxy@SpringBootApplicationpublic class UiApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(UiApplication.class, args); } }
이 간단한 필터는 요청의 속성에 "Test"라는 헤더를 추가합니다. - 물론, 필요에 따라 요청을 늘릴 수 있습니다.
6. 사용자 정의 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; } // ...}
이제 테스트해 보겠습니다. 다음을 살펴보세요.
@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)); } }
7. 결론
관련 권장사항:
spring cloud Feign은 HTTP를 사용하여 원격 서비스를 요청합니다.spring-cloud-sleuth+zipkin 추적 서비스 구현(2)위 내용은 Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!