.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你

随着2020进入4季度,.NET5正式版也已经与大家见面了。不过,尽管 .NET Core发布已经有四五年的时间,但到目前为止,依旧有很多.NET开发者在坚守者.NET4,原因不尽相同,但最大的问题可能还是不熟悉Linux,更别说在Linux服务器中部署.NET服务了。

而 .NET Core在飞速发展的这四五年里,微服务、云原生等概念也在飞速发展。.NET Core在微服务和云原生的场景下,也已日趋稳定,生态也在逐步完善,相信.NET5正式发布后,对于我们苦逼多年了的.NET开发者绝对是个机遇。所以,你还有什么理由继续坚守.NET4呢?笔者在开始使用 .NET Core时,在如何部署到Linux服务器上也是踩了挺多坑,顺便也总结了一些经验,在此分享给大家,如有更好方案,还望不吝赐教。


准备工作

  1. 操作系统。

操作系统可选择你比较熟悉的Linux发行版,如果你是第一次接触Linux,那我推荐使用CentOs,因为本文的内容都是在CentOs中进行演示的。

至于系统的安装,你可以选择云服务器,或者使用虚拟机安装。虚拟机安装CentOs的方式比较简单,在此就不赘述了。

  1. 连接工具

笔者推荐使用XSHELL作为连接工具,下载地址:https://www.netsarang.com/zh/xshell-download/

安装完成后,打开软件,点击左上角的新建回话按钮,打开新建回话框,如下图所示:

在【主机】中填写服务器的ip地址,然后点击【连接】按钮,会依次提示输入用户名和密码。连接成功的界面如下所示:

  1. 文件上传工具

要想把服务部署到Linux服务器,那就必须把文件传输到服务器中(这是句废话)。根据不同的使用场景,笔者推荐两种方案,分别是XFTP工具上传和git仓库中转。

使用XFTP上传的方式需要在开发的机器上安装此工具,下载地址:https://www.netsarang.com/zh/xftp-download/

安装完成后,可以通过XSHELL一键打开XFTP,XFTP打开后,在软件的右侧可以切换要上传文件的目标路径,然后将文件拖到右侧释放后,就会自动上传了,如下图所示:

使用git仓库进行中转的方式是笔者比较推荐的方式,因为在频繁的迭代更新中,如果通过现在本地编译发布后,再将文件拷贝到服务器,这个操作流程稍显繁琐。而通过git仓库周转的方式则相对比较简单,开发者仅需要将开发好的代码推到git仓库,然后在服务器中执行build,publish等操作,少了繁琐的拷贝文件的过程,同时由于build和publish都是在服务器中执行,那么我们就可以通过编写部署脚本的方式,可以最终实现一键快速部署。

使用git的方案需要在服务器安装git客户端,并配置ssh公钥(配置公钥的目的是拉取私有的仓库,公共参考无需配置公钥)。下面来看具体的操作步骤:

首先,执行如下命令,安装git客户端:

yum -y install git

git安装后,通过如下命令生成sshkey:

# 这里的xx@xxx.com只是生成的sshkey的名称,并不约束货要求具体命名为某个邮箱。ssh-keygen -t rsa -C "xx@xxx.com"  

按照提示,按三次回车,即可生成sshkey,如下图所示:

,通过如下命令可查看公钥:

cat ~/.ssh/id_rsa.pub

复制生成后的sshkey,配置到代码仓库的公钥中。下面简单演示下gitee代码托管平台下如何配置公钥(其他平台大同小异)。

进入私有仓库的【管理】页面,找到【公钥管理】,点击【添加公钥】,将刚刚生成的公钥复制过去,如下图所示:

添加后,在终端中输入如下命令:

ssh -T git@gitee.com

次使用需要确认并添加主机到本机SSH可信列表,如下图所示:

输入yes后,出现类似于Hi xxx的字样,则表示git公钥配置成功了。

  1. .NET Core SDK和运行时

