虹软开发新得---容器化部署(docker/.net5/C#)避坑

自从容器(主要是docker)出现后,分布式部署迎来了一场不小的革命,开发运维人员终于可以不用为部署环境不一致问题扯皮,同时动态扩展也大大简化。Docker加上K8S后,更是争强对基于docker部署的分布式系统的“三高”(高可用,高可扩,高并发)。对于C#而言,.net core时代的到来,开始了拥抱跨平台,对于容器化技术,微软会迟到,但绝不会缺席。今天,我们也来体验一把利用.net core3.1 WebApi架构,将虹软人脸识别项目部署到docker容器中。本文基于虹软人脸识别SDK 3.0 Windows C++ / X64版本(SDK下载链接:https://ai.arcsoft.com.cn/ucenter/resource/build/index.html#/addFreesdk/1002?from=index)作为讲解以及代码展示。

生产环境中,Linux服务器的数量远超Windows server,因此Linux系统才是docker的主战场,顺便提一句K8S目前也仅支持Linux运行。在Linux系统安装docker,根据Linux版本不同,可能有些差异,主要两种发行版安装参考如下(你可能需要科学上网):
Ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html
CentOS:https://www.runoob.com/docker/centos-docker-install.html
环境好了,可以干活了。下面我们开始撸代码,实例代码我去除so,dll文件以及AppId,Key配置后,放在了github上面(https://github.com/18628271760/MicroService_Face_3_0)大家可以下载参考,添加去除内容后,就可以可以跑起来。

下面开始避坑提示:

  1. 无法加载错误:绝大多数小伙伴在Windows上开发,再部署到Linux上。因此经常直接把虹软SDK的2个dll格式文件上传到Linux服务器,导致启动docker时候失败。原因当然是Windows的动态链接库与Linux版本不兼容引发的。
    避坑做法是:推荐将dll与so文件同时加载到项目,方便调试与部署。编写完成在本地测试的时候,选择dll格式的动态链接库,部署上传到Linux的时候只上传对应的so文件。
  2. “28676(0x7004)”错误:官方SDK解释的很清楚,SDK_KEY和使用的SDK不匹配。开发者在虹软开发者中心创建一个项目后,会自动生成一个APP_ID。这个项目下,可以有N个版本的SDK,这些SDK共用一个APP_ID,但有自己独立的SDK_KEY(不同系统版本间肯定不一样!)。
    避坑做法是:注意在开发和部署测试的时候,切换不同的key,与当前系统版本一致。同样不要忘记不同系统下的引用文件切换。(表扬下虹软开发,相同代数的Windows/Linux C++版本函数完全一致,省去了不少麻烦)。


    3.png

    4.png
  3. (微软挖坑!)镜像缺少依赖(提示找不到libgdiplus组件):由于本实例基于.net core3.1版本,需要在DockerFile里面加入.net core3.1依赖镜像。早期笔者使用的是微软自带的.net core3.1镜像,结果发现部署完成后启动容器,出现依赖缺失问题。经过排查后发现,微软自带的.net core3.1镜像没有集成libgdiplus库(libgdiplus是一个Mono库,用于对非Windows操作系统提供GDI+兼容的API,libgdiplus是mono中的System.Drawing依赖的一个组件,用于显示web页面基本颜色等。可用于生成netcore验证码,处理图片等。关于libgdiplus的详细信息,请小伙伴参考:https://www.jianshu.com/p/f71f9e7138c0)
    避坑做法是:引用第三方镜像( lonwern/aspnetcore-libgdiplus:3.1)可以解决此问题。(其在Github上的开源地址为:https://github.com/lonwern/aspnetcore-libgdiplus)
  4. 无法找到相关引用:与Windows系统类似,Linux在查找动态链接文件so时,也有一定顺序,如下:
    (1) gcc 编译时指定的运行时库路径 -Wl,-rpath
    (2) 环境变量 LD_LIBRARY_PATH
    (3) ldconfig 缓存 /etc/ld.so.cache
    (4) 系统默认库位置 /lib以及/usr/lib
    如果我们的so文件没有在上述位置,Linux 程序运行时自然查找不到,将会报错。
    避坑做法是:建议在Linux系统中基于docker部署, libarcsoft_face.so 和libarcsoft_face_engine.so需要拷贝到/usr/lib/目录下,最为简单方便。
    5.png

    将程序集上传到Linux,打包成镜像文件。镜像打包参考:
    https://blog.csdn.net/xiaoxionglove/article/details/108962750
    打包成功后,利用docker images命令参看是否创建成功:
    6.png

    创建成功后,利用docker run命令启动容器实例。
    没有错误,利用docker ps -a命令参看下结果:
    7.png

    打开swagger,测试:
    8.png

    10.png

    总结,容器化的部署,简化了跨平台的部署,同时也减轻了运维压力。但对新手来说,可能会遇到很多“坑”。不过踩坑爬坑就是能力提升的过程,希望本期开发心得对小伙伴使用虹软容器化部署有个避坑参考。

你可能感兴趣的:(虹软开发新得---容器化部署(docker/.net5/C#)避坑)