>  기사  >  Java  >  Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드)

Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드)

不言
不言원래의
2018-09-11 14:12:252273검색

이 기사의 내용은 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 애플리케이션입니다. 이 문서에서는 서버에 배포된 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));
    }
}

3. 프런트 엔드 애플리케이션

UI 애플리케이션도 간단한 Spring Boot 애플리케이션입니다. 이 문서에서는 애플리케이션이 포트 8080에서 실행되고 있습니다.

먼저 UI 애플리케이션의 pom에 Spring Cloud를 통한 zuul 지원에 대한 종속성을 추가해야 합니다. yml에서 수행하세요.

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

참고:

    리소스 서버 Foos를 프록시합니다.
  • UI에서 "/foos/"로 시작하는 모든 요청은 Foos 리소스 서버(http://loclahost:8081/spring-zuul-foos-resource/foos/
  • )로 라우팅됩니다. 메인 페이지 index.html — 여기서 AngularJS 사용:
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(&#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>

이는 @EnableZuulProxy 주석을 사용하여 매우 깔끔하고 간결한 Zuul 프록시를 시작합니다.

4. 테스트 실행

두 응용 프로그램 시스템을 각각 시작하고 브라우저에 http://localhost:8080/index를 입력합니다.

"New Foo" 버튼을 클릭할 때마다 백그라운드 REST API에 액세스합니다.



Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드) 5. 사용자 정의 Zuul 필터

사용 가능한 Zuul 필터가 여러 개 있으며, 자체 사용자 정의 필터를 만들 수도 있습니다.

@EnableZuulProxy@SpringBootApplicationpublic class UiApplication extends SpringBootServletInitializer {

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

이 간단한 필터는 요청의 속성에 "Test"라는 헤더를 추가합니다. - 물론, 필요에 따라 요청을 늘릴 수 있습니다.

6. 사용자 정의 Zuul 필터 테스트

마지막으로 테스트하여 사용자 정의 필터가 작동하는지 확인하겠습니다. 먼저 Foos 리소스 서버에서 FooController를 수정하겠습니다.

@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. 결론

이 게시물에서는 Zuul을 사용하여 UI 애플리케이션에서 REST API로 요청을 라우팅하는 데 중점을 두었습니다. 우리는 CORS 및 동일 출처 정책을 성공적으로 해결했으며 전송 중인 HTTP 요청을 사용자 정의하고 강화했습니다.

관련 권장사항:

spring cloud Feign은 HTTP를 사용하여 원격 서비스를 요청합니다.


spring-cloud-sleuth+zipkin 추적 서비스 구현(2)

위 내용은 Spring Cloud Netflix Zuul 프록시 게이트웨이를 사용하여 백엔드 REST 서비스에 액세스하는 구현(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.