统一网关Gateway

什么是网关?

网关英文名称为Gateway,又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。

网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器,与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。

通俗点形容,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道"关口",这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的"关口"。也就是网络关卡。

我的个人理解就是看门狗

为什么需要网关?

对于一个项目而言,可能有很多的微服务,但是有的业务是不能被外部公开访问到的,并且服务器资源有限,他不能承受超多的请求,对应的一个i请求可能有许多个服务,还需要转发到对应服务。总结起来就是:

1,对用户请求做身份认证,权限校验

2,将用户的请求路由到微服务,并实现负载均衡

3,对用户请求做限流

网关的技术实现?

早期的zuul和新的Gateway

实现Gateway

1,单独创建一个模块,引入springCloudGateway依赖和nacos服务发现依赖

java 复制代码
  <!--引入网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--引入nacos注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2,创建一个启动类(注意启动类的位置,一定要在被扫描的包下面)

java 复制代码
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

3,在配置文件中配置该服务基本信息,以及路由配置,nacos地址等等

java 复制代码
server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes:   #网关的路由配置
        - id: user-service #路由id,自定义,但是必须式唯一的
          uri: lb://userservice #路由的目标地址,其中lb代表负载均衡,后面跟具体的微服务名。
          predicates: # 路由断言,就是判断请求是否符合路由规则的条件
            - Path=/user/** # 按照路径匹配。只要以user开头都符合要求
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

4,启动该服务试着访问配置的地址看看能不能拿到具体的数据

到此:网关搭建完成

网关的路由断言工厂

PredicateFactory:它的作用是读取用户定义的断言条件,对请求做出判断

Path=/user/** :代表路径式以user开头的就认为式符合的

至于其余断言如何书写,可以查阅官方文档:Spring Cloud 网关https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories路由过滤器 GatewayFilter

它的作用是对请求和响应做出处理,例如对请求价格请求头之类的

Spring提供了很多种过滤器,我们这里使用其中的一种来使用,其余方法使用参考官方文档:

Spring Cloud 网关https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories我们这里对userservice这个微服务配置过滤器,作用是在请求头上添加

名称为Assert,值为:观看我博客的崽是最牛逼的!!

java 复制代码
 routes:   #网关的路由配置
        - id: user-service #路由id,自定义,但是必须式唯一的
          uri: lb://userservice #路由的目标地址,其中lb代表负载均衡,后面跟具体的微服务名。
          predicates: # 路由断言,就是判断请求是否符合路由规则的条件
            - Path=/user/** # 按照路径匹配。只要以user开头都符合要求
          filters:
            - AddRequestHeader=Assert,XiaoYuanzu NB!!t

我们书写一个controller来验证:

java 复制代码
  @GetMapping("assert")
    public String getHeade(HttpServletRequest request){
        String header = request.getHeader("Assert");
        return "获得的请求头是:"+header;
    }

访问之后可以看到:

注意事项:修改完之后一定要重启,请求头不能是中文会乱码,访问的时候一定要是网关,不能直接访问对应的微服务!!!!!!!!!!!!

全如果想针对所有路由都配置过滤器可以使用defaultFilters,和routes平级,配置如下:

全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现!

如何实现全局过滤器?

书写一个类,实现GlobalFilter接口,执行拦截放行逻辑!

java 复制代码
@Order(-1) //因为又可能实现了很多过滤器所以需要定义改过滤器的优先级,越优先,默认是20多亿,也就是最小
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1,获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        //2,获取名为Authorization的
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        String authorization = queryParams.getFirst("Authorization");
        //3,判断参数是不是admin
        if(authorization.equals("admin")){
            //4,是就放行
             return chain.filter(exchange);//放行
        }
        //5,不是拦截
        //5.拦截之前为了提升用户体验,所以可以设置状态码,未登录
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//实则状态就是401
        return exchange.getResponse().setComplete();//结束
    }
}

注意:一定要设置优先级,并且加上@Component注解

加了参数之后成功访问

参数错误❌---401

没有添加参数,后台会报错NPE,界面显示500,因为想获取名称为 Authorization的对象的值,获取不到

过滤器执行顺序
网关跨域问题处理

跨域:域名不一致就叫跨域,一般是请求协议,域名,端口等不同

跨域问题:浏览器禁止请求的发起者与服务端发生跨域Ajax请求,请求被浏览器拦截等问题

如何解决,在gateway中进行配置即可

java 复制代码
spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

Gateway完结!!!!!

相关推荐
码界领航3 小时前
【Spring Cloud】一个例程快速了解网关Gateway的使用
spring·spring cloud·gateway
曾燕辉3 小时前
Spring Cloud Gateway报sun.misc.Unsafe.park(Native Method)
gateway·springcloud
MasterSpring15 小时前
spring cloud gateway客户端websocket断开连接,服务侧连接没有关闭的问题处理
websocket·spring cloud·gateway
程序员爱中国2 天前
GateWay服务网关
gateway·服务网关
hgdlip3 天前
路由器的ip地址与网关的区别是什么
网络·网关·tcp/ip·智能路由器
TOMORROW6COME4 天前
SpringCloud-服务网关-Gateway
spring·spring cloud·gateway
读书笔记控6 天前
计算机相关术语科普之什么叫网关(Gateway)
gateway
Lill_bin6 天前
面试题--SpringBoot
spring boot·后端·spring·spring cloud·zookeeper·gateway·mybatis
怪兽也会哭哭7 天前
微服务应用与开发知识点练习【Gateway,OpenFeign,Dubbo,RocketMQ和RabbitMQ,JPA,Redis,Mycat】
微服务·gateway·rabbitmq·dubbo·rocketmq
怪兽也会哭哭7 天前
Spring Cloud Alibaba之网关组件Gateway
spring boot·gateway·学习笔记