Abp + Grpc 如何實現用戶會話狀態傳遞

2021-01-15 dotNET跨平臺
0.背景

在實際項目當中,我採用的是 Abp 框架,但是 Abp 框架官方並沒有針對 Grpc 進行模塊封裝。基於此我結合 Abp 與 MagicOnion 封裝了一個 Abp.Grpc 模塊,它包括服務端和調用端兩部分的包。通過這兩個包,你可以很方便地在 Abp 框架當中集成 Grpc 實現服務內部通訊。

但是在實際使用當中會出現一個問題,當 A 服務調用 B 服務的時候,A 服務當前登錄用戶為 admin,調用 B 服務的 IAbpSession 的值仍然為空,這個時候當 B 服務內部實現使用了 IAbpSession 時會出現問題。

這是因為通過 Grpc 接口調用時,並沒有傳遞諸如 Token 之類的東西,而在 B 服務內部的 IAbpSession 本身附加的數據是從 HttpContext 裡面獲取的,所以 B 服務當前是沒有用戶狀態的。

1.解決

所幸 IAbpSession 提供了一個 Use 方法,通過這個方法我們可以臨時地改變 IAbpSession 內部的值,當 。定義如下:

IDisposable Use(int? tenantId, long? userId);

使用方法如下:

2.Grpc 接口改造

這裡 Abp.Grpc 庫使用的是 MagicOnion 庫實現 Grpc 接口的,底層序列化使用的是 MessagePack,速度也不比 Protocol Buffer 差。


2.1 服務定義

服務定義接口時,必須附加一個 GrpcSession 參數,這個參數用於調用方傳遞其 IAbpSession 值所使用。例如我有一個接口方法如下,用於返回服務方接收到的用戶 Id 值。

2.2 服務提供方

服務提供方在實現 ITestGrpcService 的時候,需要在代碼起始點就開始使用 using 語句包裹代碼。

2.3 服務調用方

服務調用方則直接在調用 Grpc 接口的時候,傳遞給接口當前服務的 Session 狀態。

2.4 最後的效果

當客戶端調用 GRPC 接口時,會將自身的 Session 狀態通過 GrpcSession 傳遞到服務端,這樣服務端就能夠共享客戶端的繪畫狀態。


3.Abp.Grpc 項目地址

Abp.Grpc 庫地址:https://github.com/GameBelial/Abp.Grpc


4.實現的 DEMO 地址

服務端:https://github.com/GameBelial/Abp.Grpc.Server.Demo

客戶端:https://github.com/GameBelial/Abp.Grpc.Client.Demo

原文地址:https://www.cnblogs.com/myzony/p/9454612.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

