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

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

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

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

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

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

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

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

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

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

     4f7efd2ff1c054361f9e2cd484063477.png

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

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

    3e8e20d272010dfeadccab7ff7aa9d77.png

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

   0c449300fda712303ce01d4316f1c839.png

  3. 目前系统的应用规模

      e095bec91ca01b4c88c3205d9225f1c0.png

   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)

      cb656b6a4e91e153e8ea1cb9383740fd.png

        .NET 升级策略的设计        

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

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

       5e3a92a8eb17b1533b178777a0db214e.png

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

   1. 整体升级步骤

    0e2d7711e8ab6c1324974a02344f000e.png

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

       1e20e0d096562f1c2c7295a4d1fd5135.png

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

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

     同时兼容.NET Framework和.NET Standard

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

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

     8fbacb1402b590a127a7cd53bebf7e7f.png

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

     8a47119b522ba095912f0e0011eab5f2.png

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

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

    3.3 同时兼容App.config和Web.Config文件

      引用Nuget:System.Configuration.ConfigurationManager

      兼容Web.Config文件中对配置的访问。

      5bf699c321c04dd7eb51a998d61d076c.png

    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

  907cf825587babbae8820531d07ca1bd.png

    如何解决,大家可以参考这个连接: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

  ef29eb81bc4d7a0a8c75d5e22e8488a5.png

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

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

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

     9384fdd65a84e91b24d0f96698842253.png

四、未来技术规划

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

   a2da9f371385d1bf60be5ae9790faada.png

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

c631f931e13362499049c0da7a46d87c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU4462-稻草人

思想不难,代码不易,且敲且珍惜。 枚举的方式,假设有十个位置可以放稻草人,用二进制的形式转换一下,对每种情况判断是否全被覆盖,记录成功时稻草人的个数,每次比较选出最小的。 注意一个陷阱&…

OC-归档和解归档

1 //归档:将对象数据存储到文件的过程 NSArchiver2 //反归档:从文件中读取数据到对象中的过程3 4 int main(int argc, const char * argv[]) {5 autoreleasepool {6 7 #if 08 //使用系统的方法进行归档 NSArchiver9 NSDictionary *mutDic [NSMu…

推荐电影 奥黛丽赫本的十大经典电影 1953-1989

奥黛丽赫本的十部经典电影 1.《罗马假日》 (Roman Holiday,1953) 导演:威廉惠勒 风情指数★★★★★ 看点:奥黛丽赫本和格里高利派克的完美组合 如果没有奥黛丽赫本,或许《罗马假日》只会作为一部平庸…

C和C++之用extern “C“实现它们之间的互调

1、extern "C"的解释 一个C++程序包含其它语言编写的部分代码。C++编写的代码片段可能被使用在其它语言编写的代码中,不同语言编写的代码互相调用是困难的,甚至是同一种编写的代码但不同的编译器编译的代码。例如,不同语言和同种语言的不同实现可能会在注册变…

ASP.NET Core基于滑动窗口算法实现限流控制

前言在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力过大。而AspNetCoreRateLimit[1]是目前ASP.NET Core下最常用的限流解决方案。查看它的实现代码,我发现它使用…

android 资源文件获取啥退,重拾Android之路之获得各种资源文件的方法

引言通常我们会在项目中频繁获取color、raw、drawable、mipmap、string等资源文件。因此,今天整理下获取资源文件的工具类方法。最新通用方法ContextCompat.getColor(this,R.color.activity_bg);ContextCompat.getDrawable(this,R.drawable.leak_canary_icon);最近在…

linux操作系统cp命令

转载于:https://www.cnblogs.com/skl374199080/p/3863918.html

WPF将数据库和GridView绑定并更改GridView模板

首先来看一下如何使用GridView,在前台的话代码如下&#xff1a;这里仅仅举出一个例子&#xff0c;GridView是作为子项嵌套在ListView中的&#xff0c;这里的数据源是通过绑定的方式来绑定到GridView中的。 <ListView Margin"15,115,15,48" Name"lstProducts&…

sql必读的九本书

