网关_订单

一、网关

作用

​ 1、可以解决跨域请求

​ 2、之前调不同的微服务都是通过不同的网络地址去获取,现在可以通过一个网络地址,去调用不同的服务。

网关核心概念

​ 1、路由:由ID、目标URL、一组断言、过滤器Filter

​ 2、断言:提前写好的条件

​ 3、过滤器:主要就两种,Gateway Filter网关过滤器、Global Filter全局过滤器

执行流程

​ 1、客户端发出请求

​ 2、根据请求找路由:Handler Mapping中找到与请求相匹配的路由

​ 3、将请求通过过滤器发送到实际服务:Web handler通过指定的过滤器将请求发送到实际的服务

特点:

​ 1、依赖于netty和WebFlux

​ 2、网关不能部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行


二、搭建Gateway网关服务

依赖:

​ 网关的依赖 spring-cloud-starter-gateway

​ 注册中心的依赖 spring-cloud-starter-alibaba-nacos-discovery(因为这个网关服务也需要注册到服务中心去)

配置文件(主要分为两种:自动生成路由和自己设置路由)

​ 1、自动生成路由:

gateway:
      discovery:
        locator:
          enabled: true 
  # gateway可以发现nacos中的微服务,并自动生成转发路由

三、配置路由和跨域问题的解决

路由配置

组成:

​ 1、id:配置的唯一标识

​ 2、uri:指向被转发到的微服务的地址

​ 3、predicates断言:条件判断,断言为true才会执行路由

​ 4、Path路径:路径形式的断言,匹配这个路径才会放行

实例

#spring:
#  cloud:
#    gateway:
      routes:
      - id: service-edu
        uri: http://localhost:8110
        predicates:
        - Path=/user/**

注意:id前面的横线 -

配置这个路由routes点进去看源码,实际上就是一个list集合,所以这里的横向 - 表示的是创建一个对象设置到List集合中。一个 -  就表示数组中的一个元素。同理断言predicates也是一组list集合,所以也需要在前面配置一个横线。

结合实例理解路由的配置

如果访问 http://localhost:9110/api/edu/teacher/list
这个靠网关9110是无法处理这个请求的,还是要交给真正的微服务的地址去处理。
这里最后会将路径进行一个拼接,将前面的网关9110替换成8110,后面再加*问的地址/api/edu/teacher/list。

负载均衡

怎么做:将uri中的地址修改成注册中心中的微服务地址,网关将从nacos中按照服务名称获取微服务。

1、原来的写法:这么做会把微服务的地址写死了

uri: http://localhost:8110

2、负载均衡的写法:因为所有的服务都写在service-edu中,即使是写在service-base中的服务也可以通过feign远程调用。

uri: lb://service-edu

跨域问题的优化

1、跨域配置:这里写了一个配置类,相当于之前的配置文件的作用。在这个配置文件中,进行了允许跨域访问的相关配置。这里还通过注解@Bean将这个对象注入到容器中。

@Component
public class GlobalGatewayConfig {
    //将gateway提供的跨域filter对象注入到容器中
    @Bean
    public CorsWebFilter corsWebFilter(){

        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        //一个路径的跨域配置
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);//是否允许携带cookie
        config.addAllowedHeader("*");//请求头
        config.addAllowedMethod("*");//所有请求方式
        config.addAllowedOrigin("*");//所有服务器
        corsConfigurationSource.registerCorsConfiguration("/**" , config);
        return new CorsWebFilter(corsConfigurationSource);
    }
}

2、删除之前后端关于跨域的注解

以前写的@CrossOrigin全部删掉,以后就不用写了。

3、前端的配置修改:在前端中指定访问网关的地址,也是都从访问网关开始,都把请求交给网关处理

四、微服务网关鉴权

鉴权的定义

​ 验证用户是否拥有访问系统的权利,以前采取的方式主要是密码登录,后面改进为通过token进行验证。

统一鉴权的意义

​ 如果有很多独立的微服务都需要进行鉴权验证,那么肯定就有必要整理一下。不然都话,每个要进行鉴权验证的接口我都要整理一下,很麻烦。抽取出来,谁需要鉴权的,在路径中添加一个auth即可,方便的很。

怎么做才能实现统一鉴权

​ 一般在后端需要鉴权的接口路径中添加一层路径【/auth】

​ 判断如果请求路径中包含

/api/**/auth/**    -- 需要鉴权

核心:过滤器GlobalAuthFilter

常见错误

1、web依赖和 gateway的 webflux依赖冲突:办法:排除:web场景启动器

2、缺少 HttpServletRequest类:办法:单独引入servlet-api

为什么会缺少这个类呢?因为上一步中不是排除了web的场景启动器吗,连带把这个类也弄走了,所以需要单独再引入一下。

3、数据库相关;办法:启动类中排除数据库连接池自动配置

原因:由于service-base的依赖中有数据库相关的依赖,导致会初始化数据库连接池

上一篇:Spring 笔记


下一篇:基于Springboot+Element-Vue-Admin实现简单权限管理系统