去年.NET Conf China 技术大会上,我给大家分享了主题《轻松玩转.NET大规模版本升级》,今天把具体分享的内容整理成一篇博客,供大家研究参考学习。

一、先说一下技术挑战和业务背景

我们公司:特来电新能源股份有限公司:中国最大最强新能源汽车充电网运营商,主要从事新能源汽车充电网的建设、运营以及互联网增值服务。

基于.NET技术栈,团队通过七年的迭代演进,搭建了一个分布式、微服务、高可用的互联网技术平台,全面支撑了特来电充电业务的大规模应用。

目前,我们面临的技术挑战有:

  1. 大型分布式、微服务、云原生应用,新能源行业最大的互联网应用

  2. 服务于全国的电动汽车车主,系统的稳定性要求非常高:SLA 99.99% ,系统全年可允许宕机时间只有52.56分钟

  3. 现有技术平台需要快速支撑整个充电网的快速、上量发展!

通过打造一个互联网技术平台,全面支撑赋能公司的业务发展:

二、.NET技术栈及版本升级选择

   1. 先看一下我们互联网技术平台的技术架构全景图

2. 整个互联网技术平台背后的.NET技术栈和开源技术

  3. 目前系统的应用规模

   4. .NET版本选择及升级策略

  • .NET Framework4.5.1 这个版本是线上最主要的版本,2015年开始一直沿用到现在

  • 2020年正式全面迁移.NET Core3.1(LTS版本)

  • 业务代码无法全部停下来,迁移升级.NET Core 3.1

  • 迁移策略:逐步试点,逐个上线,非核心业务-新业务-核心业务

  • 线上要长期、同时支持.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统一后的第一个大版本,部分功能不完善,目前看是一个过渡版本。

  • 2022年:整体升级迁移到.NET 6(LTS)

.NET 升级策略的设计

  • 开发时:技术平台的代码统一使用.NET Standard,同时支持.NET Framework4.5.1和.NET Core 3.1 业务代码的引用

  • 运行时:.NET Framework4.5.1和.NET Core代码并存,技术平台提供对应两个版本的.NET CLR运行时,支持相互调用

三、.NET线上大规模升级实践分享

   1. 整体升级步骤

    

   2. 先梳理NuGet包,确定各板块应用.NET Core升级顺序

       

    3. 底层技术平台先升级.NET Core

     3.1 一套代码同时支持.NET Framework和.NET Standard

同时兼容.NET Framework和.NET Standard

同时兼容2个版本,不需要代码同步

示例一个多Target Framework的项目工程设计

示例一下代码支持多版本.NET

3.2 NuGet包同时支持.NET Framework和.NET Standard

价值:
同时兼容.NET Framework和.NET Standard
兼容现有代码引用,减少对引用方的影响

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作为数据访问组件,社区早已不在维护,升级.NET Core我们做了哪些改造?

替换System.Web.HttpContextiBatis.net针对asp.net应用提供了HybridWebThreadSessionStore,通过HttpContext存储每个http请求线程访问数据库的上下文。由于ASP.Net Core不再提供直接获取HttpContext的方法,取而代之的是提供IHttpContextAccessor接口,并通过注册HttpContextAccessor来获取,因此在sqlmap初始化时,将获取HttpContext的委托方法传到HybridWebThreadSessionStore,使得每次ibatis.net需要获取HttpContext时,都会从HttpContextAccessor中拿到。

替换System.Runtime.Remoting.Messaging.CallContextiBatis.net针对非web的应用也提供了CallContextSessionStore,通过CallContext来维护每个线程访问数据库的上下文。但.net core不再提供CallContext类,因此需要将CallContext替换为AsyncLocal类型的字典集合。Emit动态生成程序集相关改动。

对于一些使用Emit动态生成程序集的操作,例如DefineDynamicAssembly,由于原AppDomain中已经不再支持,需要进行一些相应的类的调整。

 4、业务服务升级.NET Core

 5、.NET Framework和.NET Core并行、兼容运行,线上逐步升级

技术平台层面:通过HTTP和TCP协议适配,实现微服务在.NET Framework和.NET Core下并行、兼容运行

大规模升级步骤:非核心业务-新业务-核心业务,逐个系统升级、上线

四、未来技术规划

   全面升级.NET 6, 构建下一代云原生架构的互联网技术平台

以上是2021年.NET Conf China 技术大会上,我给大家分享了主题《轻松玩转.NET大规模版本升级》的主要内容。视频可以通过思否的进行回顾:https://ke.segmentfault.com/course/1650000041122988/section/1500000041123033

