微服务从代码到k8s部署应有尽有系列(二、网关)

网友投稿 534 2022-09-11

微服务从代码到k8s部署应有尽有系列(二、网关)

我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。

实战项目地址:​​github.com/Mikaelemmmm…​​

1. go-zero 网关概念

go-zero架构往大的说主要由两部分组成,一个是api,一个是rpc。api主要是, go-zero没有提供,实际也用不着单独去写一个网关,市面上的网关已经够多了,go-zero官方在晓黑板中用的nginx足够用了,当然你如果更熟悉kong、apisix都可以替换,本质上没什么不一样的,只是一个统一流量入口,统一鉴权等。

2. nginx网关

【注】:在看这里的时候,建议先看一下前一节的业务架构图

本项目中实际也使用了nginx做为网关,使用nginx的auth_request模块作为统一鉴权,业务内部不做鉴权(设计到资产的最好业务内部做二次鉴权,主要多一层安全),nignx的网关配置在项目的data/nginx/conf.d/looklook-gateway.conf

server{ listen 8081; access_log /var/log/nginx/looklook.com_access.log; error_log /var/log/nginx//looklook.com_error.log; location /auth { internal; proxy_set_header X-Original-URI $request_uri; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_pass } location ~ /usercenter/ { auth_request /auth; auth_request_set $user $upstream_ proxy_set_header x-user $user; proxy_set_header Host $ proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass } location ~ /travel/ { auth_request /auth; auth_request_set $user $upstream_ proxy_set_header x-user $user; proxy_set_header Host $ proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass } location ~ /order/ { auth_request /auth; auth_request_set $user $upstream_ proxy_set_header x-user $user; proxy_set_header Host $ proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass } location ~ /payment/ { auth_request /auth; auth_request_set $user $upstream_ proxy_set_header x-user $user; proxy_set_header Host $ proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass }}

容器内部nginx端口是8081,使用docker暴露出去8888映射端口8081,这样外部通过8888来访问网关,使用location来匹配每个服务,当然会有人说,每加一个api服务都要来nignx配置太麻烦,你也可以使用confd统一配置,自行百度。

3. 举例

当我们在访问用户服务时候, ​​, 访问了外部端口8888,然后映射到nginx内部looklook网关8081上,然后location匹配到了/usercenter/ ,在该模块开始有一行 auth_request /auth, 所以nginx不会直接去请求​​, 而是会先跳到 location /auth 模块中,auth模块会访问 ​​,identity-api也是我们内部的服务,是由我们自己写的鉴权服务,实际也是用的go-zero的jwt

进入identity-api 只做了2件事情(具体可以看looklook项目中的identity-api代码)

1、判断当前访问的路由(usercenter/v1/user/detail )是否需要登录。这里的路由是否需要登录,可以在identity-api中配置,代码已经实现好了。

2、解析传递的token到header中

如果当前访问的路由需要登录:

token解析失败:就会返回给前端这样我们在usercenter直接就可以拿到该登录用户的id了

如果当前访问的路由不需要登录:

前端header中传递了token

如果token校验失败:返回这样我们在usercenter直接就可以拿到该登录用户的id了

前端header中没传递token:userid 会传递 0 给后端服务

4、总结

这样我们就可以统一入口,统一鉴权,也可以统一收集日志上报,用作错误分析,或者访问用户的行为分析。因为我们日常对nginx用的比较多,也比较熟悉,如果各位同学对kong、apisix比较熟悉,在了解了上方go-zero使用网关的概念就可以直接替换也是一样的。

项目地址

​​github.com/zeromicro/g…​​

欢迎使用 ​​go-zero​​ 并 star 支持我们!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:|NO.Z.00093|——————————|^^ 升级 ^^|——|KuberNetes&二进制升级.V04|——|kubernetes_master|k8s-master03组件|
下一篇:企业四要素,企业四要素认证是什么
相关文章

 发表评论

暂时没有评论,来抢沙发吧~