기술나눔

게이트웨이

2024-07-12

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

게이트웨이 핵심 개념

1. 노선
라우팅은 게이트웨이의 가장 기본적인 부분입니다. 라우팅 정보에는 ID, 대상 URI, 어설션 팩토리 집합, 필터 집합이 포함됩니다. 어설션이 true이면 요청된 URL이 구성된 경로와 일치합니다.
2. 술어
     Assert 기능을 사용하면개발자가 정의성냥HTTP 요청에서요청 헤더, 매개변수 등과 같은 모든 정보
3. 필터
필터는 게이트웨이 필터와 글로벌 필터로 구분됩니다. 필터는 요청과 응답을 처리할 수 있습니다.


게이트웨이빠른 시작

1. 종속성 소개
참고: spring-webmvc의 종속성과 충돌하므로 spring-webmvc를 제외해야 합니다.
2. yml 구성 파일 작성
server.port = 8088은 게이트웨이 액세스 포트
spring.application.name은 현재 게이트웨이 서비스의 서비스 이름
라우팅 규칙은 Gateway.routes 아래에 정의됩니다.
id는 이 라우팅 규칙의 이름입니다. Gateway.routes 아래에는 여러 라우팅 규칙이 있을 수 있습니다.
url: 현재 게이트웨이의 서비스에 접속하고, 어느 URL로 전달할 것인가?, 우선, 모든 요청을 게이트웨이로 전달할 수는 없습니다. 특정 조건이 충족되어야 합니다.
술어: 언제 요청이 현재 게이트웨이에 도달합니다.(그래서 이 요청은 현재 게이트웨이의 IP + 포트 번호를 전달해야 합니다. 정보 뒤에 슬래시 /가 표시되어 게이트웨이가 이 정보를 기본적으로 사용할 수 있도록 할 수 있습니다.이 정보는 술어에서 고려할 필요가 없습니다.), 포트 번호 뒤의 URL이 /order-serv/**로 시작하는 경우,그래서 위 url의 ip + port로 이동하시면 됩니다. . 슬래시 /모든 후속 경로는 제거되지 않습니다., 그러면 http://localhost:8020/order-serv/order/add 주소로 전달됩니다.
(order-serv는 주문 서비스가 /order/add로 시작하는 주소를 갖지 않도록 하고, 인벤토리 서비스도 /order/add로 시작하는 주소를 갖는 것을 방지하기 위한 서비스 이름이므로 게이트웨이로 전송된 요청에는 전달할 서비스의 이름이 포함됩니다.),하지만 주문 서비스에서 받은 요청에 /order-serv/가 없습니다., 전송된 요청만 http://localhost:8020/order/add이므로 수신할 수 있습니다. 게이트웨이가 첫 번째 레이어 경로를 제거하도록 허용, 필터를 통해 접두사 필터링
어설션이 만족되지 않으면 404 오류가 보고됩니다.


여기서는 구성에 전달된 URL 주소를 하드 코딩했습니다. 서버가 마이그레이션되면 IP 주소가 변경되거나 서버가 클러스터에 배포될 때 역방향 프록시 및 로드 밸런싱을 nginx를 통해 수행해야 하는데 이는 매우 번거로운 작업입니다. .

게이트웨이와 nacos를 통합하면 이러한 문제를 쉽게 해결할 수 있습니다.

나코스 통합

1. nacos 종속성을 계속 도입합니다.
2. yml 구성 파일 작성을 계속합니다.
(1) nacos를 통합하려면 현재 게이트웨이 서비스를 nacos에 등록하고 nacos 서비스 주소와 계정 비밀번호를 작성하십시오.
(2) 라우팅 규칙에서 전달할 서비스의 주소를 서비스 이름 "order-service"(url: order-service)로 변경하고, nacos에 포함된 리본의 로드 밸런싱 전략을 사용해야 하므로, 따라서 앞에 lb://를 추가하면 lb는 로드밸런싱 로드밸런싱을 의미합니다.
게이트웨이게이트웨이는 전체 "주문 서비스"를 주문 서비스 중 하나의 IP 주소로 대체합니다(게이트웨이는 정기적으로 nacos에 등록된 다양한 서비스의 IP 주소 목록을 가져오기 때문입니다).
이는 서버를 마이그레이션하거나 IP 주소가 변경되거나 서버가 클러스터에 배포될 때 역방향 프록시 및 로드 밸런싱을 위해 nginx를 사용해야 하는 문제를 해결합니다.
축약된 라우팅 규칙: 합의가 구성보다 큼
(1) nacos 서비스 자동 식별 기능을 활성화한 후에는 Assertion Rule을 작성할 필요가 없습니다.
(2) 게이트웨이로 전송된 요청이 nacos에 등록된 서비스 이름으로 시작되면 자동으로 해당 서비스의 서버로 전달되며 첫 번째 계층 경로는 자동으로 필터링됩니다. (단점: 라우팅 규칙이 유연하지 않음) 충분한)
이때, 게이트웨이 주소/마이크로서비스/인터페이스 형식으로 접속하시면 성공적인 응답을 받으실 수 있습니다.


어설션 팩토리

URL을 기반으로 어설션을 만드는 것은 게이트웨이에 내장된 어설션 팩토리입니다.



사용자 정의 라우팅 어설션 팩토리

여기서는 쿼리 요청 매개 변수를 기반으로 어설션 팩토리를 사용자 지정하고 소스 코드의 콘텐츠를 복사한 다음 필요에 따라 수정한다고 가정합니다.

사용자 정의 쿼리 요청 매개변수를 기반으로 하는 어설션 팩토리 AbstractRoutePredicateFactory 클래스를 상속하고 적용 메서드의 논리를 다시 작성해야 합니다. Apply 메소드에서는 exchange.getRequest()를 통해 ServerHttpRequest 객체를 얻어올 수 있으므로, 요청 파라미터, 요청 메소드, 요청 헤더 등의 정보를 얻을 수 있습니다.
1. 스프링 컴포넌트, 즉 빈이어야 합니다.
2. 클래스를 추가해야 합니다. RoutePredicateFactory 끝으로
3. 상속받아야 함 AbstractRoutePredicateFactory
4. 구성 파일에서 해당 어설션 정보를 받으려면 정적 내부 클래스를 선언하고 특성을 선언해야 합니다.
5. 결합이 필요함 단축키필드순서 묶다
6. 적용을 사용하여 참이 일치에 성공한 것인지, 거짓이 일치에 실패한 것인지 논리적으로 판단합니다.


필터(먼저 필터링한 다음 라우팅)

(1) 먼저 요청된 URL 주소를 필터를 통해 처리하거나 요청 헤더, 쿠키 등 일부 정보를 추가, 삭제, 수정합니다.

(2) 이후 nacos 서비스 목록을 통해 해당 서버로 라우팅합니다.

필터의 역할: 게이트웨이에 요청이 오면 비즈니스 로직으로 요청을 처리할 수 있습니다.

예를 들어:

(1) 필터를 앞쪽으로 통과시키세요.경로의 첫 번째 레이어 제거

(2) 게이트웨이로 들어오는 모든 요청에 ​​요청 헤더를 추가한 후, 그 안에 내용을 설정할 수 있습니다.

(3) 게이트웨이 등으로 들어오는 모든 요청에 ​​대해 쿠키를 설정할 수 있습니다.

모든 내장 필터에 대한 자세한 내용을 보려면 공식 웹사이트를 방문하세요.

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#게이트웨이필터-팩토리

다음은 몇 가지 코드 예입니다.

테스트 주소가 게이트웨이 게이트웨이로 전송됩니다.

Route를 통해 다음 @GetMapping 주소로 라우팅하고, 요청을 받고 응답하려면 다음 코드를 사용합니다.

예 1:

실시예 2
실시예 3
이전 URL 주소는 게이트웨이로 전송되어 필터링되고 /mall-order라는 접두사가 붙습니다. 이때, 서버가 응답을 받을 수 있으려면 전송되는 모든 요청에 ​​/mall-order가 전달되도록 설정해야 합니다.이러한 방식으로 서버는 게이트웨이가 라우팅하는 요청을 정상적으로 수신할 수 있습니다.
실시예 4
현재 게이트웨이로 전송된 요청은 Baidu 웹사이트로 라우팅됩니다.
302는 리디렉션 후의 응답 상태 코드입니다.


맞춤 필터



전역 필터

로컬 필터와 글로벌 필터의 차이점:
부분: 부분은 특정 경로에 대한 것이며 경로에서 구성해야 합니다.
글로벌: 모든 라우팅 요청에 대해 필요 없음구성 파일에 구성되어 있습니다. 일단 정의되면 사용됩니다.
내장된 전역 필터:
라우팅 주소에 lb가 포함되어 있으면 위의 첫 번째 전역 필터에 해당하는 로드 밸런싱 정책이 자동으로 적용됩니다.
이러한 글로벌 필터는 당사의 관리 없이 자동으로 판단되고 처리됩니다.


사용자 정의 전역 필터(핵심 사항)

모든 액세스 요청을 기록하고 로그 형식으로 저장할 수 있습니다. 사용자 정의 글로벌 필터를 사용할 수 있습니다.

또는 전역 필터를 사용자 정의하여 사용자 로그인 및 권한을 결정할 수 있습니다.

전역 필터를 사용자 정의하는 것은 매우 쉽습니다
1. 클래스를 정의하고 이를 springIOC 컨테이너에 맡겨 관리합니다. 즉, 스프링 주석을 추가합니다. @컴페넌트
2. GlobalFilter 인터페이스 상속, 내부에 필터 메소드를 다시 작성하려면 내부에 메소드 본문만 작성하면 됩니다.
3. 매개변수 교환~에 포함 이 게이트웨이를 입력하세요요청된 모든 정보, URL 주소, 헤더, 쿠키, 경로 매개변수 및 기타 정보를 가져온 다음 해당 작업을 수행합니다. 비즈니스 처리
4. return chain.filter(exchange) 요청을 해제하세요


요청 로깅

게이트웨이 마이크로서비스에서 여기에 이 ​​명령을 추가하여 로깅을 활성화하고 게이트웨이를 통과하는 모든 요청을 기록하지만 콘솔에만 출력됩니다.



게이트웨이 교차 도메인 구성

크로스 도메인: http 요청이 동일한 IP + 동일한 포트에 있지 않은 경우 이를 크로스 도메인이라고 합니다.

(동일 IP + 동일 포트만 동일 도메인이라 하며, 둘 다 동일 도메인에 있는 것으로 만족합니다.)

1. yml을 통해 구성 , 게이트웨이의 다음 수준에서 구성됨

구성 내용은 도메인 간 직접 수정할 수 있습니다.
2. 구성 클래스를 통해 설정


게이트웨이 게이트웨이와 결합된 센티넬

Sentinel과 결합하여 게이트웨이로 전송된 요청에 대해 흐름 제어 다운그레이드를 수행합니다.

센티넬은 두 부분으로 나누어진다
전제조건: 원격 서버에서 Sentinel 클라이언트를 다운로드하고 설치하고 실행합니다.
게이트웨이 서비스에는 다음만 필요합니다.
게이트웨이 서비스의 구성 파일과 IP + 포트, 센티넬 클라이언트의 계정 비밀번호
이러한 방식으로 Sentinel의 흐름 제어 다운그레이드가 통합됩니다.
센티널에는 게이트웨이 서비스에 대한 특별한 규칙이 있습니다., 해당 인터페이스는 컨트롤러의 메소드(서비스 입구)에 대한 흐름 제어 다운그레이드 인터페이스와 다릅니다.
어설션 팩터리에서 이러한 규칙을 기반으로 현재 흐름을 제한할 수 있습니다.
특정 IP, 원격 도메인 이름, 요청 헤더, URL의 매개변수 및 쿠키 값을 기반으로 흐름이 제한될 수 있습니다.


게이트웨이와 결합된 센티넬의 응답 내용을 사용자 정의

존재하다게이트웨이 계층이 센티널 흐름 제어에 의해 다운그레이드되거나 중단된 후 요청자에게 다음 콘텐츠로 응답합니다.

그러한 콘텐츠가 우리가 원하는 것이 아니라면 예외에 대응하는 방법을 맞춤화해야 합니다.두 가지 방법이 있습니다

방법 1: (간단함)

 

yml 구성에서 위 내용을 레이어로 작성하고,

. 구름 . 보초 . 에스씨지 . 폴백 . 응답 = '{"코드":403,"mes":" 현재 한도 "}'
응답 본문 뒤의 콘텐츠는 맞춤형 응답 콘텐츠(json 형식)입니다. , 작성된 내용은 응답 내용입니다.
방법 2:

응답 상태 코드, 응답 유형(json 형식) 및 응답 내용("다운그레이드!")을 설정합니다.



게이트웨이 고가용성