.NET运行时是.NET程序运行的先决条件,而SDK并不是必须的,但如果通过git方式进行文件中转的话,就涉及到在服务器端进行编译,所以SDK也需要安装。(注:docker部署方式无需在服务器安装SDK和运行时,下文回提到
下面一起看看在CentOs中如何安装SDK和运行时(其他环境可参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux)。

运行如下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

通过如下命令安装SDK:

sudo yum install -y dotnet-sdk-3.1

.NET Core SDK 使你可以通过 .NET Core 开发应用。如果安装 .NET Core SDK,则无需安装相应的运行时。

通过如下命令安装运行时:

sudo yum install -y aspnetcore-runtime-3.1

注:上述命令中的最后的3.1表示的是版本号,如果安装其他版本,修改对应的版本号即可。参考资料:https://dotnet.microsoft.com/download/dotnet-core

发布程序到服务器

在准备工作中已经介绍了两种将文件发布到服务器的方式,下面具体演示下步骤。

  1. 通过XFTP发布到服务器

首先,准备好要发布的程序,
下图是我创建的一个.NET Core3.1的示例代码:

打开vs的程序包管理器控制台,执行如下命令:

dotnet publish -o ./publish

执行结果如下图所示:

在上图可以看到,发布之后的文件的路径为:D:\code\test\BuildTest\publish\

打开XFTP,将publish文件夹拖到右侧窗口,即可完成上传。

  1. 通过git中转。

首先,将代码推送到git仓库中,复制SSH地址。如下图所示:

然后再服务器中,执行克隆命令:

mkdir codecd codegit clone git@gitee.com:billsking/build-test.git

执行结果如下图所示:

此时项目代码已经下载到服务器中,切换工作到解决方案所在的目录

cd build-test

然后我们需要执行dotnet publish命令对程序进行编译发布。

dotnet publish -o /root/web/publish

执行完毕后,编译后的文件将被保存在/root/web/publish目录中。将工作目录切换到/root/web/publish,执行如下命令:

dotnet BuildTest.dll

执行结果如下图:

到这里为止,咱们的程序已经在linux服务器运行起来了。但直接通过dotnet命令仅适合临时测试使用,并不能成为生产场景的解决方案。下面进来跟我一起了解下可用于生产环境的部署方式吧。

Supervisor+Nginx组合

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。下面是Supervisor安装方法。
执行如下命令:

yum install -y supervisor

执行以上代码如果提示:没有可用软件包 supervisor。则需要先安装EPEL源后,再执行上面的命令。安装EPEL源的命令如下:

yum install -y epel-release

设置开机启动:

systemctl enable supervisord

启动supervisord

systemctl start supervisord

查看状态

systemctl status supervisord

通过vi命令或者XFTP修改配置文件开启web界面访问,如下图所示,分别取消inet_http_server等四个配置的注释:

执行如下命令,重新加载配置文件:

supervisorctl reload

然后在浏览器打开http://你的ip:9001,输入用户名密码后,如图所示:

看到这个界面,就表示supervisor安装完成了。

切换到/etc/supervisord.d目录,在此目录创建ini文件,内容如下:

[program:buildtest] ;表示程序名称,用于在supervisor中显示,无特殊意义。command=/bin/bash -c "dotnet BuildTest.dll"; 输入执行命令,这里表示执行的是dotnet BuildTest.dlldirectory=/root/web/publish ; 应用程序根目录autostart=true ; 是否自动启动,当 supervisor 加载该配置文件的时候立即启动它autorestart=true ; 是否自动重启, 程序异常退出后自动重启logfile_maxbytes=50MB ; 该配置文件输出单个日志文件的大小,默认50Mlogfile_backups=10 ; 日志备份个数loglevel=info ; 记录日志级别stdout_logfile=/root/data/logs/buildtest/buildtest.out.log ; 指定标准输出日志文件environment=ASPNETCORE_ENVIRONMENT=Production;环境变量。user=root ;启动服务的用户redirect_stderr=true;把 stderr 重定向到 stdout,默认 false

++注:stdout_logfile指向的文件夹一定要先创建,否则无法启动。++

然后执行如下命令:

supervisorctl reload

命令执行成功后, 刷新浏览器,可以看到如下界面:

当界面显示running时,则表示我们我们刚刚配置的应用程序运行起来了。

但现在还存在一个问题,我们的应用程序默认是绑定的5000端口,如果要指定80端口或者配置域名该怎么处理呢?下面就该nginx登场了。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。(来源自百度百科)

安装方式参考:http://nginx.org/en/linux_packages.html#RHEL-CentOS

安装先决条件:

yum install -y yum-utils

设置yum存储库,先创建一下内容的文件:/etc/yum.repos.d/nginx.repo

[nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true[nginx-mainline]name=nginx mainline repobaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true

默认情况下,使用稳定 nginx 包的存储库。如果要使用主线 nginx 包,请运行以下命令:

yum-config-manager --enable nginx-mainline

运行如下命令安装nginx:

yum install -y nginx

设置开机启动:

systemctl enable nginx

启动nginx:

systemctl start nginx

此时,就可以在浏览器通过ip访问了:http://你的ip,界面如下:

nginx安装完成后,切换到/etc/nginx/conf.d目录,修改default.conf文件内容,如下所示:

server {listen       80;server_name  localhost;location / {proxy_pass http://0.0.0.0:5000;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}

保存后,执行如下命令,重新加载配置:

nginx -s reload

然后再次访问http://你的ip,幸运的话,你应该可以看到如下的界面,表示你的.NET Core程序已经完美运行在linux系统了。

如果你不幸的看到了如下界面:

不要着急,继续往下看。

出现这个问题的原因是因为SeLinux的限制,执行如下命令之后,再刷新页面:

setenforce 0     

如果还是看到的错误页面,就需要去查看nginx的日志了,默认的日志路径为:/var/log/nginx

通过setenforce 0命令,只是临时实效,重启后回失效的。一劳永逸的做法是,修改/etc/selinux/config 文件, 将SELINUX=enforcing改为SELINUX=disabled,然后重启机器。

后面如果你需要更新你的应用程序,只需要将代码提交到git仓库,然后在服务器中执行git pull和dotnet publish就行了。

如果你对shell比较熟悉的话,还可以通过编写shell命令一键执行应用程序的更新,下面是我写的示例:

# !/bin/bashcd /root/code/build-testgit pulldotnet publish -o /root/web/publishsupervisorctl restart buildtest

将上述的代码保存问sh文件,上传到服务器,并设置权限。如下图所示:

代码提交到git仓库后,执行如下命令:

./build.sh

执行结果如下图所示:

总结一下,这种方式需要在服务端安装两个软件,supervisor和nginx,supervisor一个作为守护线程,用于维护应用程序的生命周期的。nginx则是作为反向代理使用。维护起来相对麻烦,那么有没有一个像IIS一样,既可以维护应用程序的生命周期,又可以对外暴露服务呢?答案是肯定的,继续往下看。

Jexus

  Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关服务器,以支持ASP.NET、ASP.NET CORE、PHP为特色,同时具备反向代理、入侵检测等重要功能。可以这样说,Jexus是.NET、.NET CORE跨平台的最优秀的宿主服务器,如果我们认为它是Linux平台的IIS,这并不为过,因为,Jexus不但非常快,而且拥有IIS和其它Web服务器所不具备的高度的安全性。同时,Jexus Web Server 是完全由中国人自主开发的的国产软件,真正做到了“安全、可靠、可控”, 具备我国党政机关和重要企事业单位信息化建设所需要的关键品质。

以上内容摘自jexus官网:https://www.jexus.org/

废话不多说,直接进入正题,首先是安装。

jexus的安装非常简单,执行如下命令:

curl https://jexus.org/release/x64/install.sh|sudo sh

注:如果在这之前你已经安装了nginx,需要先将nginx绑定的80端口释放,或者卸载nginx。

安装完成后,切换到/usr/jexus目录,修改/usr/jexus/siteconf目录下的default,内容如下所示:

port=80 #端口hosts=*    #域名AppHost={cmd=dotnet BuildTest.dll; root=/root/web/publish; port=0}

然后执行如下命令:

/usr/jexus/jws restart

当你看到执行结果为OK时,即可认为应用程序已经启动了。最后,执行如下命令,看下执行的结果:

ps -aux

关于jexus更详细的使用说明,请参考官方文档。

Docker+Nginx或Jexus

上面讲到的, 不管是通过supervisor+nginx还是jexus,都需要在服务器安装 .NET Core的SDK或者运行时,假如咱们有好多个应用程序,有的用 .NET Core2.1,有的用 .NET Core3.1,有的用.NET5,那么上面的做法就需要咱们分别安装对应的SDK或者运行时,对于维护还是比较麻烦的。Docker的出现,可以完美解决上述问题。

关于Docker的介绍,有兴趣的可自行百度。下面来跟我一起来看下如何安装并使用Docker。

执行如下命令:

curl -fsSL get.docker.com -o get-docker.shsudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker的稳定版本安装在系统中。

执行如下命令设置docker开机启动:

systemctl enable docker

执行如下命令启动docker:

systemctl start docker

安装docker之后,我们需要在代码里增加dockerfile文件。什么?不会docker?不要紧,万能的Visual Studio可以帮你自动生成。在解决方案中,右击项目名称,依次选择【添加】,【Docker支持】,如下图所示:

生成的dockerfile文件如下所示:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS baseWORKDIR /appEXPOSE 80FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS buildWORKDIR /srcCOPY ["BuildTest/BuildTest.csproj", "BuildTest/"]RUN dotnet restore "BuildTest/BuildTest.csproj"COPY . .WORKDIR "/src/BuildTest"RUN dotnet build "BuildTest.csproj" -c Release -o /app/buildFROM build AS publishRUN dotnet publish "BuildTest.csproj" -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "BuildTest.dll"]

将代码推送到git仓库,然后再linux服务器中拉取最新代码。

切换到/root/code/build-test目录,执行如下命令,拉取最新代码:

git pull

然后执行如下命令,将代码打包为镜像:

docker build -f ./BuildTest/Dockerfile -t buildtest .

由于首次打包镜像的时候涉及到拉取.NET Core的官方镜像,拉取速度可能较慢,请耐心等待。打包完成后,执行如下命令,可查看当前服务器已存在的镜像:

docker images

镜像打包完成后,我们就可以通过docker run运行下,命令如下:

docker run -p 82:80 -dit --restart=always --name buildtest buildtest

执行结果如下:

通过浏览器访问:http://ip:82。如无意外,你将看到你的应用程序已经成功运行了。

相同的道理,我们也是可以通过编写shell脚本的方式,实现一键更新应用程序的。在/root目录中,创建dockerbuild.sh文件,文件内容如下:

# !/bin/bashcd /root/code/build-testgit pullimtag=$(uuidgen |sed 's/-//g')docker build -f ./BuildTest/Dockerfile -t buildtest:${imtag} .docker stop buildtestdocker rm buildtestdocker run -dit --restart=always --name buildtest -p 82:80  buildtest:${imtag}

给dockerbuild.sh文件设置执行权限,命令如下:

chmod 777 dockerbuild.sh

当有新代码推送到git仓库时,进入服务器,执行dockerbuild.sh即可快速更新应用程序。

到这里,.NET Core部署到linux服务器的方案已“基本”介绍完毕了。

为什么说是“基本”呢?不知道大家有没有发现,虽然目前的方案可以实现一键部署更新,但。。。。,我们还是需要登陆到linux服务器去执行这个命令,显然,这不是最好的方法。有没有更好的方案呢?如果当我们提交给git仓库后,自动出发部署命令是不是就更方便了呢?

答案是肯定的,我们可以借助jenkins来实现。限于篇幅,本篇文章就不讲解了,如有兴趣,你也可以先自行研究,或者敬请期待下次的讲解。

最后说明下,以上的方案还是存在很多的问题,对于小型团队已经够用,大型项目的终极解决方案应该是基于k8s实现的devops。其实k8s实现devops的原理和我上述介绍的方案基本一致。借助与gitlab的runner或者jenkins,监听git仓库的状态,当发现指定的分支发生变化后,打包镜像,然后通过替换k8s的deployment的镜像来实现自动更新。同时,k8s实现了弹性伸缩、滚动更新等功能。

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

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

相关文章

好用的平板电脑_平板选择华为M6,这里有几点建议

大家好,我是师兄。平板几乎已经成大学生生活中必备的物品之一了,现在的学生实在是太会享受了。作为华为M6的重度使用用户,在这里给大家在购买华为平板M6时提几点建议。1.质量挺好的,品制有保证购买华为平板M6已经半年了&#xff0…

读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle

因为做项目,需要使用BFILE字段存储图像文件,所以进行了一些研究。bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复bfile的基本操作如下:1.先在oracle数据库中下面我…

客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码

一:背景 1. 讲故事周五下午运营反馈了一个紧急bug,说客户那边一个信息列表打不开,急需解决,附带的日志文件也发过来了,看了下日志大概是这样的:日期:2020-11-13 12:25:45,923 线程ID:[3924] 日志级别:INFO …

离线语音识别软件_从音乐识别软件起家,这家公司如何备战车载AI语音市场GGAI对话...

加入高工智能汽车专业行业群(自动驾驶5群,车联网智能座舱3群,智能网联商用车2群),加微信:17157613659,出示名片,仅限智能网联汽车软硬件供应商及OEM厂商。早在2016年,亚马逊推出的语音助手Alexa…

int函数在Oracle,vb中int是什么意思 ?

VB语言中int函数的意思是取整数。即:int(x)函数是取不大于x的最大整数。例如:1、int(4.88)4int(4.88)即是取一个不大于4.88且最接近4.88的整数,所以int(4.88)4。2、int(8.1)8int(8.1)即是取一个不大于8.1且最接近8的整数,所以int(…

windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南

来源:阮一峰的网络日志作者:阮一峰链接:http://www.ruanyifeng.com/blog/2016/06/dns.htmlDNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。本文详细介绍DNS的原理,以及如…

天际数见数据质量巡检架构优化

源宝导读:天际数见平台是一个数据可视化的BI平台,定位于为高层决策提供数据可视化赋能。数据准确性是生命线,如何提前发现数据问题,快速定位和修复问题,成为我们必须攻克的难点。本文将介绍数见平台通过架构优化&#…

db2 删除存储过程_蚂蚁金服OceanBase挑战TPCC | TPCC基准测试之存储优化

蚂蚁金服自研数据库 OceanBase 登顶 TPC-C 引起业内广泛关注,为了更清楚的展示其中的技术细节,我们特意邀请 OceanBase 核心研发人员对本次测试进行技术解读,共包括五篇:1)TPC-C基准测试介绍2)OceanBase如何做TPC-C测试3)TPC-C基准…

Github Actions 中 Service Container 的使用

Github Actions 中 Service Container 的使用Intro之前写过一个 StackExchange.Redis 的一个扩展,测试项目依赖 redis,所以之前测试一直只是在本地跑一下,最近通过 Github Action 中的 Service Container 来通过 CI 来跑测试,分享…

深度探秘.NET 5.0

2020 中国.NET 开发者峰会正式启动 ,欢迎大家提交演讲主题或者购买超级早鸟票。今年11月10号 .NET 5.0 如约而至。这是.NET All in one后的第一个版本,虽然不是LTS(Long term support)版本,但是是生产环境可用的。微软从.NET 5 Preview 1就开…

vuex保存用户信息_Vuex状态管理

一个组件可以分为数据和视图,数据更新时,视图也会自动更新。在视图中又可以绑定一些事件,它们触发methods里面指定的方法,从而又可以改变数据、更新视图,这就是一个组件基本的运行模式。但实际的业务中,经常…

使用 docker 构建分布式调用链跟踪框架skywalking

一旦你的程序docker化之后,你会遇到各种问题,比如原来采用的本地记日志的方式就不再方便了,虽然你可以挂载到宿主机,但你使用 --scale 的话,会导致记录日志异常,所以最好的方式还是要做日志中心化,另一个问…

excel同一单元格怎么换行_excel表格内怎么换行 方法有两种 一看就会 新手教程...

很多人在用excel表格的时候都需要用到换行,但是有一些小伙伴还不知道如何去换行。今天就介绍两种单元格内换行的方法,这两种换行方式的效果不一样,大家可以根据自己的需求来选择使用哪种换行方式。方法一:单元格内自动换行操作&am…

持续交付一:从开发到上线的环境

团队开发中,开发,测试,预发布,生产,不同的角色工作在不同的环境中,不同的环境有不同的作用(有些公司的环境更多,按照自己的交付流程设计),当然不同的环境,配置也不能相同…

win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少

不知不觉,Win10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数。近日微软开始推送“Win10更新五月版”,那么Win10中到底都有哪些“骚”操作?一起来看看吧。1、夜间模式…

C# 中的数字分隔符 _

编写 C# 代码时,我们时常会用到很大的数字,例如下面定义的变量:const long loops 50000000000;您能快速读出这是多少吗?是不是还是会有很多人把光标定位到最后一位,然后按键盘上的向左键一个一个往上数:个…

数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...

空间光调制器(SLM), 空间光调制器(SLM)工作原理是什么?实时空间光调制器使得相干处理系统能输入非相干光图像和随时间变化的图像的器件。相干光处理系统的最大优点是二维平行处理、信息容量大,运算速度快。但是目前的输入图像和空间滤波都用银盐胶片作记录媒质&…

使用 .NET 5 体验大数据和机器学习

2020 中国.NET 开发者峰会正式启动 ,欢迎大家提交演讲主题或者购买超级早鸟票。翻译:精致码农-王亮原文:http://dwz.win/XnM.NET 5 旨在提供统一的运行时和框架,使其在各平台都有统一的运行时行为和开发体验。微软发布了与 .NET 协…

linux监控目录容量,利用ZABBIX监控某个目录大小

近期,因为JMS的消息堆积导致ApacheMQ频率故障(消息没有被消费掉,导致其数据库达到1.2G,JMS此时直接挂掉),很是郁闷!刚好自己在研究zabbix.既然zabbix如此强大,那么它可以监控我的这个目录大小吗&#xff1f…

三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?

模拟量在PLC系统中有着非常广泛的应用,特别是在过程控制系统中。模拟量是一种连续变化的量,因此,它的使用对象也是各种连续变化的量,比如温度,压力,湿度,流量,转速,电流&…