云计算百科
云计算领域专业知识百科平台

微服务项目生产环境全链路架构:从前端访问到网关鉴权、服务调用、中间件与网络安全

涵盖 DNS、HTTPS、Nginx、Vue、Sa-Token、Gateway、Nacos、Feign、Redis、RocketMQ、MySQL、安全组与防火墙

整体流程

服务能不能被访问,主要取决于它有没有可以到达的 IP 和端口,以及安全组、防火墙等网络规则是否允许连接。
一般怎么设置呢,生产环境上一般就是用一个域名+HTTPS,比如通过 https://ergou.xxx.com 来访问,这个时候云服务器一般只开放 80 端口和 443 端口 [怎么配置开放端口看下面的安全组和防火墙] ,也就是 HTTP 请求和 HTTPS 请求,浏览器输入 https://ergou.xxx.com,这个时候会先经过 DNS 域名解析把 ergou.xxx.com 真正解析为公网 IP,然后因为我们是输入的 https,所以是定位到 443 端口(http 请求就到 80,这是默认的),最终就是 (公网IP:443),注意不是 8080。

我们连接云服务器,是不是就是只要 用户名+IP+密码,因为 ssh 工具默认帮我们接的是 22 端口,我们输入 localhost:8080 不指定 http 或者 https 也能发送,因为不指定,浏览就默认发送的 http 请求,并且浏览器地址栏默认是发 GET 请求,发送不了POST、PUT、DELETE请求。所以我们需要 Postman 来发送

然后我们会配置 Nginx,生产环境一般会使用 Nginx 提供 Vue 打包后的静态文件,包括 index.html、JavaScript、CSS 和图片等。Vue 是单页应用,index.html 只提供 Vue 的挂载点,真正的页面组件和路由逻辑在 JavaScript 中。浏览器加载 Vue 以后(Vue 活在浏览器里面),由 Vue Router 根据 URL 路径决定展示哪个组件。切换路由时,Vue 只切换组件,不会刷新整个页面;如果某个路由使用了懒加载,第一次进入时才会向 Nginx 请求对应的 JS 文件。
index.html 代码示例

<div id="app"></div>
<script src="/assets/index.js"></script>

当我们点击按钮操作什么的时候,就是触发 Axios 请求(前后端分离),比如我们的 axios.get("/api/product/list"),这个请求还是先到 Nginx,然后 Nginx 把 /api/ 开头的请求转发给 Gateway,这个请求转发也会做负载均衡转发到网关,因为网关一般不是只有一个,所以用 Nginx 做前端页面返回+请求转发到网关+负载均衡。

Nginx的负载均衡是浏览器请求到网关的,网关的负载均衡是请求到服务的。

给个代码就是

# 前端页面请求,直接返回静态文件
location / {
root /www/dist;
try_files $uri $uri/ /index.html;
}

# 后端接口请求,转发给 Gateway
location /api/ { # 这个叫反向代理
proxy_pass http://gateway-cluster;
}

upstream gateway-cluster { # 这个叫负载均衡
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}

Nginx 这个东西挺好的,这样写前端页面的时候不需要知道后端地址,我们原来写前端的时候都会把后端地址配置到代码里面,比如一个全局变量 target: 'http://localhost:8080',然后前端发请求就是 target + '/api/user/info',并且我们可以直接编译 Vue 项目,它自己也会搞个端口你来请求对吧,你访问 http://localhost:5173 就是我的页面,但是有个问题,后端地址如果变了你得改代码重新部署,而且负载均衡代码怎么做?Nginx 帮你配置,它来拦截。

Nginx 负载均衡怎么做?不能只有一个Nginx吧,一个域名确实能解析到多个 Nginx IP,但是不好用,为什么?假如一个Nginx挂了,它健康检查不及时,还可能访问这个坏的Nginx,并且负载分配不精细。所以生产上会把域名解析到一个高可用的云负载均衡器(又加一层),那这样云负载均衡器放到公网,Nginx放到内网就可以了。如果云负载均衡能力足够,可以省掉 nginx,用它来代替 Nginx
公网入口120.1.1.1
├── 负载均衡节点A
├── 负载均衡节点B –> Nginx-1,Nginx-2,Nginx-3 10.0.0.x
└── 负载均衡节点C
不过还需要保证所有 Nginx 用同一份 nginx 配置还有 Vue dist,因为页面还有请求到的Gateway地址都是一样的。

不过后续我们暂时以 Nginx 放到公网举例

Nginx服务器只开放了 80 和 443 端口来响应前端请求。Nginx 和 Gateway 一般不在一台服务器上,Gateway可以水平扩展,多加几个机器。所以 Gateway 放在内网,不放在公网更安全,Nginx 配置一个公网地址,一个内网地址,Nginx 转发请求到 Gateway。