2019独角兽企业重金招聘Python工程师标准>>> 原文地址 直接上书(书籍以后会陆续加上去)书籍下载地址 《MySQL必知必会》《SQL学习指南&#xff08;第2版 修订版&#xff09;》《MySQL技术内幕——InnoDB存储引擎》《Redis设计与实现》《ZooKeeper&#xff1a;分布式…

C语言之加入头文件<stdbool.h>可以使用true和false

1、头文件<stdbool.h>介绍 &#xff08;1&#xff09;使用了<stdbool.h>后&#xff0c;可使用true和false来表示真假。 &#xff08;2&#xff09;在循环语句中进行变量声明是C99中才有的&#xff0c;因此编译时显式指明 gcc -stdc99 prime.c 2、最简单的例子 3、…

Nginx负载均衡+转发策略

负载均衡负载均衡(详解)https://cloud.tencent.com/developer/article/1526664--示例1upstream www_server_pool { server 10.0.0.5; server 10.0.0.6&#xff1a;80 weight1 max_fails1 fails_timeout10s; server 10.0.0.7&#xff1a;80 weight1 max_fails2 fails_timeo…

ftp 断点续传 Android,Android使用FTP实现断点续传

Android使用FTP实现断点续传断点续传指的是在下载或上传时&#xff0c;将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分&#xff0c;每一个部分采用一个线程进行上传或下载&#xff0c;如果碰到网络故障&#xff0c;可以从已经上传或下载的部分开始继续上传下载未…

教育行业的互联网焦虑症

2019独角兽企业重金招聘Python工程师标准>>> 文/阑夕 2007年&#xff0c;前新东方名师刘一男在新东方在线&#xff08;网校&#xff09;上的全年课程收入是三千元&#xff0c;四年之后的2011年&#xff0c;这个数字飙升到了四十万&#xff0c;已经和刘一男当年实体…

常见的几种RuntimeException

一般面试中java Exception&#xff08;runtimeException &#xff09;是必会被问到的问题常见的异常列出四五种&#xff0c;是基本要求。更多的。。。。需要注意积累了常见的几种如下&#xff1a;NullPointerException - 空指针引用异常ClassCastException - 类型强制转换异常。…

Android之Error: ‘L‘ is not a valid file-based resource name character解决办法

1、问题 Error:Execution failed for task :mergeBYODReleaseResources.> /home/chenyu/Android_dev/sangfor/yangzhoushizhenghu/20161229_M7.3_R3/EMM/Source/Android/aWork/res/drawable-mdpi/LOGO.png: Error: L is not a valid file-based resource name character: Fi…

零基础学人工智能:TensorFlow 入门例子

识别手写图片 因为这个例子是 TensorFlow 官方的例子&#xff0c;不会说的太详细&#xff0c;会加入了一点个人的理解&#xff0c;因为TensorFlow提供了各种工具和库&#xff0c;帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量&#xff08;Tenso…

TextView 多文字字体颜色及多事件监听

像微信朋友圈点赞功能如&#xff1a;张三、李四、王五、这种格式 最早做法是在layout中创建一个父类容器如linearlayout然后在创建一个子layout&#xff0c;在代码中 通过for循环addView添加到父类容器当中&#xff0c;虽然可以实现效果但是这样无形中会增加很多view控件。 通过…

CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发

自2010年以来&#xff0c;移动应用开发是非常热门的一个方向&#xff0c;从技术上我们经历了原生应用开发、基于 H5 的 Web App、混合模式的移动应用开发&#xff0c;再到跨平台移动应用开发。.NET 不仅是一个跨平台的应用&#xff0c;也是一个跨应用场景的平台。.NET的移动应用…

P2P网络穿越 NAT穿越

http://blog.csdn.net/mazidao2008/article/details/4933730 —————————————————————————————————————————————————————————————— 穿越NAT的意义&#xff1a; NAT是为了节省IP地址而设计的&#xff0c;但它隐藏了…

Eclipse之如何快速查看抽象函数实现

1、ctrl (open implementation) 2、ctrl T