기술나눔

스프링클라우드게이트웨이

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

효과

  • 통합 관리, 간편한 모니터링
  • 보안, 전류 제한: 게이트웨이 계층에서 불법 정보 필터링
  • nginx 외부 게이트웨이, 게이트웨이 인트라넷
  • nginx는 Lua 또는 Kong으로 향상될 수 있습니다.

개념

  • 아이디: 아무 이름이나
  • uri: 프록시 서비스 주소입니다. id와 uri는 필수이고, 조건자와 필터는 선택사항입니다.
  • 조건자: 게이트웨이에 액세스하기 위한 URI를 일치시키는 데 사용할 수 있습니다. 일치하는 경우 현재 경로가 적용됩니다.
  • 필터: 최고의 유연성으로 프록시 전후에 논리를 추가하는 GatewayFilter 인스턴스

처리 흐름

  • 먼저 Handler Mapping은 URL을 처리한 후 이를 Web Handler에 전달하여 처리를 위한 필터의 전반부를 호출하고, 처리가 완료된 후 실제 프록시 서비스를 호출하여 로직을 실행합니다. 필터의 후반부 결과를 WebHandler에 반환한 다음 HandlerMapping에 반환하고 마지막으로 클라이언트에 반환합니다.

사용

gateway:
      discovery:
        locator:
          enabled: true # 启用自动根据服务ID生成路由
          lower-case-service-id: true # 设置路由的路径为小写的服务ID
  • 1
  • 2
  • 3
  • 4
  • 5

YML 구성

  • 목록의 요소에 여러 필드가 있는 경우 각 필드와 값을 각각 지정하려면 "-"와 콜론이 필요합니다. 필드가 하나만 있는 경우 쉼표를 사용하여 구분할 수 있습니다.
  • 객체 유형 구성, 각 필드는 "-" 및 콜론을 통해 구성 가능
  • 맵 유형: 키, 값을 콜론으로 구분
predicates:
  - Path=/sendOrder
  - Query=name,ma.
  - name: Query
    args:
      param: id
      regexp: d+
 #predicates是List, 它的元素是
 public class PredicateDefinition {

	@NotNull
	private String name;

	private Map<String, String> args = new LinkedHashMap<>();
  }
  等号分割转成对象的写法不是yml内置支持的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

술부

  • 조건자 구성은 목록이며, 그 요소는 특정 형식의 문자열 또는 개체일 수 있습니다. 문자열 작성 방법: 등호로 나누어 첫 번째 부분은 술어 이름, 두 번째 부분 args는 쉼표로 구분하여 해당 값을 Map 값에 저장하고 Map 키를 자동 생성합니다. 객체 작성 방법: PredicateDefinition
  • args 자체에 쉼표와 콜론이 있으면 문자열 형식을 사용할 수 없습니다.
  • ShortcutType 메소드는 ConfigClass에 대한 args 매개변수의 구문 분석 방법을 정의합니다. defaultFieldOrder는shortcutFieldPrefix 접두어를 제거하고 ConfigClass 필드 이름에 해당합니다. args 매개변수의 값은 ConfigClass: GATHER_LIST_TAIL_FLAG의 필드 값에 해당합니다. : 쉼표로 구분된 목록이지만 마지막 값은 Boolean 값이며 결국 2개의 키로 구성된 Map으로 변환됩니다. 첫 번째 키의 값은 Boolean 값 앞의 List이고 두 번째 키는 부울 값.
  • 게이트웨이에 액세스하기 위한 요청(예: URI, 쿼리 매개변수, 요청 헤더)을 일치시키는 데 사용됩니다. 일치하는 경우 현재 경로가 적용됩니다.
  • GatewayPredicate 구현에 따라 구현 클래스는 RoutePredicateFactory의 구현 클래스입니다. 구현 클래스 이름 지정 사양은 다음과 같습니다. 예를 들어 Path는 PathRoutePredicateFactory에 해당합니다.
  • 조건자 이름은 팩토리 구현 클래스의 클래스 이름 접두사에 해당하고 조건자 매개 변수 args는 팩토리 ConfigClass에 해당합니다.
  • 여러 술어는그리고관계
  • 조건자가 통과하지 못하면 게이트웨이는 404를 반환합니다.

  • 경로 일치, 개미 일치 지원, {}를 통해 uriVariables 추출

질문

  • 해당 http 요청 매개변수 이름이 있습니까? 값은 일반일 수 있습니다.
  • 이름은 고정되어 있습니다. 쿼리, args에는 쿼리 매개변수 이름과 값에 해당하는 param과 regexp라는 2개의 값이 있습니다.
  • 이름만 구성하면 요청 매개변수가 존재하는 한 전달된다는 의미입니다.

