2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级
去年.NET Conf China 技術(shù)大會上,我給大家分享了主題《輕松玩轉(zhuǎn).NET大規(guī)模版本升級》,今天把具體分享的內(nèi)容整理成一篇博客,供大家研究參考學習。
一、先說一下技術(shù)挑戰(zhàn)和業(yè)務(wù)背景
? ? 我們公司:特來電新能源股份有限公司:中國最大最強新能源汽車充電網(wǎng)運營商,主要從事新能源汽車充電網(wǎng)的建設(shè)、運營以及互聯(lián)網(wǎng)增值服務(wù)。
? ? 基于.NET技術(shù)棧,團隊通過七年的迭代演進,搭建了一個分布式、微服務(wù)、高可用的互聯(lián)網(wǎng)技術(shù)平臺,全面支撐了特來電充電業(yè)務(wù)的大規(guī)模應(yīng)用。
? ? 目前,我們面臨的技術(shù)挑戰(zhàn)有:
大型分布式、微服務(wù)、云原生應(yīng)用,新能源行業(yè)最大的互聯(lián)網(wǎng)應(yīng)用
服務(wù)于全國的電動汽車車主,系統(tǒng)的穩(wěn)定性要求非常高:SLA 99.99% ,系統(tǒng)全年可允許宕機時間只有52.56分鐘
現(xiàn)有技術(shù)平臺需要快速支撐整個充電網(wǎng)的快速、上量發(fā)展!
? ? ?通過打造一個互聯(lián)網(wǎng)技術(shù)平臺,全面支撐賦能公司的業(yè)務(wù)發(fā)展:
? ? ?
二、.NET技術(shù)棧及版本升級選擇
? ?1. 先看一下我們互聯(lián)網(wǎng)技術(shù)平臺的技術(shù)架構(gòu)全景圖
? ??
? ?2.?整個互聯(lián)網(wǎng)技術(shù)平臺背后的.NET技術(shù)棧和開源技術(shù)
? ?
? 3. 目前系統(tǒng)的應(yīng)用規(guī)模
? ? ??
? ?4.?.NET版本選擇及升級策略
.NET Framework4.5.1 這個版本是線上最主要的版本,2015年開始一直沿用到現(xiàn)在
2020年正式全面遷移.NET Core3.1(LTS版本)
業(yè)務(wù)代碼無法全部停下來,遷移升級.NET Core 3.1
遷移策略:逐步試點,逐個上線,非核心業(yè)務(wù)-新業(yè)務(wù)-核心業(yè)務(wù)
線上要長期、同時支持.NET Core 3.1和.NET Framework4.5.1
2022年計劃整體升級遷移到.NET 6
? ? ?為什么目前選擇了.NET Core 3.1 ?
.NET Core 3.1:LTS版本,微軟支持到2022年
.NET 5:非LTS版本,.NET 5是.NET統(tǒng)一后的第一個大版本,部分功能不完善,目前看是一個過渡版本。
2022年:整體升級遷移到.NET 6(LTS)
? ? ??
? ? ? ? .NET 升級策略的設(shè)計? ? ? ??
開發(fā)時:技術(shù)平臺的代碼統(tǒng)一使用.NET Standard,同時支持.NET Framework4.5.1和.NET Core 3.1 業(yè)務(wù)代碼的引用
運行時:.NET Framework4.5.1和.NET Core代碼并存,技術(shù)平臺提供對應(yīng)兩個版本的.NET CLR運行時,支持相互調(diào)用
? ? ? ?
三、.NET線上大規(guī)模升級實踐分享
???1. 整體升級步驟
? ??
? ?2.?先梳理NuGet包,確定各板塊應(yīng)用.NET Core升級順序
? ? ? ?
? ??3.?底層技術(shù)平臺先升級.NET Core
? ? ?3.1 一套代碼同時支持.NET Framework和.NET Standard
? ? ?同時兼容.NET Framework和.NET Standard
? ? ?同時兼容2個版本,不需要代碼同步
? ? ?示例一個多Target Framework的項目工程設(shè)計
? ? ?
? ? ?示例一下代碼支持多版本.NET
? ? ?
? ? 3.2 NuGet包同時支持.NET Framework和.NET Standard
價值:
同時兼容.NET Framework和.NET Standard
兼容現(xiàn)有代碼引用,減少對引用方的影響
? ? 3.3 同時兼容App.config和Web.Config文件
? ? ? 引用Nuget:System.Configuration.ConfigurationManager
? ? ? 兼容Web.Config文件中對配置的訪問。
? ? ??
? ??3.4 單元測試兼容App.config和Web.Config文件
? ? 單元測試情況下,在單元測試工程中增加了app.config文件,但是實際無法讀取其中的配置,原因是:
? ??MSTest?is?running?as?testhost.dll, which means that ConfigurationManager?is?reading settings?from?testhost.dll.config when executing under .NET core. It will look?for?testhost.dll.config?where?the testhost.dll?is?located?as?the accepted answer states. What?is?not mentioned?is?that it will also look?for?testhost.dll.config?in?the location?where?you have your test dlls
??
? ? 如何解決,大家可以參考這個連接:https://stackoverflow.com/questions/47752271/app-config-not-beeing-loaded-in-net-core-mstests-project/47753580
? ??3.5 MyBatis.NET 升級.NET Core
? ? MyBatis.NET作為數(shù)據(jù)訪問組件,社區(qū)早已不在維護,升級.NET Core我們做了哪些改造?
? ??替換System.Web.HttpContextiBatis.net針對asp.net應(yīng)用提供了HybridWebThreadSessionStore,通過HttpContext存儲每個http請求線程訪問數(shù)據(jù)庫的上下文。由于ASP.Net Core不再提供直接獲取HttpContext的方法,取而代之的是提供IHttpContextAccessor接口,并通過注冊HttpContextAccessor來獲取,因此在sqlmap初始化時,將獲取HttpContext的委托方法傳到HybridWebThreadSessionStore,使得每次ibatis.net需要獲取HttpContext時,都會從HttpContextAccessor中拿到。
? ??替換System.Runtime.Remoting.Messaging.CallContextiBatis.net針對非web的應(yīng)用也提供了CallContextSessionStore,通過CallContext來維護每個線程訪問數(shù)據(jù)庫的上下文。但.net core不再提供CallContext類,因此需要將CallContext替換為AsyncLocal類型的字典集合。Emit動態(tài)生成程序集相關(guān)改動。
? ??對于一些使用Emit動態(tài)生成程序集的操作,例如DefineDynamicAssembly,由于原AppDomain中已經(jīng)不再支持,需要進行一些相應(yīng)的類的調(diào)整。
?4、業(yè)務(wù)服務(wù)升級.NET Core
??
?5、.NET Framework和.NET Core并行、兼容運行,線上逐步升級
? ? ?技術(shù)平臺層面:通過HTTP和TCP協(xié)議適配,實現(xiàn)微服務(wù)在.NET Framework和.NET Core下并行、兼容運行
? ? ?大規(guī)模升級步驟:非核心業(yè)務(wù)-新業(yè)務(wù)-核心業(yè)務(wù),逐個系統(tǒng)升級、上線
? ? ?
四、未來技術(shù)規(guī)劃
? ?全面升級.NET 6, 構(gòu)建下一代云原生架構(gòu)的互聯(lián)網(wǎng)技術(shù)平臺
? ?
? 以上是2021年.NET Conf China 技術(shù)大會上,我給大家分享了主題《輕松玩轉(zhuǎn).NET大規(guī)模版本升級》的主要內(nèi)容。視頻可以通過思否的進行回顧:https://ke.segmentfault.com/course/1650000041122988/section/1500000041123033
總結(jié)
以上是生活随笔為你收集整理的2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 实现人脸检测
- 下一篇: Nginx负载均衡+转发策略