Gateway 多实例时,Sa-Token 登陆状态一般存入 Redis,让所有 Gateway 共享

通过 Gateway 来访问各个微服务,Gateway 根据请求路径匹配路由,然后执行过滤器,由它来决定是转发请求,还是拦截,并且在这里放行比如登陆请求,登陆请求里会校验账号密码,进行 StpUtil.login(userId),然后把 token 放入 Redis,token 返回前端,前端拿到 token 之后保存起来,并且写一个全局拦截器,每次发请求都把 token 放入 header 里面

这样其他请求都携带着 token,通过 token 校验身份、验证权限(比如你有没有查询商品、修改商品的权限),校验通过后可以进行 uerId 的透传。

透传 userId 之前要删除客户端伪造的同名请求头,再写入 Sa-Token 解析出来的真实用户ID

这里 Gateway 校验的权限比较通用,比如某用户有修改商品的权限,但是实际上只能修改自己的商品,所以还要在下游服务判断业务级的权限,更细致一点

Gateway 还会负载均衡服务,假如用户服务有多个,可以通过 Gateway 决定转发到哪一个,在配置的时候 uri: lb://user-service,这个 lb 就来启用负载均衡。Spring Cloud 使用的是 LoadBalancer 这个组件来做的负载均衡,各个服务之间也要通信,那么服务之间也会用安全组互相规定谁可以访问我,但是互相访问都是通过 Feign 相互调用,不经过网关,负载均衡谁来做?从Nacos中获取服务实例列表,由 LoadBalancer 选择实例,还是它来做,服务之间的解决了,服务再往下一层就是中间件还有数据库了,比如 RocketMQ、MySQL、Redis,RocketMQ 和 Redis 有自己的集群路由和故障转移机制,业务代码通常不需要自己编写负载均衡算法,但需要正确部署集群并配置客户端。MySQL要借用别的组件来实现读写分离、分库分表,比如 ShardingSphere,MySQL 自身能做主从复制(binlog)

服务之间的相互调用,因为不经过 Gateway 了,所以发起新请求时请求头的 userId 又没了,所以又需要修改 Feign 的拦截器继续传递 userId。

鉴权了前端怎么渲染?所以在用户登陆之后呢还会把用户的权限列表返回给前端,比如 product:delete,根据这个来渲染按钮。但是前端只是隐藏按钮,用户仍然能用 Postman 请求删除什么的,所以后端必须要校验好

Seata 可以来做分布式事务

概念区分

  • 安全组:安全组是云厂商提供的、绑定在云服务器网卡上的虚拟防火墙。它用来配置哪些IP能访问我的哪些端口,一般想开放一个端口都得配置一下入站规则:什么来源IP能通过什么网络协议访问我的哪些端口,比如向公网开放 80、443 端口,就是 0.0.0.0/0 代表所有IP地址,允许谁都访问,然后 TCP 80,TCP 443,必须以TCP协议访问我的这两个端口,其他协议或者其他端口统统拒绝。

    有入站规则也有出站规则,出站规则配置我能访问谁,有的厂商可能会设置出站全部放行,有的不是,那出站就要配置上访问网关,加上它的IP+端口+协议。这样的话你看 Gateway 配置上只允许 Nginx 的服务器访问 8080 端口,公网就不能访问 Gateway 了。最理想的是 Gateway 都不配置公网 IP,即使有公网 IP,也不对公网放行 8080。–> 云安全组比较方便,直接控制台就能配置,不用登陆服务器。

  • 防火墙:防火墙是一个更大的概念,操作系统都会提供自带的防火墙,安全组是云平台提供的一种防火墙。所以注意,防火墙是一个概念,不是操作系统的防火墙才叫防火墙,安全组也是一种防火墙。防火墙也可以和安全组一样配置允许的 IP,允许访问的端口啥的。请求先到云安全组,然后经过防火墙,可以做成两层防护(之前配服务器是把防火墙直接关闭,只通过安全组配置的,我觉得不如安全组的地方可能是,假如有三台 Gateway,一台 Nginx,你如果想要 Nginx 通过 Gateway 的操作系统防火墙,那要登陆三台服务器配置放行 Nginx 的请求,如果有一天加了一台Nginx,那又要重复登陆三台服务器配置放行这个IP,但是如果用安全组,可以进行归类,Nginx 服务器创建一个安全组,比如叫 nginx-sg,Gateway 也创建一个安全组 gateway-sg,然后 gateway-sg 允许 nginx-sg 的请求,有一天想加个 nginx,只要把这台服务器绑定到 nginx-sg 安全组就可以了)

赞(0)
未经允许不得转载:网硕互联帮助中心 » 微服务项目生产环境全链路架构:从前端访问到网关鉴权、服务调用、中间件与网络安全
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!