<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          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)控

          總的來(lái)說,gateway提供了一個(gè)入口來(lái)管控所有的微服務(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)的同步庫(kù)都是不能使用的

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

          二、核心術(shù)語(yǔ)

          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)?,?lái)對(duì)request的各種屬性(參考predicate的各種規(guī)則)做匹配。

          Filter過濾器

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

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

          三、簡(jiǎ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

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

          自定義過濾器工廠

          • 繼承AbstractGateWayFilterFactory

          • 繼承AbstractNameValueGatewayFilterFactory
            第一種方式的簡(jiǎn)化方式

          自定義網(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() ;
              }

          }

          全局過濾器

          無(wú)需注冊(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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文在线а√在线 | 怡红院院AV | 亚洲深喉口爆 | 青青艹av | 国产精品永久久久久久久久久 |