相關焦點

  • dubbogo 3.0:牽手 gRPC 走向雲原生時代
    gRPC 協議,簡單來說就是 http2 協議的基礎之上,增加了特定的協議 header:「grpc-」 開頭的 header 欄位,採用特定的打解包工具(protobuf)對數據進行序列化,從而實現 RPC 調用。
  • Spring集成RabbitMQ簡單實現RPC
    RPC,AMQP協議定義了14中消息的屬性,其中兩項,一項是Replyto,表示返回消息的隊列,一個是correlationId 用來表示發送消息和返回消息的標誌,來區分是否是一個調用下面一步步來實現RPC首先貼出spring配置文件代碼<?
  • 您是否在為用戶會話正確使用JWT?
    您可能沒有聽說過,JWT最初是為在OAuth中使用而設計的—與用戶會話根本不同。儘管JWT用於OAuth已被廣泛接受,但其用於驗證用戶會話的方法還是有爭議的(請參閱本帖子)。在本文中,我將嘗試全面介紹在這種情況下使用JWT的優缺點。由於開發人員(尤其是開發人員)經常有強烈的見解,因此我無意解決這場辯論。我只打算總結所有觀點。
  • 手擼rpc框架,並基於spring進行二次註解開發
    rpc_client:自定義rpc框架客戶端部分,實現了rpc客戶端部分邏輯。rpc_server:自定義rpc框架服務端部分,實現了rpc服務端部分邏輯。>將自定義的rpc框架整合到spring中。RpcServiceImpl服務端應用使用該註解標註api的實現類* 標註服務實現類,並將實現類添加到spring容器public @interface RpcServiceImpl {Class<?
  • 實戰|單點登錄系統原理與實現(全套流程圖+源碼)
    既然http協議無狀態,那就讓伺服器和瀏覽器共同維護一個狀態吧!這就是會話機制。3、登錄狀態有了會話機制,登錄狀態就好明白了,我們假設瀏覽器第一次請求伺服器需要輸入用戶名與密碼驗證身份,伺服器拿到用戶名密碼去資料庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記為「已授權」或者「已登錄」等等之類的狀態,既然是會話的狀態,自然要保存在會話對象中,tomcat在會話對象中設置登錄狀態如下
  • rpc蓋板攪拌機、rpc活性粉末混凝土攪拌機持續創新順應趨勢
    rpc蓋板攪拌機、rpc活性粉末混凝土攪拌機推薦科尼樂機械,由於設計結構非常合理,工作原理更是由於其他類型混凝土攪拌機,該機器立式筒行星運轉裝置,各種類型的混凝土一進入攪拌機中都能快速攪拌勻和。rpc蓋板攪拌機發揮充分的攪拌功能,產能更是和一般攪拌機無差別,攪拌精細度控制範圍大。rpc蓋板攪拌機rpc蓋板攪拌機將設備傳動裝置進行優化,使攪拌機在平穩的設備運轉下,提供高效的攪拌作用;rpc蓋板攪拌機卸料裝置進行偏心式設計,觸點式幹硬開關,減少磨損,提高強制式混凝土攪拌機的耐用性、可靠性。
  • 聊聊我開源RPC框架的那些事
    簡單吐槽一波,給大家聊聊關於 guide-rpc-framework[1] 的一些事情。我踏馬直接踢01 我的自定義 RPC 框架近況關注我的大部分小夥伴應該都知道,3 個月前,我利用業餘時間手寫一個簡單的 RPC 框架(玩具),名字叫做 guide-rpc-framework。
  • Cloudflare 宣布支持 gRPC
    gRPC 在大大提高效率的同時,其 HTTP/2 傳輸機制卻給部分用戶帶來暴露風險。Cloudflare 舉例,假設你是一個擁有上萬用戶的移動應用開發者,在用戶基數如此大的情況下,比起 JSON-REST 等較舊且效率較低的協議來說,gRPC 顯然是更好的選擇。但與此同時,暴露在網際網路上的端點也很可怕。
  • 單點登錄之如何平衡 Token 安全性和用戶體驗?
    圖 1上圖表示Access/Refresh Token在客戶端、認證伺服器、資源伺服器三者之間的傳遞關係,簡單來說:Access / Refresh Token如何使用?站在系統管理員的角度,我們很容易想到去管理用戶的會話行為。一般來說,可以通過設置Token過期時間、設置結束會話的行為、手動結束用戶會話這三種方式來管理用戶會話。
  • 有了HTTP,為什麼還要RPC?
    第三層:會話層。管理用戶的會話,控制用戶間邏輯連接的建立和中斷。 第四層:傳輸層。管理著網絡中的端到端的數據傳輸。 第五層:網絡層。定義網絡設備間如何傳輸數據。 第六層:鏈路層。將上面的網絡層的數據包封裝成數據幀,便於物理層傳輸。 第七層:物理層。
  • Twitter會話定位攻略看這一篇就夠了!
    二、Twitter會話定位如何獲取詳細信息當企業將滑鼠懸停在廣告系列設置中的Twitter會話定位主題上時,企業會看到一個包含以下信息的框:1.Twitter會話定位主題受眾的名稱2. Twitter會話定位受眾中用戶的描述3.
  • 5G邊緣計算之會話及業務連續性(SSC)介紹
    5G移動通信系統網絡架構如下圖所示:5G網絡相對於4G網絡最大的改進是徹底地實現了用戶面與控制面的分離,UPF作為唯一的用戶面網元,可根據業務需求靈活部署。如上圖中的UPF PSA1可以作為區域中心部署的業務錨點,用來滿足廣覆蓋的基本網際網路需求;UPF PSA2可以作為邊緣部署的本地業務錨點,用來滿足本地低時延、高可靠場景下的業務需求。
  • 通信網絡技術:RPC服務和HTTP服務的區別分析
    第三層:會話層。管理用戶的會話,控制用戶間邏輯連接的建立和中斷。 第四層:傳輸層。管理著網絡中的端到端的數據傳輸。 第五層:網絡層。定義網絡設備間如何傳輸數據。 第六層:鏈路層。將上面的網絡層的數據包封裝成數據幀,便於物理層傳輸。 第七層:物理層。這一層主要就是傳輸這些二進位數據。
  • 搜狗開源srpc:自研高性能通用RPC框架
    srpc除了自帶的sogou-std協議以外,還實現了baidu-std協議和thrift framed協議,因此srpc可以與thrift或brpc(連接池模式)互通。另外,接口描述文件支持protobuf和thrift,這意味著用戶不僅可以一鍵遷移基於protobuf或thrift作為IDL的項目,還可以用srpc作為一個性能更優的thrift框架或者brpc框架。
  • 有了HTTP 協議,為什麼還要 RPC 協議,兩者有什麼區別?
    第三層:會話層。管理用戶的會話,控制用戶間邏輯連接的建立和中斷。  第四層:傳輸層。管理著網絡中的端到端的數據傳輸。  第五層:網絡層。定義網絡設備間如何傳輸數據。  第六層:鏈路層。  比如我們有一個處理訂單的系統服務,先聲明它的所有的接口(這裡就是具體指 Java 中的 Interface),然後將整個項目打包為一個 jar 包,服務端這邊引入這個二方庫,然後實現相應的功能,客戶端這邊也只需要引入這個二方庫即可調用了。  為什麼這麼做?主要是為了減少客戶端這邊的 jar 包大小,因為每一次打包發布的時候,jar 包太多總是會影響效率。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理 | 深度
    設備管理可以實現TF設備異構的特性,支持CPU、GPU、Mobile等不同設備。網絡通信依賴gRPC通信協議實現不同設備間的數據傳輸和更新。第二層是Tensor的OpKernels實現。這些OpKernels以Tensor為處理對象,依賴網絡通信和設備內存分配,實現了各種Tensor操作或計算。
  • go-zero 1.1.2 發布,web 和 rpc 框架
    go-zero 是一個集成了各種工程實踐的 web 和 rpc 框架。通過彈性設計保障了大並發服務端的穩定性,經受了充分的實戰檢驗。go-zero 包含極簡的 API 定義和生成工具 goctl,可以根據定義的 API 文件一鍵生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代碼,並可直接運行。
  • 完整SIP/SDP媒體協商概論-SDP協商模式詳解-會話管理全解
    7、關於會話管理討論  前面的章節包括上一次筆者發布的文章中,筆者分別討論了offer和answer雙方的消息生成。這裡,筆者將討論會話的修改。修改會話是常見的業務場景,通過修改會話實現另外一個新的流程。在會話的某個點上,任何會話參與方都可以發出一個新的offer來修改會話的屬性參數。