1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        springcloud gateway概念精講

        共 11964字,需瀏覽 24分鐘

         ·

        2021-05-25 21:08

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

        一、定義

        外部請(qǐng)求通過gateWay轉(zhuǎn)發(fā)到后端微服務(wù),網(wǎng)關(guān)一般提供如下功能

        1. 統(tǒng)一接入,路由轉(zhuǎn)發(fā)

        2. 安全審查,校驗(yàn)鑒權(quán)

        3. 熔斷降級(jí),數(shù)據(jù)緩存

        4. 統(tǒng)一日志,全局監(jiān)控

        總的來說,gateway提供了一個(gè)入口來管控所有的微服務(wù),基于這個(gè)特點(diǎn)可以靈活使用。

        網(wǎng)關(guān)解決方案對(duì)比

        nginx+lua 高性能反向代理服務(wù)器,一般作為負(fù)載均衡入口

        Zuul是第一代網(wǎng)關(guān),spring

        cloud是第二代網(wǎng)關(guān),基于Netty\Reactor\WebFLux構(gòu)建

        • 性能強(qiáng)勁,zuul1.6倍

        • 功能強(qiáng)大,內(nèi)置轉(zhuǎn)發(fā),監(jiān)控,限流等功能

        缺點(diǎn)

        • 不能再servlet容器下功能,不能使用war包

        基礎(chǔ)說明

        1. spring cloud gateway基于springBoot2.x系列,webflux,reactor等技術(shù),傳統(tǒng)的同步庫都是不能使用的

        2. gateway底層依賴netty,不接受servlet容器或者war包

        二、核心術(shù)語

        Route路由

        基礎(chǔ)的轉(zhuǎn)發(fā)規(guī)則,包含下面幾部分,當(dāng)predicate滿足時(shí)則代表匹配

        • id

        • 目標(biāo)url

        • predicate集合:滿足條件才轉(zhuǎn)發(fā)

        • filter集合:滿足條件則過濾(改變請(qǐng)求)

        Predicate謂詞、斷言

        java.util.funcation.Predicate實(shí)現(xiàn)路由匹配條件,通過ServletWebExchange(封裝了HTTP請(qǐng)求和相應(yīng))作為入?yún)?,來?duì)request的各種屬性(參考predicate的各種規(guī)則)做匹配。

        Filter過濾器

        修改請(qǐng)求及響應(yīng)

        gateway已經(jīng)為了我們準(zhǔn)備了各種過濾器工廠,我們也可以通過自定義過濾器

        三、簡單原理

        1. client發(fā)送請(qǐng)求給gateway,handlermapping判斷請(qǐng)求路徑是否匹配路由配置

        2. 如果匹配成功web handler會(huì)讀取路由配置過濾器,把請(qǐng)求交給過濾器處理

        3. 過濾器如圖是鏈?zhǔn)浇Y(jié)構(gòu),分為pre和post處理

        四、概念講解

        Route Predcate Factories

        符合Predicate的條件,就使用該路由的配置,否則就不管。

        https://www.imooc.com/article/290804

        配置形式

        模糊匹配和精確匹配

        路由到指定URL

        spring:
          cloud:
            gateway:
              routes:
              - id: {唯一標(biāo)識(shí)}
                uri: http://www.itmuch.com

        表示訪問 GATEWAY_URL/** 會(huì)轉(zhuǎn)發(fā)到 http://www.itmuch.com/**
        需要和predicate配合使用,滿足條件則轉(zhuǎn)發(fā)

        spring:
          cloud:
            gateway:
              routes:
              - id: {唯一標(biāo)識(shí)}
                uri: http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/

        表示訪問 GATEWAY_URL/spring-cloud/spring-cloud-stream-pan-ta/ 會(huì)轉(zhuǎn)發(fā)到 http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/

        路由轉(zhuǎn)發(fā)到微服務(wù)

        路由到服務(wù)發(fā)現(xiàn)組件上的微服務(wù)

         routes:
                - id: user_route
                  uri: lb://user-center
                  predicates:
                    - Path=/users/**

        瀏覽器訪問 網(wǎng)關(guān)url時(shí),http://localhost:8040/users/1會(huì)自動(dòng)轉(zhuǎn)發(fā)到user-center服務(wù)的接口,等同于訪問http://localhost:9099/users/1

        自定義predicate工廠

        xxxxRoutePredicateFactory必須以這種形式結(jié)尾

              routes:
                - id: after_route
                  uri: lb://user-center
                  predicates:
                    # 當(dāng)且僅當(dāng)請(qǐng)求時(shí)的時(shí)間After配置的時(shí)間時(shí),才會(huì)轉(zhuǎn)發(fā)到用戶微服務(wù)
                    # 目前配置不會(huì)進(jìn)該路由配置,所以返回404
                    # 將時(shí)間改成 < now的時(shí)間,則訪問localhost:8040/** -> user-center/**
                    # eg. 訪問http://localhost:8040/users/1 -> user-center/users/1
                    - After=2010-01-20T17:42:47.789-07:00[America/Denver]
                    - TimeBetween=00:00:00,12:44:13

        @Data
        public class TimeBetweenBean {
            private String  start;
            private String end;
        }



        @Component
        public class TimeBetweenRoutePredicateFactory
                extends AbstractRoutePredicateFactory <TimeBetweenBean>{

            public TimeBetweenRoutePredicateFactory() {
                super(TimeBetweenBean.class);
            }

            /**
             * 謂詞工廠的核心方法,控制路由的判斷人條件
             * @param config
             * @return
             */
            @Override
            public Predicate<ServerWebExchange> apply(TimeBetweenBean config) {

                String start = config.getStart();
                String end = config.getEnd();
                return  serverWebExchange ->{
                    LocalTime now = LocalTime.now();
                    System.out.println(now.isAfter(LocalTime.parse(start)));
                    return now.isAfter(LocalTime.parse(start)) && now.isBefore(LocalTime.parse(end));
                };
            }

            /**
             * 控制配置類和配置文件映射關(guān)系,和配置文件順序一致
             * @return
             */
            @Override
            public List<String> shortcutFieldOrder() {

                return Arrays.asList("start","end");
            }
        }


        動(dòng)態(tài)路由-服務(wù)名稱轉(zhuǎn)發(fā)
        面向服務(wù)的路由,支持整合EUREKA或者NACOS注冊(cè)中心,根據(jù)serviceId自動(dòng)從注冊(cè)中心獲取服務(wù)地址并轉(zhuǎn)發(fā)請(qǐng)求。不需要給每個(gè)微服務(wù)都配置路由規(guī)則

              discovery:
                locator:
                  enabled: true # 開啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由

        例子:
        http://localhost:8001/payment/get/1?uname=123
        http://localhost:9527/cloud-payment-service/payment/get/1?uname=123

        五、Filter

        生命周期

        • Pre:轉(zhuǎn)發(fā)請(qǐng)求之前

        • post:轉(zhuǎn)發(fā)請(qǐng)求之后

        gateway自帶過濾器講解

        1. RewritePath 請(qǐng)求地址重定向

        按照正則匹配上的路徑重寫為逗號(hào)后面的地址

        pring:
          cloud:
            gateway:
              routes:
              - id: rewritepath_route
                uri: https://example.org
                predicates:
                - Path=/red/**
                filters:
                - RewritePath=/red/?(?<segment>.*), /$\{segment}

        注:效果是去掉/red

        2. PrefixPath 添加前綴

        給請(qǐng)求路徑添加前綴

        spring:
          cloud:
            gateway:
              routes:
              - id: prefixpath_route
                uri: https://example.org
                filters:
                - PrefixPath=/mypath

        3. StripPrefix 刪除前綴

        刪除請(qǐng)求的指定個(gè)數(shù)前綴后添加到服務(wù)末尾

        spring:
          cloud:
            gateway:
              routes:
              - id: nameRoot
                uri: https://nameservice
                predicates:
                - Path=/name/**
                filters:
                - StripPrefix=2

        例如:請(qǐng)求路徑/name/blue/red,實(shí)際效果 nameservice/red

        全局過濾器GlobalFilter

        無需配置文件作用在所有的路由,最終通過gatewayfilterAdapter包裝為過濾器

        自定義過濾器工廠

        • 繼承AbstractGateWayFilterFactory

        • 繼承AbstractNameValueGatewayFilterFactory
          第一種方式的簡化方式

        自定義網(wǎng)關(guān)過濾器

        @Component
        @Slf4j
        public class MyLogGateWayFilter implements GlobalFilter, Ordered {


            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
               log.info("**** com int mylogglbalfiltert{}",new Date());
                String uname = exchange.getRequest().getQueryParams().getFirst("uname");
                if(uname==null){
                    log.info("非法用戶");
                    exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); //返回狀態(tài)碼
                    return exchange.getResponse().setComplete();
                }
                return chain.filter(exchange);
            }

            @Override
            public int getOrder() {
                return 0;
            }
        }


        注冊(cè)過濾器

        @Configuration
        public class GateWayConfig {

            @Bean
            public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){

                RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
                routes.route("path_route_kouryoushine",
                        r->r.path("guonei").
                                uri("http://news.baidu.com/guonei")).build();

                return routes.build() ;
            }

        }

        全局過濾器

        無需注冊(cè)操作,默認(rèn)直接生效

        核心API

        • exchange.getRequest().mutate().xxx 修改request

        • exchange.mutate.xxx 修改exchange

        • chain.filter(exchange) 傳遞給下一個(gè)過濾器

        • exchange.getResponse() 獲取響應(yīng)

        配置文件

            filters:
                    - AddRequestHeader=X-Request-Foo,Bar
                    - PreLog=a,b

        @Slf4j
        @Component
        public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
            @Override
            public GatewayFilter apply(NameValueConfig config) {
                log.info("請(qǐng)求建立了{(lán)}{}",config.getName(),config.getValue());
                return (exchagne,chain)->{
                    log.info("請(qǐng)求建立了{(lán)}{}",config.getName(),config.getValue());
                    ServerHttpRequest request = exchagne.getRequest()
                            .mutate()
                            .build();
                    ServerWebExchange exchange = exchagne.mutate()
                            .request(request)
                            .build();
                    return chain.filter(exchange);
                };
            }
        }

        全局過濾器

        order越小有效執(zhí)行
        局部過濾器按照配置順序執(zhí)行
        如果想自行控制order,返回OrderedGateFilter

        全局監(jiān)控

        查看全局過濾器
        http://localhost:8040/actuator/gateway/globalfilters

        • routes展示路由列表

        其他監(jiān)控包括動(dòng)態(tài)增加路由都可以百度



        版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

        本文鏈接:

        https://blog.csdn.net/kouryoushine/article/details/117048823







        瀏覽 53
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产麻豆精品成人免费视频 | 最好看的MV中文字幕国语电影 | 亚洲AV无码成人WWW | 日日骚网址 | 黑人大屌操逼 | 亚洲国产97在线精品一区 | 欧美操逼网| 成人性生交大片免费卡看 | 伊人五月天网 | 乱色综合|