머리글

  • 헤더 경로 PredicateFactory
  • 요청 헤더의 이름과 값을 일치시킵니다. 실제 요청 헤더 값은 여러 개가 될 수 있습니다. 구성 값은 정규식을 지원합니다.

방법

  • HTTP 요청 방법과 일치하며 구성은 대문자여야 하며 쉼표로 구분되어야 합니다.

원격 주소

  • 요청과 일치하는 클라이언트 IP, 정확하게 말하면 마지막 네트워크 프록시의 IP는 쉼표로 구분되어 여러 개가 될 수 있습니다.

주인

  • Host 요청 헤더(포트 제외)의 호스트 부분 값과 일치합니다. 여러 개일 수 있고 쉼표로 구분되며 ant로 일치될 수 있습니다.
  • AntPathMatcher를 사용하여 일치시키고 경로 구분 기호는 "."입니다.

쿠키

  • 쿠키의 이름과 값을 일치시키십시오. 값은 정기적으로 일치될 수 있습니다.

무게

  • 서로 다른 경로의 로드 밸런싱에 사용됩니다. 동일한 그룹의 경로는 가중치에 따라 로드됩니다.
  • 그룹화 및 가중치라는 2개의 값을 쉼표로 구분하여 구성할 수 있습니다.
  • WeightCalculatorWebFilter: 시작되면 Weight 구성을 기반으로 2계층 Map이 생성됩니다. 첫 번째 계층은 그룹 이름이고, 두 번째 계층은 라우팅 ID입니다. 요청이 오면 0~1의 임의의 숫자가 생성됩니다. 각 그룹마다 라우팅 ID가 선택됩니다.
  • WeightRoutePredicateFactory: 조건자 필터링 시 그룹 및 경로 ID를 기준으로 필터링합니다.

필터

  • 구성 작성 방법은 문자열 작성 방법과 동일합니다. 등호로 분할합니다. 첫 번째 부분은 필터 팩토리 GatewayFilterFactory 클래스 이름의 접두어에 해당하고 두 번째 부분은 매개변수입니다.
  • 필터는 요청과 응답을 수정하는 데 사용됩니다.

요청 헤더 추가

  • 백엔드에서 얻을 수 있는 요청 헤더를 추가합니다.
  • 요청 헤더의 값은 uriVariables로부터의 동적 획득을 지원합니다.

스트립프리픽스

  • 정수값 n은 하나만 있습니다. 요청한 경로를 "/"로 나눈 후 접두사 n을 제거합니다.

제한

교차 도메인

spring.cloud.gateway.globalcors:
  cors-configurations:
    '[/**]': #跨域的uriPattern
      allowedHeaders: "*"
      allowedOrigins: "*"
      allowedMethods:
        - POST
        - OPTIONS
        - GET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 서버는 요청 헤더 Origin과 요청 URL의 스키마, 호스트, 포트가 동일한지 여부에 따라 크로스 도메인 요청인지 여부를 결정합니다. 한 가지 차이점만 있으면 크로스 도메인 요청입니다.
  • 교차 도메인 구성이 있어야 하며 요청된 uri는 교차 도메인 구성의 uriPattern과 일치해야 합니다. 게이트웨이는 교차 도메인인지 여부를 확인하고 교차 도메인 요청 헤더를 허용합니다. 교차 도메인 구성의 소스, 요청 방법 및 실제 요청 요청 헤더, 소스 및 요청 방법이 일치하는지 여부, 모두 일치하면 교차 도메인 액세스를 실행하고, 그렇지 않으면 403Forbiden을 반환합니다.
  • org.springframework.web.reactive.handler.추상핸들러맵핑#getHandler
  • org.springframework.web.cors.reactive.DefaultCorsProcessor#프로세스

자동으로 경로 생성

  • 서비스 검색을 통해 서비스 ID 획득을 지원하고, 서비스 ID를 기반으로 라우팅 구성을 자동으로 생성합니다.기본 라우팅 구성의 URI는 lb://serviceId이고 조건자는 /serviceId/**이며 필터는 serviceId를 제거하기 위한 Rewritepath입니다.

전역 필터

반응형 로드 밸런서 클라이언트 필터

  • lb 방식으로 라우팅 URI를 처리하려면 먼저 ServiceInstanceListSupplier를 통해 서비스 이름에 따라 서비스 인스턴스를 얻은 다음 ReactorLoadBalancer 인스턴스를 통해 로드 밸런싱을 수행합니다.

RouteToRequestUrl필터

  • 2가지 작업을 수행합니다. 1. 2계층 구성표를 지원하고 외부 구성표를 GATEWAY_SCHEME_PREFIX_ATTR에 저장한 다음 제거합니다. 2. 내부 구성, 호스트 및 포트를 사용하여 실제 요청된 URI를 대체하여 전달을 수행합니다.