ホームページ >Java >&#&チュートリアル >Spring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード)
この記事の内容は、Spring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード) に関するものです。必要な方は参考にしていただければ幸いです。 。
この記事では、互いに別々にデプロイされたフロントエンド アプリケーションとバックエンド REST API サービスの間で通信する方法について説明します。その目的は、ブラウザーのクロスドメイン リソース アクセスと同一オリジン ポリシーの制限を解決し、同じサーバーにない場合でもページ UI がバックグラウンド API を呼び出せるようにすることです。
ここでは、UI アプリケーションと単純な REST API という 2 つの別個のアプリケーションを作成しました。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 で実行されています。
まず、Spring Cloud 経由で zuul サポートの依存関係を UI アプリケーションの pom に追加する必要があります。これを 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 は機能せず、プロキシなしでは機能しないことに注意してください。ただし、プロキシを通じて、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('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. 結論 この投稿では、Zuul を使用して UI アプリケーションから REST API にリクエストをルーティングすることに焦点を当てました。 CORS と同一生成元ポリシーを解決し、転送中の HTTP リクエストのカスタマイズと拡張にも成功しました。 関連する推奨事項:
Spring Cloud Feign は HTTP を使用してリモート サービスをリクエストします
spring-cloud-sleuth+zipkin 追跡サービスの実装 (2)
以上がSpring Cloud Netflix Zuul プロキシ ゲートウェイを使用してバックエンド REST サービスにアクセスする実装 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。