NCC CAP 6.2 版本正式發布

原文:https://www.cnblogs.com/savorboard/p/cap-6-2.html

作者:楊曉東

前言

今天,我們很高興宣布 CAP 發布 6.2 版本正式版,在這個版本中我們主要做了一些功能優化,以及針對目前已經發現的幾個 BUG 進行了修復了。

那么,接下來我們具體看一下吧。

d166980c4e2161fbcf65d8a6fa483b34.png

總覽

可能有些人還不知道 CAP 是什么,老規矩來一個簡介。

CAP 是一個用來解決微服務或者分布式系統中分布式事務問題的一個開源項目解決方案(https://github.com/dotnetcore/CAP)同樣可以用來作為 EventBus 使用,該項目誕生于2016年,目前在 Github 已經有超過 5500+ Star 和 70+ 貢獻者,以及在 NuGet超 250 萬的下載量,并在越來越多公司的和項目中得到應用。

如果你想對 CAP 更多了解,請查看我們的 官方文檔。

本次在 CAP 6.2 版本中我們主要帶來了以下新特性:

  • Dashboard 添加中文支持

  • 事務對象更友好的對接第三方ORM

  • 消費執行消息頭記錄 InstanceId

  • 啟動時對位于相同組的訂閱者進行警告

  • BUG 修復

    • Snowflake Id 算法生成時排除虛擬,回環和禁用的網卡

    • 修復 RabbitMQ 丟失連接并快速恢復時的健康檢測Bug。

    • 修復 Dashboard 代理查詢缺失 QueryString 的問題。

    • 修復 MongoDB 查詢元素未注冊不返回結果的Bug。

    • 修復 Scoped 生命周期工廠模式注冊的訂閱者報錯的Bug。

Dashboard 添加中文支持

我們在 5.1.1 版本中使用 Vue 重構了我們的 Dashboard,由于時間原因,我們的新版本的 Dashboard 只對英文提供了支持。

在該版本中我們重新提供了對中文的支持,目前可自動根據你的瀏覽器檢測使用的語言并展示。

你也可以在右上方進行手動切換。

b5465e53af8d2433d7240023542ea81e.png
img

感謝 @tetris1128 對此提交的PR!

事務對接第三方 ORM 更加友好

在 CAP 中,事務對象需要交給 CAP 進行提交從而在事務實現提交后對緩存消息到 Broker 的 Flush 動作,而目前的Orm大部分都有自己的事務管理對象進行事務的提交。CAP官方直接原生支持使用 ADO.NET 和 EntityFrameworkCore 進行事務集成,而對于第三方ORM則需要自行擴展。

在本版本中,我們做了一個小調整(將 CapTransactionBase 中的 DbTransaction 設置為了 Virtual),沒想到這個小調整讓我們對第三方ORM的兼容性得到了大大增強,現在第三方ORM可以更加友好的對接CAP。

以下是2個第三方ORM的集成示例:

  • FreeSql Repository+UnitOfWork 事務模式 和 CAP 的 集成

  • Chloe Orm 和 CAP 的集成

示例:與 FreeSql 集成

FreeSql Repository+UnitOfWork 事務模式 和 CAP 的 集成示例如下:

public?class?FreeSqlRepositoryPatternTransaction?:?CapTransactionBase
{public?FreeSqlRepositoryPatternTransaction(IDispatcher?dispatcher,?IUnitOfWork?uow)?:?base(dispatcher){Uow?=?uow;}public?IUnitOfWork?Uow?{?get;?}public?override?object??DbTransaction?=>?Uow.GetOrBeginTransaction();public?override?void?Commit(){Uow.Commit();Flush();}public?override?Task?CommitAsync(CancellationToken?cancellationToken?=?default){throw?new?NotImplementedException();}public?override?void?Rollback(){Uow.Rollback();}public?override?Task?RollbackAsync(CancellationToken?cancellationToken?=?default){throw?new?NotImplementedException();}public?override?void?Dispose(){Uow.Dispose();}
}public?static?class?Extensions
{//?注意:你可以酌情修改此擴展以支持你的使用習慣public?static?ICapTransaction?BeginTransaction(this?IFreeSql?freeSql,ICapPublisher?publisher,?out?IRepositoryUnitOfWork?uow,?bool?autoCommit?=?false){var?dispatcher?=?publisher.ServiceProvider.GetRequiredService<IDispatcher>();uow?=?freeSql.CreateUnitOfWork();var?transaction?=?new?FreeSqlRepositoryPatternTransaction(dispatcher,?uow){AutoCommit?=?autoCommit};return?publisher.Transaction.Value?=?transaction;}
}

使用發送帶有事務的消息。

[Route("~/with/test")]
public?IActionResult?WithTransaction()
{using?(var?transaction?=?_freeSql.BeginTransaction(_capBus,?out?var?uow,?false)){_capBus.Publish("sample.rabbitmq.mysql",?DateTime.Now);var?person?=?_freeSql.GetRepository<Person2>();person.UnitOfWork?=?uow;person.Insert(new?Person2()?{?Name?=?"HelloWorld2"?});transaction.Commit();}return?Ok();
}

你可以在這里查看到 FreeSql DbContext 事務模式的對接方式。

示例:與 Chloe 集成

Chloe Orm 和 CAP 進行集成如下:

public?class?ChloeTransaction?:?CapTransactionBase
{public?ChloeTransaction(IDispatcher?dispatcher,?IDbSession?session)?:?base(dispatcher){DbSession?=?session;??????}public?IDbSession?DbSession?{?get;?set;?}public?override?object??DbTransaction?=>?DbSession.CurrentTransaction;public?override?void?Commit(){DbSession.CommitTransaction();Flush();}public?override?Task?CommitAsync(CancellationToken?cancellationToken?=?default){throw?new?NotImplementedException();}public?override?void?Rollback(){DbSession.RollbackTransaction();}public?override?Task?RollbackAsync(CancellationToken?cancellationToken?=?default){throw?new?NotImplementedException();}public?override?void?Dispose(){(DbTransaction?as?IDisposable)?.Dispose();}
}public?static?class?Extensions
{public?static?ICapTransaction?BeginTransaction(this?IDbContext?dbContext,ICapPublisher?publisher,?bool?autoCommit?=?false){?var?dispatcher?=?publisher.ServiceProvider.GetRequiredService<IDispatcher>();dbContext.Session.BeginTransaction();var?transaction?=??new?ChloeTransaction(dispatcher,dbContext.Session){AutoCommit?=?autoCommit};return?publisher.Transaction.Value?=?transaction;}
}

發送帶有事務的消息:

[Route("~/with/test")]
public?IActionResult?WithTransaction()
{using?(_dbContext.BeginTransaction(_capBus,?true)){_dbContext.Insert(new?Person2()?{?Name?=?"HelloWorld"?});???????????_capBus.Publish("sample.rabbitmq.mysql",?DateTime.Now);}return?Ok();
}

相關鏈接:https://github.com/shuxinqin/Chloe/issues/328

消費執行消息頭記錄 InstanceId

某天的一個下午,我的同事告訴我他在使用CAP進行本地的消息調試的時候,消息已經被消費執行了,而且狀態也變成成功了,但是沒進他的VS斷點,他又說有時候又會進斷點,他不知道怎么回事,于是就把我叫過去了。

我過去看了一下,發現開發服務器上也部署的有應用,并且使用的同一個RabbitMQ,他的消息被線上部署的其他實例給消費掉了,所以沒進斷點。之所以有時候又進斷點則是因為消息是負載消費的,恰好又輪到了他本地。

基于以上原因,在這個版本中,我們在消費的消息頭中記錄了執行所在的 InstanceId,也就是機器的 Hostname,這樣在查看消息就很方便的知道消息是被哪個實例給消費掉了,便于排查問題。

啟動時對位于相同組的訂閱者進行警告

某天的一個下午,我的同事又找到了我,說他在使用CAP進行消費的時候,調試的VS斷點一直不進和上次不一樣的是這次始終進不了,但是消息又消費成功了,他找了半天也不知道怎么回事,于是就把我又叫過去了。

我過去看了一下,他沒有犯和上次一樣的錯誤。于是我檢查了一下,發現他在一個服務中弄了2個名稱一樣的訂閱者,并且使用的默認組。由于2個訂閱者位于不同的類中,所以他沒有發現。熟悉CAP的都知道,CAP 在啟動的時候由于進行了去重處理,所以只會使用其中的一個訂閱者,對于另外一個會忽略掉。

基于以上原因,在這個版本中,我們在啟動的時候進行了檢測,如果發現在一個組中有2個以上的同名訂閱者,我們會進行警告日志的打印進行提醒,但不會拋出異常來阻止你的啟動。

BUG 修復

在這個版本中,我們進行了一些已發現的BUG修復,下面是修復的內容項。

  • Snowflake Id 算法生成時排除虛擬,回環和禁用的網卡

  • 修復 RabbitMQ 丟失連接并快速恢復時的健康檢測Bug。

  • 修復 Dashboard 代理查詢缺失 QueryString 的問題。

  • 修復 MongoDB 查詢元素未注冊不返回結果的Bug。

  • 修復 Scoped 生命周期工廠模式注冊的訂閱者報錯的Bug。

總結

以上,就是本版本我們做出的一些支持和改動,感謝大家的支持,我們很開心能夠幫助到大家 。大家在使用的過程中遇到問題希望也能夠積極的反饋,幫助CAP變得越來越好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282624.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pdksh 包

安裝oracle gi&#xff0c;rac 時經常會碰到 pdksh 的檢測失敗&#xff0c;可以從這個網站下載需要的包 http://rpm.pbone.net/ rpm -q ksh-* rpm -e ksh-* rpm -ivh ./pdksh* 或者參考 Requirements for Installing Oracle 11gR2 RDBMS on RHEL6 or OL6 64-bit (x86-64) (文…

sysctl.conf工作原理

2019獨角獸企業重金招聘Python工程師標準>>> sysctl.conf工作原理 sysctl命令被用于在內核運行時動態地修改內核的運行參數&#xff0c;可用的內核參數在目錄/proc/sys中。它包含一些TCP/IP堆棧和虛擬內存系統的高級選項&#xff0c; 這可以讓有經驗的管理員提高引人…

CDN加速

一、CDN的概念 全稱是Content Delivery Network&#xff0c;即內容分發網絡。 其基本思路是: 盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節&#xff0c;使內容傳輸的更快、更穩定。 通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智…

修復刪除/var/lib/dpkg目錄后,無法使用apt-get命令問題

2019獨角獸企業重金招聘Python工程師標準>>> Unfortunately Ive deleted dpkg directory while removing the lock. By mistake I typed rootsam:~$ rm -r /var/lib/dpkgNow when I am trying to install/uninstall packages it shows me following error. E: Could…

動態加載vs靜態加載

動態加載&#xff1a; 1&#xff1a;靈活&#xff0c;可以在需要的時候用LoadLibrary進行加載&#xff0c;在不需要的時候用FreeLibrary進行卸載&#xff0c;這樣可以不必占用內存。2&#xff1a;可以在沒有dll時候發現&#xff0c;而不致程序報錯。3&#xff1a;加載程序中有條…

Webpack前端打包工具

一、安裝 安裝Webpack之前需要安裝nodejs&#xff0c;然后用npm安裝: $ npm install webpack -g &nsbp;運行以上命令就將Webpack安裝到了全局環境中。 但是通常我們會將Webpack只安裝到項目的依賴中: $ cd /www/webpack_demo1 // 進入項目目錄&#xff0c;確保該目錄…

動態語言靜態化

一、什么是動態語言靜態化 將現有PHP等動態語言的邏輯代碼生成為靜態html文件,用戶訪問動態腳本重定向到靜態html的過程 注 : 對實時性要求不高的頁面才適合去做動態語言靜態化 二、為什么要靜態化 1. 動態腳本通常會做邏輯計算和數據查詢,訪問量越大,服務器壓力越大 2. 訪…

WPF-06 樣式(Style)

在我們前面介紹資源的時候&#xff0c;我們提到了樣式表&#xff0c;如果你之前是做Web開發的&#xff0c;你會發現Style有點類似于Web中的CSS。控件級別樣式我們可以在控件級別定義自己的樣式&#xff0c;控件級別的樣式是優先級最高的<Window x:Class"Example_06.Sel…

構建Squid代理服務器-傳統代理、透明代理、反向代理

Squid是Linux系統中最常用的一款開源代理服務軟件&#xff0c;主要提供緩存加速和應用層過濾控制的功能&#xff0c;可以很好的實現HTTP、FTP、DNS查詢以及SSL等應用的緩存代理。 正向代理&#xff1a;根據實現的方式不同&#xff0c;代理服務可分為傳統代理和透明代理。 傳統代…

Struts2之初識

Struts2教程 第一章 初識Struts2 主頁&#xff1a;http://struts.apache.org/ 優勢&#xff1a;用戶請求&#xff0c;模塊處理&#xff0c;頁面展現。適用于企業級開發&#xff0c;便于維護。 配置&#xff1a;web.xml中添加的核心控制器 <filter> <filter-name>St…

數據庫緩存層

一 常見的緩存形式 : 1.文件緩存 (為了避免I/O開銷,盡量使用內存緩存) 2.內存緩存 二 為什么要使用緩存 緩存數據是為了讓客戶端很少甚至不訪問數據庫服務器進行的數據查詢,高并發下,能最大程度降低對數據庫服務器的訪問壓力 一般的數據請求: 用戶請求->數據查詢->…

python面試題~反射,元類,單例

1 什么是反射&#xff1f;以及應用場景&#xff1f; test.py def f1():print(f1) def f2():print(f2) def f3():print(f3) def f4():print(f4) a 1 復制代碼import test as ss ss.f1() ss.f2() print(ss.a) 復制代碼我們要導入另外一個模塊,可以使用import.現在有這樣的需求,我…

僅有50Mb大小的cli即可搞定大廠才能玩的CloudIDE丨SmartIDE

作者&#xff1a;徐磊&#xff0c;開源云原生SmartIDE創始人、LEANOSFT創始人/首席架構師/CEO&#xff0c;微軟最有價值專家MVP/微軟區域技術總監Regional Director&#xff0c;華為云最有價值專家。從事軟件工程咨詢服務超過15年時間&#xff0c;為超過200家不同類型的企業提供…

idea-spark-sbt 打包jar

1、打開idea下的terminal窗口 2、只打包部分項目 sbt insight-import/clean insight-import/assembly 這表示只打包主目錄下的insight-import項目 &#xff0c;先清理&#xff08;clean&#xff09;再打包&#xff08;assembly&#xff09;不能用package&#xff0c;這個不會打…

操作Checkbox標簽

在前端開發中&#xff0c;少不了對Checkbox的操作。 常用的的方法有2個&#xff1a;.is()和.prop()方法。前者是判斷 checkbox的狀態&#xff0c;選不是未選。而后者為checkbox設置一個值&#xff0c;可以設置checkbox是true還是false。寫個小例子&#xff0c;練習一下&#xf…

memcache在項目中的應用

一 安裝memcache 具體流程這篇文章有寫到: 點擊 鏈接 二 在項目中應用memcache 為了減輕數據庫的查詢壓力,所以我們把一些不經常變動的數據進行緩存,用戶查詢時,如果查詢的要求是一樣的,我們就memcache緩存中讀取數據并返回去,如果查詢要求變了,我們再到數據庫中查詢,并將查…

點擊回退按鈕刷新頁面

瀏覽器用戶返回上一步&#xff0c;自動刷新window.οnunlοadfunction(){} 這個最簡單粗暴 方式一、<input type"hidden" id"refreshed" value"no"><script type"text/javascript">οnlοadfunction(){var edocument.getE…

Dapr 證書過期了怎么辦? 別慌,有救!

一、背景Dapr 默認證書有效時間是1年&#xff0c;證書過期后就不能執行相關控制面和數據面的交互了&#xff0c;如下圖&#xff1a;二、查看證書有效時間通過dapr mtls expiry 看到期時間&#xff0c;具體參見命令https://v1-7.docs.dapr.io/reference/cli/dapr-mtls/dapr-mtls…

python數據類型之間的轉換

對python內置的數據類型進行轉換時&#xff0c;可以使用內置函數&#xff0c;常用的類型轉換函數如下 python常用類型轉換函數函數格式使用示例描述int(x [,base])int("8") 可以轉換的包括String類型和其他數字類型&#xff0c;但是會丟失精度 float(x) float…