网关旨在为微服务架构提供一种简答有效的同意的API入口,负载服务请求路由、组合及协议转换,并且基于Filter链的方式提供了权限认证,监控,限流等功能。

网关优点:1.性能强 2.功能强大:内置了很多实用的功能,如:转发 监控 限流等 3.容易扩展

网关缺点:依赖Netty与WebFlux(spring5.0),学习成本高 ,需要spring boot2.0及以上的版本次才支持

网关需要进行的配置:

第一步:添加相关依赖。

注意:添加完这个依赖不能添加web依赖,会起冲突

<!--    配置网关依赖,基于Netty去写的。加了这个依赖不能加web依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
<!--    服务发现依赖-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--    限流依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--    在限流上显示网关依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

第二步:添加application.yml相关配置:

其中:路由是gateway最基本的组件之一,表示一个具体的路由信息载体

id:路由表示符,路由名称

uri:路由执行的目的地,客户端请求最终被转发到的微服务

predicate:断言 谓词  条件判断,当返回的都是true时才会执行路由

filter:  过滤器,用于修改请求和响应信息

lb:指从nacos中按照名称获取微服务,并遵循负载均衡策略,同时简易开发阶段打开gateway日志

server:
  port: 9000
spring:
  application:
    name: sso-gateway  #通过网关进行访问。
  cloud:
    nacos:
      discovery:    #服务注册端口
        server-addr: localhost:8848
      config:   #配置中心端口
        server-addr: localhost:8848
        file-extension: yml   #配置文件后缀名
    sentinel:    #配置限流端口
      transport:
        dashboard: localhost:8180
      eager: true     #开启通过服务注册中心的serbiceId创建路由
    gateway:
      routes:   #路由
        - id: router01    #资源服务路由名称
          uri: lb://sso-resource   #lb表示负载均衡  后面是需要进行负载均衡的服务名
          predicates:      #匹配规则
            - Path=/sso/resource/**     #设置访问路径 以及规则
          filters:
            - StripPrefix=1
        - id: router02     #认证服务路由名称
          uri: lb://sso-auth    #lb表示负载均衡  后面是需要进行负载均衡的服务名
          predicates:    #谓词对象,可以定义多个谓词逻辑
            - Path=/sso/oauth/**
          filters:
            - StripPrefix=1   #去掉第一层路径
      globalcors: #跨域配置(写到配置文件的好处是可以将其配置写到配置中心)
        corsConfigurations:  #所有跨域配置只是针对ajax请求,因为ajax请求不支持跨域
          '[/**]':
            allowedOrigins: "*"
            allowedHeaders: "*"
            allowedMethods: "*"
            allowCredentials: true
logging:  #日志
  level:
    org.springframework.cloud.gateway: debug

 第三步:当你完成配置后 启动网关项目,检查sentinel控制台网关菜单。启动时,需要添加jvm参数:

-Dcsp.sentinel.app.type=1

 

springboot 网关获取ip springboot 网关 作用_限流

 

springboot 网关获取ip springboot 网关 作用_spring_02

 基于请求属性限流

springboot 网关获取ip springboot 网关 作用_限流_03

 

springboot 网关获取ip springboot 网关 作用_gateway_04

 自定义API维度限流

自定义API分组,是一种更细的限流规则定义,它允许我们利用sentinel提供的API,将请求路径进行分组,然后在组上设置限流规则即可

springboot 网关获取ip springboot 网关 作用_限流_05

 

springboot 网关获取ip springboot 网关 作用_java_06

 定义流控网关返回值:

@Configuration
public class GatewayConfig {
    public GatewayConfig(){
        GatewayCallbackManager.setBlockHandler( new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map<String,Object> map=new HashMap<>();
                map.put("state",429);
                map.put("message","two many request");
                String jsonStr=JSON.toJSONString(map);
                return ServerResponse.ok().body(Mono.just(jsonStr),String.class);
            }
        });
    }
}

 其中,Mono 是一个发出(emit)0-1个元素的Publisher对象。