2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级相关推荐

  1. 志愿者招募 | 2021 .NET Conf China

    回顾往届 .NET Conf China 活动 志愿者团队承担着非常重要的职责 参与到活动组织和安排过程的方方面面 志愿者的团队协作和专业素养 展示出了高度的凝聚力和号召力 无私付出和敬业得到了多方的 ...

  2. 2021.NET Conf China上的GraphQL

    今天给大家分享.NET中的GraphQL,半个小时,没有把所有的代码敲出来,高估了自己的写码速度,所以通过这个文章分享出来. 1.核心PPT 2.主要代码 using Conf2021GraphQL; ...

  3. 干货分享丨轻松玩转 Huawei LiteOS 传感框架

    摘要:LiteOS传感框架将物联网终端设备上不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到"硬件"无关性,非常方便于物联网设备的开发.维护和功能扩展. ...

  4. 杂项设备驱动框架_干货分享丨轻松玩转 Huawei LiteOS 传感框架

    摘要:LiteOS传感框架将物联网终端设备上不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到"硬件"无关性,非常方便于物联网设备的开发.维护和功能扩展. ...

  5. 讲师征集| .NET Conf China 2021正式启动!

    去年年初 疫情突袭武汉,打得我们措手不及 在众多 .NET 开发者们的殷切期盼声中 一场轰动极客圈的技术狂欢趴 毅然在苏州盛大开启.圆满落幕! 我们坚信,你还记忆犹新-- ▽ 因为,TA 是 .NET ...

  6. 2021年10月24日马丁加德纳聚会线上主题分享开启通知

    早点关注我,精彩不错过! 一年一度的Martin Gardner趣味数学盛会又要在本周末如期而至了!今年MatheMagician会继续参加并带来最新的数学魔术主题分享! 快点收藏会议地址,定好闹钟来 ...

  7. .NET Conf China 2022 第一批讲师阵容大揭秘!整个期待了!

    目光看过来 2022年12月3-4日 一场社区性质的国内规模最大的 线上线下.NET Conf 2022技术大会 即将盛大开幕 目前大会正紧锣密鼓地进行中 第一批大咖讲师及主题已确定 小编迫不及待想和 ...

  8. 福利好礼现金大奖等你来→首届 .NET Conf China Hackathon 火热报名中!

    .NET 开源以来越来越多的开发者和企业开始加入到 .NET 的生态..NET 6 是 .NET Framework,  .NET Core 和 Mono 三个平台完成融合的第一个长期支持版本,无论你 ...

  9. .NET Conf China 2020志愿者招募火热开启!还有神秘惊喜等你来领…

    距.NET Conf China 2020 2020 中国 .NET 开发者大会 开幕还有14天 作为.NET的组织者之一 我们已经为这个活动准备铺垫了很久 但为了保证活动方方面面的质量 为了给现场& ...

最新文章

  1. TensorRT和PyTorch模型的故事
  2. gcc可以编译python程序吗_gcc c语言编译流程
  3. linux存储实用程序,技术|使用 Linux 实用程序 gPhoto2 备份手机存储
  4. 软件需求分析--三步走
  5. od 追踪_裁判员行为规范【基本功】——追踪裁判违例宣判练习 /五秒违例
  6. HDU 6070 Dirt Ratio(线段树、二分)
  7. 网鼎杯2020 朱雀部分writeup
  8. linux 计划任务格式,linux crontab 定时任务格式和使用方法2019-01-13
  9. 全新Linux+Python高端运维班第一次作业
  10. ASP.NET3.5下的MSChart图表控件使用
  11. 二十七、oracle 异常
  12. 为什么我们要使用图嵌入?
  13. iOS-常用的第三方库以及实例
  14. [思维导图学习六] 常用的思维导图软件
  15. c语言中千分号的用法,在ChemDraw中输入千分号的教程
  16. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核
  17. java中取值保留小数点后两位的四种方法
  18. 安装程序无法自动安装 Virtual Machine Communication Interface Sockets (VSock) 驱动程序,必须手动安装此驱动程序
  19. 这些国外支付方式,你都听过或用过吗?
  20. js 解析多层json字符串

热门文章

  1. 1.8-zabbix服务端安装
  2. 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!...
  3. MFC中的文件读写技术
  4. unreal无损音乐百度云_将网易云音乐专用的无损音乐格式转换成全平台通用的无损格式...
  5. phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
  6. ligerUI的列头合并代码片段
  7. c#调用存储过程查询表并返回影响的行数
  8. 【转】js老生常谈之this,constructor ,prototype
  9. 对于 APM 用户的一次真实调查分析(下)
  10. jquery获取文档高度和窗口高度的例子