【7】GateWay 게이트웨이 구성 요소

Spring Cloud Gateway는 Spring Cloud의 새로운 프로젝트로, Spring 5.0, Spring Boot 2.0, Project Reactor 등 반응형 프로그래밍과 이벤트 스트리밍 기술을 기반으로 개발된 게이트웨이로, 마이크로서비스 아키텍처에 대한 간단하고 효과적인 통합을 제공하는 것을 목표로 합니다. API 라우팅 관리 방법.

이전 기사: 원격 호출 구성 요소 위장

기본 사상

게이트웨이의 핵심 기능:
요청 라우팅
, 권한 제어
및 전류 제한
아키텍처 다이어그램:

여기에 이미지 설명을 삽입하세요.
권한 제어 : 마이크로서비스 입구로서 게이트웨이는 사용자가 요청할 자격이 있는지 확인하고 그렇지 않은 경우 차단해야 합니다.
라우팅 및 로드 밸런싱 : 모든 요청은 먼저 게이트웨이를 거쳐야 하는데, 게이트웨이는 업무를 처리하지 않고 특정 규칙에 따라 특정 마이크로서비스로 요청을 전달하는 과정을 라우팅이라고 합니다. 물론, 라우팅할 대상 서비스가 여러 개인 경우에는 로드 밸런싱도 필요합니다.
전류 제한 : 요청 트래픽이 너무 높으면 게이트웨이는 과도한 서비스 압력을 피하기 위해 다운스트림 마이크로서비스가 수용할 수 있는 속도로 요청을 해제합니다.

서비스 구축

  1. 새 모듈 m-cloud-gateway-9002 생성

여기에 이미지 설명을 삽입하세요.

  1. 종속성 가져오기
   <!--eureka client 客户端依赖引入-->
        <!--spring boot ⽗启动器依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--GateWay ⽹关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--引⼊webflux-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!--⽇志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok⼯具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <!--引⼊Jaxb,开始-->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--引⼊Jaxb,结束-->
        <!-- Actuator可以帮助你监控和管理Spring Boot应⽤-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <!--spring cloud依赖版本管理-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!--编译插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <!--打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  1. 스타트업 수업
@SpringBootApplication
@EnableDiscoveryClient
public class McloudGateWay9002 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(McloudGateWay9002.class, args);
    }
}
  1. 구성 파일 application.yml
server:
  port: 9002

spring:
  application:
    name: m-cloud-eureka-server


#注册发现
eureka:
  client:
    service-url:
      defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    spring.application.name}:${
    
    server.port}:@project.version@

  1. Gateway 구성 추가
spring:
  cloud:
    gateway:
      routes:
        - id: service-autodeliver-router  #路由 ID,保持唯一
          uri: lb://m-service-autodeliver # 目标服务地址  自动投递微服务(部署多实例)动态路由:
          predicates:  # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
            - Path=/autodeliver/**
        - id: service-resume-router
          uri: lb://m-service-resume
          predicates:
            - Path=/resume/**
#            filters:
#               - StripPrefix=1
  1. http://localhost:9002/autodeliver/checkState/154513 접속 시작 2
    여기에 이미지 설명을 삽입하세요.

핵심 아이디어.

Spring Cloud GateWay는 기본적으로 게이트웨이의 가장 기본적인 부분이자 게이트웨이의 기본 작업 단위인 Reactor 모델
라우팅(경로)을 기반으로 하는 비동기식 및 비차단형입니다 . 라우팅은 ID, 대상
URL(최종 경로가 향하는 주소), 일련의 Assertion(일치 조건 판단) 및 필터(세련된 제어)로 구성됩니다
. 어설션이 true이면 경로가 일치됩니다.
조건자 : Java 8의 java.util.function.Predicate 주장을 참조하면 개발자는
HTTP 요청(요청 헤더, 요청 매개변수 등 포함)의 모든 콘텐츠를 일치시킬 수 있습니다(nginx의 위치 일치와 유사)
. 요청과 일치합니다.
여기에 이미지 설명을 삽입하세요.

Filter : 표준 Spring webFilter로, 필터를 사용하여
요청 전후에 비즈니스 로직을 실행할 수 있습니다.

GateWay 동적 라우팅 세부정보

  • pom.xml에 등록 센터 클라이언트 종속성을 추가합니다. (등록 센터 서비스 목록을 얻기 위해 유레카 클라이언트가 도입되었기 때문입니다.)
  • 동적 라우팅 구성
    여기에 이미지 설명을 삽입하세요.
    동적 라우팅을 설정할 때 URI는 lb: //(lb는 등록 센터에서 서비스를 받는 것을 나타냄)로 시작하고 그 뒤에 전달해야 하는 서비스 이름이 옵니다
    .

게이트웨이 필터

필터 유형의 관점에서 Spring Cloud GateWay 필터는 GateWayFilter와 GlobalFilter의 두 가지 유형으로 구분됩니다.

필터 유형 영향권
GateWay필터 단일 경로에 적용
전역 필터 모든 노선에 적용
예를 들어 게이트웨이 필터는 URL에서 자리 표시자를 제거한 다음 다음과 같은 경로를 전달할 수 있습니다.
          predicates:
            - Path=/resume/**
            filters:
               - StripPrefix=1

GateWay 고가용성

고가용성을 달성하기 위해 여러 GateWay 인스턴스를 시작할 수 있으며, Nginx와 같은 로드 밸런싱 장치는 고가용성을 달성하기 위한 로드 포워딩을 위해 GateWay의 업스트림에 사용됩니다.

#配置多个GateWay实例
upstream gateway {
    
    
 server 127.0.0.1:9002;
 server 127.0.0.1:9003;
}
location / {
    
    
 proxy_pass http://gateway;
}

추천

출처blog.csdn.net/u014535922/article/details/129978827