クイックハンドスプリングWebFluxフレーム


はじめに
本文は主にSpringBootに基づいて、SpringFluxフレームを使って、WEBサイトを開発する方法を紹介します.
Spring 5.0は既存のSpring MVC Stockのほかに、新しいWEB開発技術スタック――Spring Flux Stockを導入して、異なるアプリケーションと開発チームのニーズを満たす.
開発者は彼らに最適なアプリケーションの実行時、プログラミングフレームとアーキテクチャを探しています.例えば、同期ブロッキングIOアーキテクチャに基づく技術スタックを採用するのに最適ないくつかの用例があり、他のいくつかの用例は、Reactive Streams応答式プログラミング原則に基づいて構築された非同期、非ブロッキングの技術スタックにより適合するかもしれない.
その後、SprigFluxに採用された応答式プログラミングの原則と代表がProjectReactorを実現するために、一連の文章の紹介を通じて、多くの読者にSprigFluxを徐々に使用していく過程で、応答式プログラミングの原理と実現を理解し、プロジェクトに対してSpringMVCを選択するべきか、それともSprigWebFluxを選択して自分の判断基準を形成することができるようにします.
文章シリーズ
  • ブロックされていないIOについて:「時間スライスの観点からIOモデルとブロックされていないモデルを理解する」
  • SprigFlux初心者入門について:「クイックハンドスプリングFuxフレーム」
  • なぜSpringがSprigFluxフレームを導入したのですか?まだ完成していません.
  • Spring FluxにおけるRequestとHandlerMappingとの関係の形成プロセスはまだ完成されていません.
  • Spring FluxでHandlerMappingを実行するプロセスはまだ完成していません.
  • Spring Fluxでは、HandlerResultをどのように処理しますか?まだ
  • が完成していません.
  • Spring FluxとWEBサーバのServlet 3.1+はまだ完成していません.
  • Spring FluxとWEBサーバのNettyはまだ
  • を完成していません.
    二、手っ取り早い
    1、作成項目
    開くhttp://start.spring.ioSpring WebFluxプロジェクトを初期化しましょう.左の列はProject Metadataです.あなたのグループ名を記入します.またArtfact名があります.そして右の列はDependenciesです.私たちは「reactive web」を入力して、得られたプルダウンの中から「Reacive Web」を選択して、下の「Selected Dependencies」に私たちが選んだ「Reactive Web」を表示します.「Generate Project」をクリックして、作成したSpring Boot項目をブラウザでダウンロードします.加圧後はお好きなIDE(EclipseやIntelliJ IDEAなど)を使います.
    2、Controllerを追加します.
    Spring MVCに詳しいなら、きっと@Controllerによく知らないと思います.慣れなくても大丈夫です.簡単に紹介します.Spring WebFluxは、関数的なものと、注釈に基づくものと、2つの特徴を持っています.関数式プログラミングはあまり上手ではありません.まず注釈に基づいて選択します.Spring MVCモデルに似ています.Spring WebFluxモデルも@Controller注釈を使っています.そして@RestController注釈も使います.
    IDEでプロジェクトを開けたら、クラスを追加します.SampleControllerは次のコードを追加します.
    @RestController
    @RequestMapping("/")
    public class SampleController {
    
        @GetMapping("/hello")
        public String hello(){
            return "hello";
        }
    }
    実行後、ブラウザでアクセス:http://localhost:8080/helloブラウザで「ハロー」と表示されます.
    どうですか?簡単ですか?
    3、WebFilterを一つ追加します.
    Filterを一つ追加してみてください.Spring WebFluxフレームワークで、Filterを増やすことはWebFilterインターフェースを実現することによって実現される.
    @Component
    public class FirstWebFilter implements WebFilter {
        @Override
        public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
            serverWebExchange.getAttributes().put("User", "jerry");
            return webFilterChain.filter(serverWebExchange);
        }
    }
    三、Spring BootがSpring WebFluxを起動する過程を深く理解してください.
    スピリットMVCのフレームワークに詳しい開発者にとって、素早い手は欲求を満たすことができません.その背後にある仕組みや原理などを知ってこそ、相手を知っているような感覚が得られます.次に、Spring BootがSpring WebFluxを起動する過程を少し検討します.Spring MVCフレームに慣れていない開発者もこの章の内容を読むことができます.Spring WebFluxフレームをよりよく使うことに役立つかもしれません.
    1、準備作業
    あなたはGから必要ですitubhttps://github.com/spring-projects/spring-frameworkSpring WebFluxのソースコードをダウンロードして、後続の分析を行います.
    2、@EnbaleWebFlux
    振り返ってみますhttp://start.spring.io作成項目には、DemoApple起動クラスのコメントに、@EnbaleWebFluxという注釈があります.Spring Bootはこの注釈でSpring WebFluxを起動します.
    @EnableWebFlux
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
    EnbleWebFluxの定義(Spring WebFluxのソースコードの中に見つけられます)を見てください.次のように、Delegating WebFluxConfigrationの種類が導入されていることに気づきました.秘密はDelegating WebFluxConfigration類に隠れているようです.
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @Documented
    @Import(DelegatingWebFluxConfiguration.class)
    public @interface EnableWebFlux {
    }
    Delegating WebFluxConfigrations.javaファイルを開いて(Spring WebFluxのソースコードの中に見つけられます)、そして、お父さんはWebFluxConfigrationSupport類です.まずこの父の種類を見てみましょう.
    @Configuration
    public class DelegatingWebFluxConfiguration extends WebFluxConfigurationSupport {
    ......
    }
    以下は親種類のWebFluxConfigrationSupportによるコードセグメントです.Spring Bean容器には、2つのBen:webHandlerとrequest MappingHandlerMappingが注入されていることに気づきました.
    「webHandler」というBeanのタイプはDispactch Handlerであり、その名の通り分配器であり、各処理ユニットに配信要求を行う.「request MappingHandlerMapping」というBeanのタイプはRequest MappingHandlerMappingで、その根本はHandlerMappingインターフェースを実現しています.HandlerMappingの役割は、要求をHandlerにマッピングすることであり、例えばある要求経路をあるControllerにマッピングすることである.
    Displatch HandlerとHandlerMappingについて、後の章は引き続き深く説明します.
    public class WebFluxConfigurationSupport implements ApplicationContextAware {
        @Bean
        public DispatcherHandler webHandler() {
            return new DispatcherHandler();
        }
        
        @Bean
        public RequestMappingHandlerMapping requestMappingHandlerMapping() {
            RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();
            mapping.setOrder(0);
            mapping.setContentTypeResolver(webFluxContentTypeResolver());
            mapping.setCorsConfigurations(getCorsConfigurations());
    
            PathMatchConfigurer configurer = getPathMatchConfigurer();
            Boolean useTrailingSlashMatch = configurer.isUseTrailingSlashMatch();
            if (useTrailingSlashMatch != null) {
                mapping.setUseTrailingSlashMatch(useTrailingSlashMatch);
            }
            Boolean useCaseSensitiveMatch = configurer.isUseCaseSensitiveMatch();
            if (useCaseSensitiveMatch != null) {
                mapping.setUseCaseSensitiveMatch(useCaseSensitiveMatch);
            }
            Map>> pathPrefixes = configurer.getPathPrefixes();
            if (pathPrefixes != null) {
                mapping.setPathPrefixes(pathPrefixes);
            }
    
            return mapping;
        }
    }
    2、Displatch Handler
    Displatch Handlerは自身をBeanとしてSpringのBean容器に登録し、WebFilter、WebException Handlerなどと共に処理チェーンを構成する.
    Displatch HandlerはSpring Configrationから必要なコンポーネントを探しています.主に以下の3つです.
    public class DispatcherHandler implements WebHandler, ApplicationContextAware {
        ...
        private List handlerMappings;
        private List handlerAdapters;
        private List resultHandlers;
        ...
    }
  • HandlerMapping
  • は、RequestをHandler
  • にマッピングする.
  • HandlerMappingのデフォルト実装は、Request MappingHandlerMappingであり、@Request Mappingによってマークされた方法である.RouterFuntionMappingは、関数的なエンドポイントのルートに使用されます.SimpleUrlhandlerMappingは、明示的に登録するためのURLモードと、WebHandler
  • との間に使用される.
  • HandlerAdaptor
  • は、Dispactch HandlerにRequestによってマッピングされたHandler
  • を呼び出すように助ける.
  • HandlerAdaptorの主な役割は、Dispactch Handlerを呼び出した具体的なHandlerの詳細から解放することである.
  • HandlerResult Handler
  • Handlerの結果を処理し、Resonse
  • を終了する.
  • 具体的なHandlerを呼び出し、その結果、HandlerResultに包装されました.HandlerResult HandlerはHandlerResultを処理します.例えば、ReponseBody Result Handlerが@ResponseBodyマークを処理する方法の戻り値
  • を担当しています.
    概略図は以下の通りです
    DispatcherHandler
      |
      |-->HandlerMapping
      |-->HandlerAdaptor
      |-->HandlerResultHandler
    Displatch Handlerの核心方法は:
    @Override
    public Mono handle(ServerWebExchange exchange) {
        if (this.handlerMappings == null) {
            return Mono.error(HANDLER_NOT_FOUND_EXCEPTION);
        }
        return Flux.fromIterable(this.handlerMappings)
                .concatMap(mapping -> mapping.getHandler(exchange))
                .next()
                .switchIfEmpty(Mono.error(HANDLER_NOT_FOUND_EXCEPTION))
                .flatMap(handler -> invokeHandler(exchange, handler))
                .flatMap(result -> handleResult(exchange, result));
    }
    この方法は、Displatch Handler処理要求のロードを示しています.
  • まずHandlerMappingを通じてRequestの専用Handlerを見つけました.具体的なコードセグメントは
  • です.
    concatMap(mapping -> mapping.getHandler(exchange))
  • もう一度HandlerAdaptorを通じてこの具体的なHandlerを実行します.具体的なコードセグメントは
  • です.
    flatMap(handler -> invokeHandler(exchange, handler))
  • 最後にHandlerResult Handlerによって処理された結果、具体的なコードセグメントは
  • である.
    flatMap(result -> handleResult(exchange, result))
    疑問があるかもしれませんが、この方法の中でリクストはどこにありますか?「ServerWebExchange exchange」に隠れています.ServerWebExchangeについては他の文章をさらに紹介します.ここでは詳しく説明しません.
    3、HandlerMapping
    Displatch Handlerのコースでは、Requestの処理の第一段階は、HandlerMappingを使用しています.一般的なHandlerMappingには、Request MappingHandlerMapping、Router Function Mapping、SimpleUlthandlerMappingの3種類があります.
    Request MappingHandlerMappingはデフォルトですが、DisplatHandlerの中にBeanという名前のリリースがありますか?これはマッピングRequestとannotationn based Handlerとの関係を担っています.
    私たちは@Controller、@Request Mappingなどの注釈を使ってWEBプロジェクトを開発することに慣れていますので、Request MappingHandler Mappingにとても依存しています.私たちはこれからRequest MappingHandlerMappingについて話します.
    3-1、Request MappingHandlerMappingのクラス
    1階:Abstract HandlerMapping implemens HandlerMapping、Ordered、BenNameAware
      ^
      |
    2階:Abstract Handler MethMapping implements InitiazingBen
      ^
      |
    3層:Request MappingInfoHandlerMapping
      ^
      |
    4階:Request MappingHandlerMapping implements EmbededValueResoliverAware
    3-2、スキャンはハンドルが使えます.
    第2層はInitializingBeanインターフェースを実現しており、このインターフェースのクラスはBenFactoryにそのすべての属性を設定してから呼び出す機会があることに注目している.
    void afterPropertiesSet()
    方法はそれを知らせます.2階のこの方法の実現を見てみましょう.
    @Override
    public void afterPropertiesSet() {
    
        initHandlerMethods();
        
        // Total includes detected mappings + explicit registrations via registerMapping..
        ...
    }
    紙面の原因,ここでは詳しく方法の中で呼び出されたものを追究しない.
    initHandlerMethods();
    の詳細は、実際には、この中はすべての@Controllerの注釈の種類の中の@Request Mappingとその変体をスキャンして修飾した方法で、つまり最終的にRequestのHandlerを処理して、キャッシュして、後でさらに実行します.
    3-3、Displatch Handlerとの連携
    Displatch HandlerはMappingHandlerを呼びます.
    Mono getHandler(ServerWebExchange exchange)
    方法は、この要求を処理する具体的なHandlerを選択します.
    四、まとめ
    Spring WebFluxモデルの使用は非常に簡単で、特にSpring MVCモデルに詳しい開発者にとって、シームレスな切り替えができます.Spring Bootフレームを使って開発する場合、@Controller、@Request Mappingなどの注釈を使って、Requestを処理するHandlerが特に便利です.
    原文:http://www.yesdata.net/2018/1...