一、网关
作用:
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的依赖中有数据库相关的依赖,导致会初始化数据库连接池