<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微服務(wù)從代碼到k8s部署應(yīng)有盡有系列(二、網(wǎng)關(guān))

          共 4497字,需瀏覽 9分鐘

           ·

          2022-03-02 23:45

          我們用一個系列來講解從需求到上線、從代碼到k8s部署、從日志到監(jiān)控等各個方面的微服務(wù)完整實(shí)踐。

          整個項(xiàng)目使用了go-zero開發(fā)的微服務(wù),基本包含了go-zero以及相關(guān)go-zero作者開發(fā)的一些中間件,所用到的技術(shù)?;臼莋o-zero項(xiàng)目組的自研組件,基本是go-zero全家桶了。

          實(shí)戰(zhàn)項(xiàng)目地址:https://github.com/Mikaelemmmm/go-zero-looklook

          1. go-zero 網(wǎng)關(guān)概念

          go-zero架構(gòu)往大的說主要由兩部分組成,一個是api,一個是rpc。api主要是http對外訪問的,rpc主要就是內(nèi)部業(yè)務(wù)交互使用的是protobuf+grpc,當(dāng)我們項(xiàng)目體量還不大的時候,我們可以使用api來做一個單體項(xiàng)目,等后續(xù)量上來之后,可以拆分到rpc做微服務(wù),從單體轉(zhuǎn)向微服務(wù)十分容易,很像java的springboot轉(zhuǎn)向springcloud,非常方便。

          api被很多同學(xué)理解成了網(wǎng)關(guān),實(shí)際意義上來說當(dāng)你的項(xiàng)目在使用go-zero做微服務(wù)時候,你把a(bǔ)pi當(dāng)成網(wǎng)關(guān)也沒什么大的問題,不過這樣做導(dǎo)致的問題就是一個api對應(yīng)后面多個rpc,api充當(dāng)了網(wǎng)關(guān),這樣如果我在更新后續(xù)業(yè)務(wù)代碼時候,更新任何業(yè)務(wù)都要去改動這個api網(wǎng)關(guān),比如我只是改了一個小小的不起眼的服務(wù),那就要重新構(gòu)建整個api,這樣不太合理,效率極低也很不方便。所以,我們只是把a(bǔ)pi當(dāng)成一個聚合服務(wù),可以拆分成多個api,比如用戶服務(wù)有用戶服務(wù)的rpc與api,訂單服務(wù),有訂單服務(wù)的rpc與api,這樣當(dāng)我修改用戶服務(wù)時候,我只需要更新用戶的rpc與api,所有的api只是用來聚合后端rpc的業(yè)務(wù)。那有的同學(xué)就會說,我總不能每個服務(wù)解析個域名對應(yīng)你的api吧,當(dāng)然不能,這時候api前面就要有一個網(wǎng)關(guān)了,這個網(wǎng)關(guān)才是真正意義上的網(wǎng)關(guān),比如我們常說的nginx、kong、apisix,很多微服務(wù)都內(nèi)置了網(wǎng)關(guān),比如springcloud提供了springcloud-gateway , go-zero沒有提供,實(shí)際也用不著單獨(dú)去寫一個網(wǎng)關(guān),市面上的網(wǎng)關(guān)已經(jīng)夠多了,go-zero官方在曉黑板中用的nginx足夠用了,當(dāng)然你如果更熟悉kong、apisix都可以替換,本質(zhì)上沒什么不一樣的,只是一個統(tǒng)一流量入口,統(tǒng)一鑒權(quán)等。

          2. nginx網(wǎng)關(guān)

          【注】:在看這里的時候,建議先看一下前一節(jié)的業(yè)務(wù)架構(gòu)圖

          本項(xiàng)目中實(shí)際也使用了nginx做為網(wǎng)關(guān),使用nginx的auth_request模塊作為統(tǒng)一鑒權(quán),業(yè)務(wù)內(nèi)部不做鑒權(quán)(設(shè)計(jì)到資產(chǎn)的最好業(yè)務(wù)內(nèi)部做二次鑒權(quán),主要多一層安全),nignx的網(wǎng)關(guān)配置在項(xiàng)目的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;
          }
          }

          容器內(nèi)部nginx端口是8081,使用docker暴露出去8888映射端口8081,這樣外部通過8888來訪問網(wǎng)關(guān),使用location來匹配每個服務(wù),當(dāng)然會有人說,每加一個api服務(wù)都要來nignx配置太麻煩,你也可以使用confd統(tǒng)一配置,自行百度。

          3. 舉例

          當(dāng)我們在訪問用戶服務(wù)時候, http://127.0.0.1:8888/usercenter/v1/user/detail , 訪問了外部端口8888,然后映射到nginx內(nèi)部looklook網(wǎng)關(guān)8081上,然后location匹配到了/usercenter/ ,在該模塊開始有一行 auth_request /auth, 所以nginx不會直接去請求http://usercenter-api:8002 , 而是會先跳到 location /auth 模塊中,auth模塊會訪問 http://identity-api:8001/identity/v1/verify/token; ,identity-api也是我們內(nèi)部的服務(wù),是由我們自己寫的鑒權(quán)服務(wù),實(shí)際也是用的go-zero的jwt

          進(jìn)入identity-api 只做了2件事情(具體可以看looklook項(xiàng)目中的identity-api代碼)

          1、判斷當(dāng)前訪問的路由(usercenter/v1/user/detail )是否需要登錄。這里的路由是否需要登錄,可以在identity-api中配置,代碼已經(jīng)實(shí)現(xiàn)好了。

          2、解析傳遞的token到header中

          • 如果當(dāng)前訪問的路由需要登錄:
            • token解析失?。壕蜁祷亟o前端http401錯誤碼;
            • token解析成功:就會將解析出來的userId放入header的x-user中返回給auth模塊,auth模塊會把header傳遞給對應(yīng)訪問的服務(wù)(usercenter), 這樣我們在usercenter直接就可以拿到該登陸用戶的id了
          • 如果當(dāng)前訪問的路由不需要登錄:
            • 如果token校驗(yàn)失?。悍祷豩ttp401;
            • 如果token校驗(yàn)成功:就會將解析出來的userId放入header的x-user中返回給auth模塊,auth模塊會把header傳遞給對應(yīng)訪問的服務(wù)(usercenter), 這樣我們在usercenter直接就可以拿到該登陸用戶的id了
            • 前端header中傳遞了token
            • 前端header中沒傳遞token:userid 會傳遞 0 給后端服務(wù)

          4、總結(jié)

          這樣我們就可以統(tǒng)一入口,統(tǒng)一鑒權(quán),也可以統(tǒng)一收集日志上報(bào),用作錯誤分析,或者訪問用戶的行為分析。因?yàn)槲覀內(nèi)粘ginx用的比較多,也比較熟悉,如果各位同學(xué)對kong、apisix比較熟悉,在了解了上方go-zero使用網(wǎng)關(guān)的概念就可以直接替換也是一樣的。

          項(xiàng)目地址

          https://github.com/zeromicro/go-zero

          歡迎使用 go-zerostar 支持我們!



          推薦閱讀



          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù)?ebook?獲??;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 52
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操你啦在线 | 青青草视频手机华人 | 日韩黄片 | 亚洲最大在线观看视频 | 亚洲国产日韩在线 |