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("auth/** -- 需要鉴权
核心:过滤器GlobalAuthFilter 常见错误1、web依赖和 gateway的 webflux依赖冲突:办法:排除:web场景启动器
2、缺少 HttpServletRequest类:办法:单独引入servlet-api
为什么会缺少这个类呢?因为上一步中不是排除了web的场景启动器吗,连带把这个类也弄走了,所以需要单独再引入一下了。
3、数据库相关;办法:启动类中排除数据库连接池自动配置
原因:由于service-base的依赖中有数据库相关的依赖,导致会初始化数据库连接池



