学习目标
- 能够说出用什么实现的网关以及实现了哪些功能
- 能够创建网关工程实现路由功能
- 能够使用网关内置过滤器StripPrefix
- 能够定义全局过滤器并测试通过
- 能够实现全局身份校验过滤器
- 能够在微服务实现用户身份拦截器
- 能够说出网关鉴权具体的实现步骤
- 能够实现商城项目前后端联调
- 能够将微服务配置文件在Nacos统一管理
- 能够说出微服务配置文件的加载顺序
- 能够将微服务配置文件抽取公共配置
- 能够说出Nacos配置热更新方案
1 网关路由
1.1.认识网关
1.1.1 问题分析
目前为止我们已将黑马商城单体项目重构为微服务架构,今天的目标是前后端联调,下边思考几个问题:
1.1.1.1 前端面对多个后端入口
项目采用单体架构时前端通过nginx负载均衡访问后端服务,如下图:
同一个服务部署多份仅端口不同,且部署在不同地域(北上广深)的方式,一般称:水平复制、异地容灾
项目采用微服务架构时原来的黑马商城分成了购物车服务、交易服务、支付服务等多个服务,前端面对多个后端入口 ,如下图:
前端面对多个后端入口不方便前端开发,效率低下。仍然可以采用nginx去解决【注意不是最佳】,如下图:
在nginx中创建多个upstream ,例如:
http {
upstream item_services {
server 127.0.0.1:8081 weight=3; # 分配较高权重
server 127.0.0.1:8082 weight=2; # 分配中等权重
server 127.0.0.1:8083 weight=1; # 分配较低权重
}
upstream carts_services {
server 127.0.0.1:7081 weight=3; # 分配较高权重
server 127.0.0.1:7082 weight=2; # 分配中等权重
server 127.0.0.1:7083 weight=1; # 分配较低权重
}
....
server {
listen 80; # 监听 80 端口,也可以根据需要更改
server_name localhost; # 更改为你的域名或 IP 地址
location /items/ { # 这里可以根据需要调整路径前缀
proxy_pass http://item_services;
}
location /carts/ { # 这里可以根据需要调整路径前缀
proxy_pass http://carts_services;
}
....
}
1.1.1.2 用户身份校验放在哪?
单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身份校验、用户信息获取的接口,非常麻烦。
用户身份校验最好放在一个统一的地方,放在上图中nginx的位置上上最合适,那nginx的作用如下:
1.请求路由,根据请求路径将请求转发到不同的应用服务器。
2.负载均衡,通过负载均衡算法将请求转发到不同的应用服务器。
3.用户身份鉴权,校验用户身份及用户的权限。
1.1.2 认识网关
Nginx目前扮演的角色就是:网关,什么是网关?
顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
我们现在要根据需求使用Java在网关实现路由转发和用户身份认证的功能:
- 根据请求Url路由到具体的微服务
- 校验用户的token,取出token中的用户信息。
- 从nacos中取出服务实例进行负载均衡。
但 在nginx中进行java编程是非常困难的,所以我们需要一个使用java开发的网关。
AI:java微服务网关
● Netflix Zuul:早期实现,目前已经淘汰
● Spring Cloud Gateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强
课堂中我们以Spring Cloud Gateway为例来讲解,如下图:
前端请求网关根据请求路径路由到微服务,网关从nacos获取微服务实例地址将请求转发到具体的微服务实例上。生产环境中网关也是集群部署,在网关前边通过nginx进行负载均衡,如下图:
为什么这里需要Naocs?
答:网关怎么根据用户访问路径:http://baidu.com/carts/findAll,决定找到carts购物车服务呢?
此时就会用到服务注册与发现的知识点,而能帮我们实现这个功能的无疑nacos就可以做到。
1.1.3. 面试题
说说Spring Cloud五大组件?
你们项目网关用什么实现,实现了什么功能?
1.2. 实现网关路由
接下来,我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块,大概步骤如下:
AI:Spring Cloud Gateway实现路由
● 创建网关微服务
● 引入Spring Cloud Gateway、NacosDiscovery依赖
● 编写启动类
● 配置网关路由
1.2.1. 创建网关工程
首先,我们要在hmall下创建一个新的module,命名为hm-gateway,作为网关微服务:
1.2.2 引入依赖