写在前面
在很长的一段时间里,提起.net都会让我无比失望,这个体系就像一个垂垂老矣的老人,充满了腐朽的气息。不活跃的社区,互联网生态不健全。就像年轻人眼中上了年岁的程序猿一样,高傲又倔强,顽固的捍卫着自己构建好的世界;就像孩子们知道好好学习是很重要,可是他们仍然没有好好学习。直到net core的出现。
准备
- 一台linux docker环境,这不是本文的重点,所以不会单独提及,如果您还不清楚docker是什么以及如何使用,请移步这里。
- vs2017以及net core2.2
构建net core项目
1. 新建一个net core的api项目,注意在新建的时候勾选号docker支持,会很贴心的生成Dockerfile。并且注意选择操作系统为linux。
2. 上面完成了所有在windows上面的工作,我们来把工程文件夹整体搬迁到linux上。(这里使用的是项目创建后自动创建的示例代码,这里先不会涉及过多的代码,毕竟我们讨论的是net core与docker)。下面用生成好的Dockerfile生成docker镜像,这里有一个要注意的点,不知道是不是vs生成dockerfile的bug,要把Dockerfile复制到上一层目录里。
执行命令
docker build -t <image name> .
运行
docker run -p 5000:80 <image name>
好了,访问一下http://host:5000/api/values,是不是已经可以返回了。
写在后面
- 在windows server 2016中,已经完整的支持了docker,在运行linux环境时虽然仍然采用虚拟机的方式运行,但是在windows container方式下,它将以windows内核的方式运行。看这里https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/about/
- 为什么不使用基于windows的docker呢?不妨问一下自己为什么要用windows呢?如果需求是将老的.net framework项目docker化,那么没问题,你应该使用windows。如果你要构建一个新的基于docker的服务,为什么不用net core呢?既然我们在使用net core为什么不把它部署在廉价又高效的linux上呢?
- 在使用net core和docker时,我们可能会有一种思维定式,要使用什么http容器。这完全没必要,因为答案在这里https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/?view=aspnetcore-2.2&tabs=linux,net core中自带了Kestrel,这就类似于Netty或者golang中的net/http包,在linux上它是高效的事件模型。IIS在net core体系中仅仅是一个反向代理的作用,既然这样为什么不用Nginx呢?
- 可以基于这篇微软官方文档,将swagger集成进来,毕竟在微服务实践里api文档太重要了https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-2.2&tabs=visual-studio
- 也可以使用polly实现故障重试、熔断和降级,看这里http://www.thepollyproject.org
- 最后可以使用基于net core的api gateway -- ocelot(看这里http://threemammals.com/ocelot)集成consul实现服务发现,编排,聚合,路由,认证,限流,监控 and etc.
参考资料
- https://stackoverflow.com/questions/49512727/docker-copy-failed-createfile-looking-for-file-in-strange-location
- http://www.cnblogs.com/artech/p/KestrelServer.html