去年.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大规模版本升级》的主要内容。

周国庆

2022/2/26

2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级的更多相关文章

  1. 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)

    作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...

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

    最近社区小伙伴们一直在为11月即将在武汉举办的 第三届.NET中国峰会而忙碌,社区活动官网设计和开发工作还在进行,我们在国庆节的前一天晚上向社区正式启动了活动的序幕,也就是我们确定好了举办地点.时间, ...

  3. 来啦来啦|开源 * 安全 * 赋能 - .NET Conf China 2022

    大会介绍 .NET Conf China 2022 是面向开发人员的社区峰会,延续 .NET Conf 2022 的活动,庆祝 .NET 7 的发布和回顾过去一年来 .NET 在中国的发展成果,它是由 ...

  4. 2019.NET Conf China(中国.NET开发者峰会)活动全纪录:.NET技术之崛起,已势不可挡

    一.微软走向开放与.NET Core的诞生 当今时代,气象更新,技术飞速发展. 当今时代,开发者大概是最优秀的群体.每一位开发者,无不奋勇向前,努力追寻时代的步伐,以大无畏的精神迎接挑战,紧跟大时代成 ...

  5. 【分享汇总】25个主题分享,360°领略OpenHarmony最新技术版图

    2021年10月,开放原子开源基金会旗下开源项目 OpenAtom OpenHarmony (以下简称"OpenHarmony") 应邀参加华为2021 HDC 开发者大会,并组织 ...

  6. Ubuntu Mac OS主题分享

    Ubuntu Mac OS主题分享 一直想搞一个Mac OS主题试试,结果很悲催,在网上搜索的Macbuntu主题在安装主题(macbuntu-os-themes-Its-v7)和 图标(macbun ...

  7. Hbuilder护眼主题分享

    sublime还有webstorm有很多主题,但是Hbuilder就相对较少,或者直接说基本没什么主题,在网上搜索了很久也很少有Hbuilder的主题分享,于是就自己取色调了一个仿的护眼主题来分享一下 ...

  8. 【转载】总结一下Android中主题(Theme)的正确玩法

    http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有& ...

  9. 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会

    最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...

随机推荐

  1. Numpy实现简单BP神经网络识别手写数字

    本文将用Numpy实现简单BP神经网络完成对手写数字图片的识别,数据集为42000张带标签的28x28像素手写数字图像.在计算机完成对手写数字图片的识别过程中,代表图片的28x28=764个像素的特征 ...

  2. Java中的常用类——Arrays

    数组工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,因此可以直接使用类名.方法名来调用,而不用通过new使用对象来调用(是"不用"不是 ...

  3. Win7升级Win11升级记录及教程 【错误码(0×8004242d)】

    hellow,大家好,我是公众号棱镜Prism K的[K君].家中电脑因为一些原因不得不进行升级,下面是我对这次电脑升级所进行的记录. step 1.打开微软官网,找到对应的WIN11下载模块,这里注 ...

  4. 【记录一个问题】go1.17中,把代码文件放在main.go的同级目录,导致无法编译

    写了类似目录结构的代码: myproxy - main.go - server.go 编译的时候总是出现main.go中找不到类型定义.但是用goland却可以直接执行. 最后调整了目录结构后解决: ...

  5. 返回值Student-Json

    MyController中 index.jsp 修改url

  6. Servlet-ServletConfig类使用介绍

    ServletConfig类(Servlet程序的配置信息类) Servlet 程序和 ServletConfig对象都是由 Tomcat负责创建,我们负责使用. Servlet 程序默认是第一次访问 ...

  7. c#开方,平方,sin函数计算

    平方运算 private double m; private double n=Math.Pow(m,2.0); 开平方运算 System.Math.Sqrt(数字); double保留两位小数 Ma ...

  8. Atcoder ARC-063

    ARC063(2020.7.16) A \(A\) 题如果洛谷评分很低就不看了. B 可以发现一定是选择在一个地方全部买完然后在之后的一个地方全部卖完,那么我们就只需要即一个后缀最大值就可以计算答案了 ...

  9. IIS部署.net core 的程序后,如何查看控制台的日志?

    .net core 3.1 开发的web服务,本地开发的时候,双击运行 xxx.exe(.net core 3.1 发布后,文件夹里面有一个 .exe 文件,双击即可运行,会直接监听本地 xx端口测试 ...

  10. JAVA多线程学习- 三:volatile关键字

    Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...