微服务从代码到k8s部署应有尽有系列(二、网关)
我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。
整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。
实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook
1. go-zero 网关概念
go-zero架构往大的说主要由两部分组成,一个是api,一个是rpc。api主要是http对外访问的,rpc主要就是内部业务交互使用的是protobuf+grpc,当我们项目体量还不大的时候,我们可以使用api来做一个单体项目,等后续量上来之后,可以拆分到rpc做微服务,从单体转向微服务十分容易,很像java的springboot转像springcloud,非常方便。
api被很多同学理解成了网关,实际意义上来说当你的项目在使用go-zero做微服务时候,你把api当成网关也没什么大的问题,不过这样做导致的问题就是一个api对应后面多个rpc,api充当了网关,这样如果我在更新后续业务代码时候,更新任何业务都要去改动这个api网关,比如我只是改了一个小小的不起眼的服务,那就要重新构建整个api,这样不太合理,效率极低也很不方便。所以,我们只是把api当成一个聚合服务,可以拆分成多个api,比如用户服务有用户服务的rpc与api,订单服务,有订单服务的rpc与api,这样当我修改用户服务时候,我只需要更新用户的rpc与api,所有的api只是用来聚合后端rpc的业务。那有的同学就会说,我总不能每个服务解析个域名对应你的api吧,当然不能,这时候api前面就要有一个网关了,这个网关才是真正意义上的网关,比如我们常说的nginx、kong、apisix,很多微服务都内置了网关,比如springcloud提供了springcloud-gateway , 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 http://identity-api:8001/identity/v1/verify/token;
}
location ~ /usercenter/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user;
proxy_set_header Host $http_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 http://usercenter-api:8002;
}
location ~ /travel/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user;
proxy_set_header Host $http_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 http://travel-api:8003;
}
location ~ /order/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user;
proxy_set_header Host $http_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 http://order-api:8004;
}
location ~ /payment/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user;
proxy_set_header Host $http_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 http://payment-api:8005;
}
}
容器内部nginx端口是8081,使用docker暴露出去8888映射端口8081,这样外部通过8888来访问网关,使用location来匹配每个服务,当然会有人说,每加一个api服务都要来nignx配置太麻烦,你也可以使用confd统一配置,自行百度。
3. 举例
当我们在访问用户服务时候, http://127.0.0.1:8888/usercenter/v1/user/detail , 访问了外部端口8888,然后映射到nginx内部looklook网关8081上,然后location匹配到了/usercenter/ ,在该模块开始有一行 auth_request /auth, 所以nginx不会直接去请求http://usercenter-api:8002 , 而是会先跳到 location /auth 模块中,auth模块会访问 http://identity-api:8001/identity/v1/verify/token; ,identity-api也是我们内部的服务,是由我们自己写的鉴权服务,实际也是用的go-zero的jwt
进入identity-api 只做了2件事情(具体可以看looklook项目中的identity-api代码)
1、判断当前访问的路由(usercenter/v1/user/detail )是否需要登录。这里的路由是否需要登录,可以在identity-api中配置,代码已经实现好了。

2、解析传递的token到header中
- 如果当前访问的路由需要登录:
- token解析失败:就会返回给前端http401错误码;
- token解析成功:就会将解析出来的userId放入header的x-user中返回给auth模块,auth模块会把header传递给对应访问的服务(usercenter), 这样我们在usercenter直接就可以拿到该登录用户的id了
- 如果当前访问的路由不需要登录:
- 前端header中传递了token
- 如果token校验失败:返回http401;
- 如果token校验成功:就会将解析出来的userId放入header的x-user中返回给auth模块,auth模块会把header传递给对应访问的服务(usercenter), 这样我们在usercenter直接就可以拿到该登录用户的id了
- 前端header中没传递token:userid 会传递 0 给后端服务
- 前端header中传递了token
4、总结
这样我们就可以统一入口,统一鉴权,也可以统一收集日志上报,用作错误分析,或者访问用户的行为分析。因为我们日常对nginx用的比较多,也比较熟悉,如果各位同学对kong、apisix比较熟悉,在了解了上方go-zero使用网关的概念就可以直接替换也是一样的。
项目地址
https://github.com/zeromicro/go-zero
欢迎使用 go-zero 并 star 支持我们!
微信交流群
关注『微服务实践』公众号并点击 交流群 获取社区群二维码。
微服务从代码到k8s部署应有尽有系列(二、网关)的更多相关文章
- 微服务从代码到k8s部署应有尽有系列(一)
从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...
- 微服务从代码到k8s部署应有尽有系列(三、鉴权)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(四、用户中心)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(五、民宿服务)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(六、订单服务)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(七、支付服务)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(八、各种队列)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 微服务从代码到k8s部署应有尽有系列(九、事务精讲)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
随机推荐
- 不用find,怎样递归地给目录设置700,给文件设置600权限?
https://stackoverflow.com/questions/36553701/how-to-set-permissions-recursively-700-for-folders-and- ...
- spring boot + thymeleaf +security自定义规则 的简单使用
1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...
- Standalone集群搭建和Spark应用监控
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815920501530034696/ 承接上一篇文档<Spark词频前十的统计练习> Spark on ...
- Servlet简单实现开发部署过程
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512008683445027331/ 主要是从下面三个步骤实现我们的预期: (1)构建开发环境: (2)开发Ser ...
- LR12解决不能打开webTours服务问题
启动the webtours apache server时提示:设置使用服务器IP地址相关信息. 解决办法: 找到LR安装目录,如:D:\LoadRunner\WebTours\conf 找到http ...
- 【刷题-LeetCode】199 Binary Tree Right Side View
Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...
- 【小测试】使用腾讯云上的群集版redis
具体的文档请见:https://cloud.tencent.com/document/product/239/3205 群集版本相当于很多个redis进程构成一个群集,最大支持128个分片(猜测分片就 ...
- 观察者模式(Observer模式)
模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型- ...
- java关键字final
//继承弊端:打破了封装性 /* * final关键字: * 1,final是一个修饰符,可以修饰类,方法,变量. * 2,final修饰的类不可以被继承. * 3,final修饰的方法不可以被覆盖. ...
- Kubernetes:Pod基础知识总结
Blog:博客园 个人 官方文档详尽介绍了Pod的概念. 概念 Pods are the smallest deployable units of computing that you can cre ...