使用.NET Core搭建分布式音频效果处理服务(七)使用Docker压榨性能极限
Docker相信很多朋友都使用过,做微服务比虚拟机还好用。
需要安装的一些东西
ffmpeg:
docker pull ffmpeg
dotnet:
docker pull dotnet
默认全是latest最新即可,具体怎么配置网上搜索一下即可。
调用用REST? 还是用RPC?
微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现,常用框架例如dubbo,netty、thrift。
REST:严格意义上说接口很规范,操作对象即为资源,对资源的四种操作(post、get、put、delete),并且参数都放在URL上。
RPC:即我们常说的远程过程调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。
一般来说,对内选择rpc,因为他是直接基于TCP/IP协议通讯,性能要好很多。对外选择REST,因为他是更规范的、更标准的、更通用的、更简单的。
但是对于追求较高性能的RPC,会消耗额外很多成本,因此有时候对内一般也采用REST。
因此,笔者为了偷懒o(∩_∩)o ,在这个项目中选择REST,而抛弃RPC那臃肿的调用方式。
发布你的应用
dotnet 已经完全可以跨平台,但是如果直接用bin下面将文件夹拷贝到指定的地方,那么你将得到无数抓狂的错误,这是因为netcore和 net framewor本身的不同而造成,前者提供的是基础平台、让使用者自行去开发和扩展相应模块、且开源,而后者是所有东西都已经为你打包到他的集合中去了,你只管调用NET系统根目录中相应的库即可。
比如你需要发布到linux平台,进入你的项目主目录。执行:
dotnet publish -r linux-x64
注意:从dotnet core 2.1开始,发布的时候已经不再需要先还原源码包(dotnet restore)。
进入到publish文件夹(一般在bin下),你会发现多了一些runtime库和一些你根本就没引用的库,这样才能有效的在其他操作系统上直接运行。
运行你的应用
你可以通过主机docker命令并附加子命令来运行docker内的dotnet程序,例如这样:
docker run -dit \ -p 50532:80 \ -v /home/dotnet/Service:/wwwroot \ -w /wwwroot \ --restart always \ --name dotnet_service \ 6d25f57ea9d6 \ dotnet Service.Web.Api.dll
-p:内外端口映射
-v:内外路径映射
-w:工作目录
6d25f....:你的dotnet镜像名称。
但笔者启动的程序需要附带大量的参数,而且不喜欢这样通过docker宿主进行命令输入,启动中有没有报错不能及时反馈(docker启动镜像返回的是一组hash代码,不会返回程序的的任何启动信息,需要通过docker log查阅),这样就变成如下操作:
进入在docker中的dotnet容器(成功运行镜像后都会成为一个容器),找到与你项目相关的主程序集文件,例如笔者是Service.Web.Api.dll,执行dotnet Service.Web.Api.dll(当然你也可以附带一大堆的启动参数,例如笔者这样)便可以运行这个项目。
dotnet Service.Web.Api.dll --ASPNETCORE_ENVIRONMENT=Development --ASPNETCORE_URLS=http://localhost:5052 --USE_CONTENTS_DIRECTORY=/home/netcore.MicroService/src/Service.Web.Api
小技巧:linux上面SSH相信大家有耳熟能详,但是一旦关闭控制台,运行的后台也将随之关闭,我们可以通过安装screen建立一个虚拟子屏幕,以保证shell程序在后台能一直运行下去。
保存你的netcore容器到镜像
如果我们需要在一台服务器上面建几十个docker容器,每一个都像上面那样进行一步一步的手动输入,那不是要崩溃...
我们保存一个已经在运行的容器,修改他子程序的运行参数,例如修改映射端口号,就可以实现快速的多个相同镜像的目的。使用命令:
docker commit c16378f943fe service_media
c1637...:这是笔者这边已经在运行的容器实例。
接下来再执行“运行你的应用”中的命令,将外部映射端口改成你想要的端口号,不断的重复这个操作,即可在同一台服务器上运行多个实例。
为何要选择docker进行实例运行
有的朋友也许不明白为何要这样做重复的操作,直接用dotnet自带的宿主,复制多条相同的命令,修改端口号一样也能达到如上的需求。
是的,这样的确也可以在同一台服务器上运行多个主机宿主实例,但是,他们并没有隔离。
对,就是这个词语----隔离:
说到这个词语可以牵涉一堆专业术语,而笔者又不想太多去复制太官方的东西,喜欢用白话文介绍自己所理解的内容。
当所有的子程序都运行在主机(非docker)下,内存分配,IO读取,系统底层调用等等一些处理,都会交给主机操作系统执行,这样会存在一定的风险。而docker虽然运行在主机之上,可他却有一套自己的底层进行处理,这样带来第一层隔离,其次,运行在docker容器内的程序,容器本身也是一个操作系统,不外乎是被建立镜像的时候将操作系统进行了大范围的瘦身,只保留该TAG需要的LIB就行,这样又做了一层隔离。
具体详细的隔离架构,朋友们可网上搜一搜,很多的。
运行多个docker dotnet core镜像
上面噼里啪啦的说了一大堆,其实就是一张图片就解释的事情:
笔者用了三台服务器做处理服务,每台上面运行相同的docker实例32个,总共3*32=96个实例(全傻瓜式的水平扩展),通过客户端模拟100个请求,得到结论如下:
反而比单机模拟6台服务器性能降低了3%-6%,但是:
1:单机一次请求是8个,而在该系统测试中,一次请求是100个。
2:单次时间变长,是因为服务器的U比本地测试的U的主频低,但是核心却是本地U的4倍。
这样一来,其实整体性能会随着服务器的数量的添加而增加,根据业务需求而定吧,就说目前某度云的视频转换最高请求也就是几千左右,如果真有那个量级,傻瓜式的增加服务器就行了。
本系列完,感谢阅读

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
容器Docker学习系列三~每天几个小命令
今天要学习的命令包含剩下的五个rmi,tag,build,history,save,import 今天继续学习我们的Docker命令,在简单的了解命令后我们会开始实战操作执行Docker容器,应用起来我们的命令。今天继续学习六大部门Docker命令中的本地镜像管理命令 原先我们学习images的命令可以参考前一篇文章容器Docker学习系列二了解 今天要学习的命令包含剩下的五个rmi,tag,build,history,save,import rmi 执行操作 docker rmi [OPTIONS] 镜像名称 删除本地一个或者多个镜像 OPTIONS 是一个可选操作: -f :强制删除 --no-prune:不移除该镜像的过程镜像,默认操作是移除。 docker@ubuntu:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mongo latest 8bf72137439e 4 days ago 380MB redis latest 4e8db158f18d 11 days ago 83.4MB docker@ubuntu:...
- 下一篇
一分钟小讲堂:弹性裸金属服务器(神龙)
本文总字数约900字,阅读大约需要1分钟。 阿里云ECS有一款明星产品:弹性裸金属服务器(神龙)。由于名字比较长,又常常被媒体曝光,很多朋友不明觉厉。我们今天来简单了解一下它的诞生背景和主要特点。 目前,神龙主要面向对性能和安全性要求较高的企业级客户。我们先来看看之前这些大公司互联网业务有什么烦恼? 传统物理机:性能天生强大,灵活性天生要凉 有一些客户为追求极致性能,偏向在云上使用物理机。相对虚拟机,物理机没有虚拟化损耗,性能更强大,但“坑”很多:部署周期慢,运维复杂,架构僵化等等。 一些云上物理机运维交付都涉及大量人肉操作,产品灵活性偏离了云计算的本意,可能叫“物理服务器托管”更合适。因为不能纯自动化运维,弹性不能很好体现,而且一旦物理机出现宕机,稳定性也不能很好保障。 虚拟机的外表 +物理机的心脏 =神龙 神龙的全名为弹性裸
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7设置SWAP分区,小内存服务器的救世主
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用