ホームページ >Java >&#&チュートリアル >Spring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード)

Spring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード)

不言
不言オリジナル
2018-09-11 14:12:252374ブラウズ

この記事の内容は、Spring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード) に関するものです。必要な方は参考にしていただければ幸いです。 。

1. 概要

この記事では、互いに別々にデプロイされたフロントエンド アプリケーションとバックエンド REST API サービスの間で通信する方法について説明します。その目的は、ブラウザーのクロスドメイン リソース アクセスと同一オリジン ポリシーの制限を解決し、同じサーバーにない場合でもページ UI がバックグラウンド API を呼び出せるようにすることです。

ここでは、UI アプリケーションと単純な REST API という 2 つの別個のアプリケーションを作成しました。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 で実行されています。

まず、Spring Cloud 経由で zuul サポートの依存関係を UI アプリケーションの pom に追加する必要があります。これを 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 は機能せず、プロキシなしでは機能しないことに注意してください。

ただし、プロキシを通じて、Zuul プロキシを介して Foo リソースにアクセスします。Zuul プロキシは、これらのリクエストを API が実際にデプロイされている場所にルーティングするように構成されています。

最後に、ブート対応アプリケーション:

<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. テストを実行します

2 つのアプリケーション システムをそれぞれ起動し、ブラウザに 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。