1 介绍
1.1 .NET Core 介绍
.NET Core是.NET的跨平台版本,用于构建网站,服务和控制台应用程序。具有以下特性:
跨平台: 可在 Windows、macOS 和 Linux 操作系统上运行。
跨体系结构保持一致: 在多个体系结构(包括 x64、x86 和 ARM)上以相同的行为运行代码。
兼容性: .NET Core 通过 .NET Standard 与 .NET Framework兼容。
ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。
.NET Core SDK包含.NET Core Runtime、ASP.NET Core Runtime和Desktop Runtime,其中.NET Core Runtime、ASP.NET Core Runtime均支持Linux ARM64,而Desktop Runtime仅支持Windows。
Github地址:https://github.com/dotnet
1.2 NisMES介绍
“乐石NisMES”系乐石团队在全面考察中国制造业发展状况的基础上,结合当前国内生产企业现状,自主研发设计的一套适应并满足智能制造信息化需求的整体解决方案。是基于准时制生产、柔性制造、全面质量管理、零库存、零故障等精益生产理念的MES系统。目前已在机械、电子、五金等离散制造行业及陶瓷行业的智能制造系统建设方面积累了丰富经验。帮助中国制造企业合理有效的解决制造业设备故障率高、生产周期长、产品质量低、库存过大这四个主要问题,通过各个模块下科学的管理模式和先进的信息化技术,提高企业的生产效率和市场竞争力,实现智能制造管理。
2 迁移概述
2.1 迁移分析
现状:
操作系统:windows server 2012
部署方式:IIS
应用框架:.NET Core 2.1
ORM框架:EF Core 2.1
数据库:Sql Server 2008 R2
缓存中间件:redis
分析:
操作系统:
考虑到使用许可问题以及鲲鹏cpu架构为ARM64V8,将操作系统由windows换成Ubuntu Server 18.04。
部署方式:
.NET Core 在Ubuntu中环境部署步骤较多,若直接安装,不方便之后的应用迁移,所以使用Docker作为部署方式。
应用框架:
查看dockerhub中ASP.NET Core Runtime 官方镜像,未找到 2.1版本的 linux arm64 镜像,而 3.1版本支持,ASP.NET Core Runtime将升级到3.1版本.
数据库:
Sql Server数据库换成 PostgreSQL。
ORM框架:
考虑到 EF Core 2.1升级到3.1版本中断功能,以及EF Core本就支持Postgres等主流数据库,故暂时不升级。
2.2 迁移建议
ARM64支持.NET Core 3.1及以上版本,本文使用.NET Core 3.1版本;操作系统建议使用Ubuntu 18.04版本,后续所有的操作都是基于Ubuntu 18.04。
表2-1 IIS迁移建议
组件 |
迁移建议 |
windows server 2012 |
Ubuntu Server 18.04 (ARM64V8) |
.NET Core 2.1 |
.NET Core 3.1 |
EF Core 2.1 |
EF Core 2.1暂不变更 |
redis |
Redis-暂不变更 |
SQL Server |
Postgre SQL |
2.3 迁移参考链接
.NetCore2.1项目升级到.NetCore3.1的一点记录
https://www.cnblogs.com/hunanzp/p/12508003.html
数据库架构迁移:使用EFCore的迁移功能
https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/?tabs=vs#create-a-migration
3 环境准备
3.1 操作系统
Ubuntu Server 18.04使用华为云鲲鹏镜像。
3.2 安装docker
请参照:https://www.huaweicloud.com/kunpeng/software/docker.html
4 NisMES 鲲鹏适配
4.1 应用框架升级到 .NET Core 3.1
4.1.1 项目文件调整(.csproj)
目标框架 改为 .NET Core 3.1
移除包 Microsoft.AspNetCore.App 的引用,这个会默认包含在框架中
添加包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的引用
注: .NET Core 3.0 已经从共享框架中删除了Newtonsoft.Json,并引入System.Text.Json 类库并作为默认JSON序列化包,为兼容已有功能需要引入Microsoft.AspNetCore.Mvc.NewtonsoftJson包。
4.1.2 Program.cs 文件调整
将IWebHostBuilder 改为IHostBuilder
将 Web 服务器的启动代码放到 ConfigureWebHostDefaults 中
4.1.3 Startup.cs 文件调整
ConfigureServices方法修改
Configure方法修改
将IHostingEnvironment 改为IWebHostEnvironment
参照:https://www.cnblogs.com/sanshi/p/11640318.html
4.2 数据库迁移
4.2.1 Docker中安装postgres
参照镜像说明
4.2.2 数据库架构迁移
使用EFCore的迁移功能
n 模型项目引入EFCore、Postgre相关的包
n DbContext数据库访问上下文类中指定的连接的数据库类型、连接字符串、包含一个无参构造函数,其他模式见 Design-time DbContext Creation;
n 执行Add-Migration命令,根据已定义的模型类(CodeFirst模式)生成db创建脚本
n 执行Update-Database命令,根据db创建脚本创建数据库
4.2.3 迁移sqlserver中的数据到postgres
使用工具navicat
4.3 安装redis
参照镜像说明
4.4 发布程序
n VS发布程序到本地目录
n 使用WinSCP上传程序文件到Ubuntu服务器
n 构建镜像
n 运行容器
5 问题解决
1、 数据库中字母大小写问题:
Postgres区分大小写,SqlServer不区分大小写,代码中应注意区分大小写,否则可能有查不到数据的问题;
2、 日期时间显示错误问题:
Docker容器中时区与宿主机不一致,dockerfile中要指定时区Asia/Shanghai,否则显示的日期时间可能不正确;
3、 文件路径问题:
linux中路径分割符为 / ,windows中路径分割符为 \,涉及路径拼接时不要直接使用/或\符号,而是使用 Path.Combine方法,否则可能会有找不到文件的问题;
4、 迁移数据架构时实体上注解问题:
实体上的形如 [Column(TypeName = "decimal(18, 6)")] 这种注解应去除,否则生成数据库表结构时可能失败(不同数据库类型可能不同);