美文网首页
SpringCloudGateway上手

SpringCloudGateway上手

作者: Wannay | 来源:发表于2021-02-07 05:44 被阅读0次

1.引入SpringCloudGateway和注册中心(这里选用Eureka)的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wanna</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-gateway-gateway9527</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.创建application.yaml

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    discovery:
      enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
    gateway:
      routes:
        - id: payment_route  #路由的id,只需要保证唯一即可,建议使用服务名
          #uri: http://localhost:8002   #写死的路由
          uri: lb://CLOUD-PROVIDEREUREKA-PAYMENT8002 #利用微服务进行动态路由,lb表示负载均衡,利用ribbon
          predicates: #利用断言进行路由匹配
            - Path=/payment/**   #使用Path的方式,更多方式可以参考官网

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
    register-with-eureka: true  #将自己注册到eureka
    fetch-registry: true


#Gateway不需要引入web的jar包,引入会报错
#Gateway挡在了8001之前,我们可以不暴露出来8001的真实端口,只暴露出来9527
#uri不应该写死成http://localhost:8002,而应该去使用动态路由的方式去匹配
#默认情况下Gateway会根据注册中心注册的服务列表
#以注册中心上微服务的名称为路径创建动态路由进行转发,从而实现动态路由的功能
#需要加上spring.cloud.discovery.enabled=true的配置,并修改uri为
#lb://微服务名

相关说明:

#SpringCloudGateway将路由匹配作为Spring Webflux HandlerMapping基础架构的一部分
#SpringCLoudGateway包含许多内置的Route Predicate工厂,这些工厂都与Http请求的不同属性匹配
#并且多个工厂之间可以进行组合使用,SpringCloudGateway创建Route时,使用RoutePredicateFactory
#创建Predicate对象,Predicate对象可以赋值给Route。SpringCloudGateway包含许多内置的RoutePredicateFactories
#所有这些谓词都匹配Http请求的不同属性,多个谓词工厂可以组合,使用and逻辑
#包括如下的Predicate:
#1.AfterRoutePredicate,后面指定一个时间(格式看官网,也可以使用ZonedDateTime.now()等方式获取),表示在这个时间点之后才能访问
#2.BeforeRoutePredicate,和Before类似,在这个时间点之前才能访问
#3.BetweenRoutePredicate,在两个时间点之间利用访问
#4.CookieRoutePredicate,需要两个参数(逗号连接),一个是CookieName,一个是正则表达式,携带Cookie且CookieName需要符合正则表达式的条件才能访问
#5.HeaderRoutePredicate,类似Cookie,也是一个HeaderName,一个正则表达式
#6.HostRoutePredicate
#7.MethodRoutePredicate,-Method=GET
#8.PathRoutePredicate
#9.QueryRoutePredicate,类似Cookie,一个QueryName,一个正则表达式

#Gateway的Filters:
#常见的Filter有AddRequestParameter,添加请求头
#eg:AddRequestParameter=aaa,123  #添加请求头aaa-123
#在工作中我们一般使用自定义的Filter(全局日志记录,统一网关鉴权)
#自定义Filter需要实现GlobalFilter,Ordered接口
#demo实现见config/

3.创建主启动类

package com.wanna.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient   //Eureka客户端
public class CloudGatewayGateway9527Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudGatewayGateway9527Application.class, args);
    }

}

4.自定义过滤器

package com.wanna.springcloud.config;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //exchange.getRequest() 类似获取HttpServletRequest
        //exchange.getResponse() 类似获取HttpServletResponse
        return chain.filter(exchange);  //放行
    }

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

5.Gateway的意义?

  • 可以不暴露出来真实的后端端口,全部通过网关进行路由的转发,利用注册中心进行动态路由的转发,凡是要请求后端的API,都必须通过网关!

相关文章

网友评论

      本文标题:SpringCloudGateway上手

      本文链接:https://www.haomeiwen.com/subject/vtbatltx.html