.NET Core容器化@Docker

温馨提示:本文适合动手演练,效果更佳。

 1. 引言

我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Windows系统上部署运行。而至于如何操作,可能就有所欠缺。那这一节我们就结合简单实例一步一步教你如何借助Docker来容器化 .NET Core应用,以完成跨平台的构建和部署。

 2. 环境准备

自从玩.NET就一直和Windows系统打交道,如果还基于Windows来展开本节内容,不就跑题了吗?!那咱们就切换到Linux系统。
如果没有Linux基础和Docker基础,请自觉完成以下两个实验:
腾讯云开发者实验室:Linux 基础入门
腾讯云开发者实验室:搭建 Docker 环境

完成了以上两个实验后,我们就离Linux的世界更近一步。
因为后续是基于Linux-CentOS系统进行实操演练,没有Linux上机环境的,可以考虑从腾讯云实验室列表找一个CentOS相关的实验项目作为本文的演练环境。

 3. Docker简介

在开始之前,有必要对Docker做一下简单了解,可以参考我的上一篇文章Hello Docker。
这里就简要的再重复一下。
Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相较于虚拟机而言,Docker共享的是宿主机的硬件资源,使用容器来提供独立的运行环境来运行应用。虚拟机则是基于Supervisor(虚拟机管理程序)使用虚拟化技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低!
Docker涉及了三个核心概念:Register、Image、Container。

1. Registry:仓库。用来存储Docker镜像,比如Docker官方的Docker Hub就是一个公开的仓库,在上面我们可以下载我们需要的镜像。
2. Image:镜像。开发人员创建一个应用程序或服务,并将它及其依赖关系打包到一个容器镜像中。镜像是应用程序的配置及其依赖关系的静态形式。
3. Container:容器。Container是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。

它们三者的相互作用关系是:
当我们执行Docker pull或Docker run命令时,若本地无所需的镜像,那么将会从仓库(一般为DockerHub)下载(pull)一个镜像。Docker执行run方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker利用login、push等命令将本地镜像推送(push)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序。

4. 安装Docker

4.1. 使用脚本自动安装Docker

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS系统上可以使用这套脚本安装:

//使用脚本自动化安装Docker$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

4.2. 启动Docker

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

//启动 Docker CE$ sudo systemctl enable docker$ sudo systemctl start docker
//查看docker版本$ sudo docker -vDocker version 1.12.6, build ec8512b/1.12.6

4.3 测试Docker是否正确安装

命令行执行docker run hello-world

$ docker run hello-world
Unable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldca4f61b1923c: Pull completeDigest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905cStatus: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:https://cloud.docker.com/For more examples and ideas, visit:https://docs.docker.com/engine/userguide/

当执行docker run hello-world时,docker首先会从本地找hello-world的镜像,如果本地没有,它将会从默认的镜像仓库Docker Hub上拉取镜像。镜像拉取到本地后,就实例化镜像得到容器,输出Hello from Docker!

4.4. 配置镜像加速

因为默认的镜像仓库远在国外,拉取一个小的镜像时间还可以忍受,若拉取一个上G的镜像就有点太折磨人了,我们使用DaoCloud镜像加速器来进行镜像加速。Linux上配置方法如下:

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io`
$ sudo systemctl restart docker

5. Hello Docker With .NET Core

Docker安装完毕,我们来结合.NET Core玩一玩吧。

5.1. 拉取microsoft/dotnet镜像

命令行执行docker pull microsoft/dotnet,等几分钟后即可安装完毕,执行docker images可以看到本地已经包含microsoft/dotnetdocker.io/hello-world两个镜像。

5.2. 运行microsoft/dotnet镜像

使用docker run <image>可以启动镜像,通过指定参数-it以交互模式(进入容器内部)启动。依次执行以下命令:

//启动一个dotnet镜像$ docker run -it microsoft/dotnet//创建项目名为HelloDocker.Web的.NET Core MVC项目dotnet new mvc -n HelloDocker.Web//进入HelloDocker.Web文件夹cd HelloDocker.Web//启动.NET Core MVC项目dotnet run

运行结果如下所示:

[root@iZ288a3qazlZ ~]# docker run -it microsoft/dotnet
root@816b4e94de67:/# dotnet new mvc -n HelloDocker.WebThe template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.Processing post-creation actions...Running 'dotnet restore' on HelloDocker.Web/HelloDocker.Web.csproj...  Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...  Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.props.  Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.targets.  Restore completed in 1.83 sec for /HelloDocker.Web/HelloDocker.Web.csproj.  Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...  Restore completed in 376.14 ms for /HelloDocker.Web/HelloDocker.Web.csproj.Restore succeeded.root@816b4e94de67:/# cd HelloDocker.Webroot@816b4e94de67:/HelloDocker.Web# dotnet run
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]      No XML encryptor configured. Key {727df196-978f-4df8-b3d3-e92a77e410ee} may be persisted to storage in unencrypted form.Hosting environment: ProductionContent root path: /HelloDocker.WebNow listening on: http://localhost:5000Application started. Press Ctrl+C to shut down.

键盘按住Ctrl+C即可关闭应用,输入exit即可退出当前容器。

是不是简单的几步就完成了一个.NET Core MVC项目的创建和运行?!这个时候你可能会好奇,Linux宿主机上并没有安装.NET Core SDK啊,MVC项目是如何创建的呢?这就是Docker神奇的地方,我们从镜像仓库中拉取的dotnet镜像,包含了创建、构建、运行.NET Core项目所需的一切依赖和运行时环境。

退出容器之后,执行find -name HelloDocker.Web(查找HelloDocker.Web文件),我们发现并没有找到。这说明我们刚才创建的.NET Core MVC项目是在容器内部创建的,是与宿主机完全隔离的。这个时候你可能会想,每次都要在容器中安装源代码太不方便了,我们能不能让容器运行我们宿主机的源代码项目?嗯,这是个好问题。下面我们就来解答这个问题。

5.3. 挂载源代码

为了在宿主机上创建.NET Core 项目,这个时候我们就需要在Linux宿主机上安装.NET Core SDK。

5.3.1. 宿主机安装.NET Core SDK

步骤如下:

sudo rpm --import https://packages.microsoft.com/keys/microsoft.ascsudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.1.3

安装完毕后,我们依次执行以下命令创建一个.NET Core MVC项目:

//回到根目录$ cd $HOME//创建demo文件夹$ mkdir demo
$ cd demo//创建项目名为HelloDocker.Web的.NET Core MVC项目dotnet new mvc -n HelloDocker.Web//进入HelloDocker.Web文件夹cd HelloDocker.Web//启动.NET Core MVC项目dotnet run

如果知道本机的ip地址的话(可以使用ifconfig命令查询),直接浏览器访问http://<ip address>:5000即可访问我们刚刚运行的MVC项目。

这一步我们就在$HOME/demo/HelloDocker.Web目录下成功创建了MVC项目,下一步我们就将该目录下的源码项目通过挂载的方式共享到容器中去。

5.3.2. 挂载宿主机项目到容器中

在启动Docker镜像时,Docker允许我们通过使用-v参数挂载宿主机的文件到容器的指定目录下。换句话说,就相当于宿主机共享指定文件供容器去访问。废话不多说,实践出真知。

// 命令中的`\`结合`Enter`键构成换行符,允许我们换行输入一个长命令。$ docker run -it \
-v $HOME/demo/HelloDocker.Web:/app \
microsoft/dotnet:latest

上面的命令就是把$HOME/demo/HelloDocker.Web文件夹下的文件挂载到容器的\app目录下。

[root@iZ288a3qazlZ HelloDocker.Web]# docker run -it \> -v $HOME/demo/HelloDocker.Web:/app \
> microsoft/dotnet:latest
root@d70b327f4b7e:/# lsapp  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d70b327f4b7e:/# cd approot@d70b327f4b7e:/app# lsControllers  HelloDocker.Web.csproj  Models  Program.cs  Startup.cs  Views  appsettings.Development.json  appsettings.json  bundleconfig.json  obj  wwwroot
root@d70b327f4b7e:/app# dotnet runwarn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]No XML encryptor configured. Key {09a69edf-c1c5-4909-ad24-15a43a572fca} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000Application started. Press Ctrl+C to shut down.

从上面的执行结果来看,容器内部中的app目录下包含了宿主机上的源码项目。
上面说到是以共享的形式,而不是容器拥有一份宿主机目录的拷贝,意味着,在宿主机上对目录的更改,会即时反应到容器中。但反过来,容器中对共享目录的更改,不会反应到宿主机上,不然就打破了容器具有的隔离特性。

通过这样一个简单场景,聪明的你是否会联想到这一场景在我们日常编码的应用之处呢?是的,我们可以用来持续构建(CI)。基本思路是,通过git clone源码到宿主机上,然后将源码目录挂载到容器中去进行构建。

5.4. 借助Dockerfile

Dockerfile用来定义你将要在容器中执行的系列操作。我们来创建第一个Dockerfile:

//确保进入我们创建的MVC项目目录中去$ cd $HOME/demo/HelloDocker.Web//使用touch命令创建Dockerfile$ touch Dockerfile//使用vi命令编辑Dockerfilevi Dockerfile

进入VI编辑界面后,复制以下代码,使用shift + Ins命令即可粘贴。然后按ESE退出编辑模式,按shift + :,输入wq即可保存并退出编辑界面。

FROM microsoft/dotnet:latest
WORKDIR /app
COPY . /app
RUN dotnet restore
EXPOSE 5000ENV ASPNETCORE_URLS http://*:5000ENTRYPOINT ["dotnet","run"]

上面的命令我依次解释一下:

  1. 使用FROM指定容器使用的镜像

  2. 使用WORKDIR指定工作目录

  3. 使用COPY指令,复制当前目录(其中.即代表当前目录)到容器中的/app目录下

  4. 使用RUN命令指定容器中执行的命令

  5. 使用EXPOSE指定容器暴露的端口号

  6. 使用ENV指定环境参数,上面用来告诉.NETCore项目在所有网络接口上监听5000端口

  7. 使用ENTRYPOINT制定容器的入口点

Dockerfile就绪,我们就可以将我们当前项目打包成镜像以分发部署。
使用docker build -t <name> <path>指令打包镜像:

$ docker build -t hellodocker.web .

以上命令就是告诉docker将当前目录打包成镜像,并命名为hellodocker.web。命令执行完毕,输入docker images即可看到我们新打包的镜像。镜像创建完毕我们就可以直接运行了:

docker run -d -p 80:5000 hellodocker.web

上面的指令就是运行我们新打包的镜像,并通过-p参数映射容器的5000到宿主机的80端口,其中-d参数告诉docker以后台任务形式运行镜像。因为80是默认的web端口,所以我们通过浏览器直接访问ip即可访问到我们容器中运行的MVC网站。或者通过curl -i http://localhost来验证。操作示例如下:

[root@iZ288a3qazlZ HelloDocker.Web]# docker build -t hellodocker.web .
Sending build context to Docker daemon   3.3 MB
Step 1 : FROM microsoft/dotnet:latest ---> 7d4dc5c258ebStep 2 : WORKDIR /app ---> Using cache---> 98d48a4e278cStep 3 : COPY . /app ---> d5df216b274aRemoving intermediate container 0a70f0f2b681
Step 4 : RUN dotnet restore---> Running in 0c8a9c4d5ba1Restore completed in 939.01 ms for /app/HelloDocker.Web.csproj.Restoring packages for /app/HelloDocker.Web.csproj...  Restore completed in 1.38 sec for /app/HelloDocker.Web.csproj. ---> 479f6b5cc7f0Removing intermediate container 0c8a9c4d5ba1
Step 5 : EXPOSE 5000---> Running in f97feceb7f1b---> 562a95328196Removing intermediate container f97feceb7f1b
Step 6 : ENV ASPNETCORE_URLS http://*:5000---> Running in 403d8e2e25a6---> 16b7bd572410
Removing intermediate container 403d8e2e25a6
Step 7 : ENTRYPOINT dotnet run---> Running in 0294f87ce3fd---> 532e44a7fd54
Removing intermediate container 0294f87ce3fd
Successfully built 532e44a7fd54
[root@iZ288a3qazlZ HelloDocker.Web]# docker run -d -p 80:5000 hellodocker.web
9d28bb3fa553653e4c26bf727715c82a837a2c224a0942107f3fab08c0a2686d
[root@iZ288a3qazlZ HelloDocker.Web]# curl -i http://localhost
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 14:23:15 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked

至此,我们借助Docker就完美的完成了.NET Core项目的容器化部署。

结束了?还没有!

我打包的镜像是保存在本地的,我如何把镜像部署到其他机器上呢?请继续看。

6. 推送镜像到仓库

在第三节中,我们就简要介绍了,有个Registry是专门用来存储镜像的。请自行到Docker Hub注册个账号,然后我们把本地打包的镜像放到自己账号下的仓库下不就得了?!
注册完毕后,执行docker login

[root@iZ288a3qazlZ HelloDocker.Web]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: shengjie
Password:
Login Succeeded
[root@iZ288a3qazlZ HelloDocker.Web]# docker imagesREPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellodocker.web             latest              532e44a7fd54        13 minutes ago      1.745 GB

再执行docker push

$ docker push hellodocker.web
Error response from daemon: You cannot push a "root" repository. Please rename your repository to docker.io/<user>/<repo> (ex: docker.io/shengjie/hellodocker.web)

推送失败,提示我们的镜像命名不符规范。原来在推送之前要把镜像按<user>/<repo>格式来命名。那如何重命名呢,我们用打标签的方式重命名:

$ docker tag hellodocker.web shengjie/hellodocker.web:v1
$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellodocker.web                      latest              532e44a7fd54        35 minutes ago      1.745 GB
shengjie/hellodocker.web          v1                  532e44a7fd54        35 minutes ago      1.745 GB
$ docker push shengjie/hellodocker.web
The push refers to a repository [docker.io/shengjie/hellodocker.web]774b128a8c4f: Pushed7bf42a9b5527: Pushedbd7f01c2dc6f: Pushed
....

换一台机器,我们直接执行以下命令,就完成了多重部署。

docker run -p 80:5000 <username>/hellodocker.web:v1

7.最后

如果你一步一步跟着练习的话,相信你对Docker以及.NET Core的跨平台特性有了初步的理解,也相信你对Docker的Build, Ship, and Run Any App, Anywhere有了更深的体会。

本文的实战演练就先到这里,下一篇,我们来看如何借助Docker使用Nginx完成.NET Core Web项目的反向代理!!!

参考资料

Hello Docker
HOSTING .NET CORE ON LINUX WITH DOCKER - A NOOB'S GUIDE
Docker命令收集
Linux常用命令

原文地址:https://www.cnblogs.com/sheng-jie/p/8107877.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

Netty面试题(2020最新版)

转载自 Netty面试题&#xff08;2020最新版&#xff09; 1.Netty 是什么&#xff1f; Netty是 一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的&#xff0c;它封装了jdk的nio&#xff0c;让我们使用起来更加…

.NET开源三周年

3 年前&#xff0c;微软宣布开源 .NET 框架的大部分内容。正如Scott Hanselman在Connect 2016主题演讲中所说的那样&#xff0c;微软一直在做重大贡献&#xff1a;开源 .NET 框架并不总是一帆风顺的&#xff0c;可以肯定的说&#xff0c;总是会遇到一些困难。在过去的三年中&am…

Viewpager的使用

第一&#xff1a; 首先在activity_main中加入Viewpager控件 <androidx.viewpager.widget.ViewPagerandroid:layout_width"match_parent"android:layout_height"match_parent"android:id"id/viewPager"></androidx.viewpager.widget.Vi…

消息中间件MQ与RabbitMQ面试题(2020最新版)

转载自 消息中间件MQ与RabbitMQ面试题&#xff08;2020最新版&#xff09; 为什么使用MQ&#xff1f;MQ的优点 简答 异步处理 - 相比于传统的串行、并行方式&#xff0c;提高了系统吞吐量。 应用解耦 - 系统间通过消息通信&#xff0c;不用关心其他系统的处理。 流量削锋 …

IdentityServer4 第三方快速入门和示例

这些示例不由IdentityServer团队维护。 IdentityServer团队提供链接到了社区示例&#xff0c;但不能对示例做任何保证。 如有问题&#xff0c;请直接与作者联系。各种ASP.NET Core安全示例https://github.com/leastprivilege/AspNetCoreSecuritySamplesIdentityServer4 EF 和 A…

开发规范以及注意点

preiteer在保存时不格式化文件 Vscode回车到下一行的时候&#xff0c;不保留缩进 加上这一句即可 "editor.autoIndent": "keep",<template><div class"strategy-edit" v-loading"loading"><el-formclass"strateg…

Java并发编程面试题(2020最新版)

转载自 Java并发编程面试题&#xff08;2020最新版&#xff09; 基础知识 并发编程的优缺点 为什么要使用并发编程&#xff08;并发编程的优点&#xff09; 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到…

.NET Core容器化之多容器应用部署@Docker-Compose

1.引言紧接上篇.NET Core容器化Docker&#xff0c;这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理&#xff0c;然后再介绍多容器应用的部署问题。2. Why Need Nginx.NET Core中默认的Web Server为Kestrel。Kestrel is great for serving dynamic content from …

ServerSuperIO Designer IDE 发布,打造物联网通讯大脑,随心而联。附:C#驱动源代码。

1.概况注&#xff1a;ServerSuperIO Designer IDE 同行业网友随便使用&#xff0c;不涉及到软件使用限制的问题。从2015年到现在的将近两年的时间&#xff0c;一直在开发、完善ServerSuperIO&#xff08;SSIO&#xff09;的基础框架&#xff0c;包括&#xff1a;多通讯机制、稳…

MySQL数据库面试题(2020最新版)

转载自 MySQL数据库面试题&#xff08;2020最新版&#xff09; 数据库基础知识 为什么要使用数据库 数据保存在内存 优点&#xff1a;存取速度快 缺点&#xff1a;数据不能永久保存 数据保存在文件 优点&#xff1a;数据永久保存 缺点&#xff1a;1&#xff09;速度比内…

分布式系统的消息服务模式简单总结

在一个分布式系统中&#xff0c;有各种消息的处理&#xff0c;有各种服务模式&#xff0c;有同步异步&#xff0c;有高并发问题甚至应对高并发问题的Actor编程模型&#xff0c;本文尝试对这些问题做一个简单思考和总结。一、消息的“推、拉模式” 在传统的Client/Server结构中&…

Spring Cloud面试题(2020最新版)

转载自 Spring Cloud面试题&#xff08;2020最新版&#xff09; 为什么需要学习Spring Cloud 不论是商业应用还是用户应用&#xff0c;在业务初期都很简单&#xff0c;我们通常会把它实现为单体结构的应用。但是&#xff0c;随着业务逐渐发展&#xff0c;产品思想会变得越来…

《Office 365 开发入门指南》

终于等来了这一天&#xff0c;可以为我的这本新书画上一个句号。我记得是在今年的2月份从西雅图回来之后&#xff0c;就萌发了要为中国的Office 365开发人员写一些东西并最终能帮到更多中国用户的想法&#xff0c;而从2月26日正式写下了第一篇&#xff0c;到今天正好是整整十个…

助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品

1&#xff0e;概述经过两年多团体的努力&#xff0c;四个产品终于面世了&#xff0c;做产品不容易&#xff0c;做好产品更不容易&#xff0c;最终形成了体系化的解决方案。下面具体介绍。行业大数据平台以及工业互联网平台的发展是必然趋势&#xff0c;结合自己的工作经验&…

基于百度AI实现 车牌识别

前言目前百度的AI接口相对完善&#xff0c;对于文字识别类的操作还需要开发者一一去尝试&#xff0c;去评估这效果到底是怎么的。文字识别的接口相对简单&#xff0c;官方提供的SDK也集成很好&#xff0c;笔者只是在这上面做了一些前期性的功能数据校验和过滤&#xff0c;以及返…

面试官问我:Redis 内存满了怎么办

转载自 想不到&#xff01;面试官问我&#xff1a;Redis 内存满了怎么办 Redis占用内存大小 Redis的内存淘汰 LRU算法 LRU在Redis中的实现 LFU算法 问题 Redis占用内存大小 我们知道Redis是基于内存的key-value数据库&#xff0c;因为系统的内存大小有限&#xff0c;所以…

开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面

NanUI是什么NanUI基于ChromiumFX项目进行开发&#xff0c;它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面&#xff08;类似Electron&#xff09;。同时NanUI提供了原生窗口和定制化的无标题栏无边框窗口&#xff0c;你能使用全部的网页技术…

ThreadPoolExecutor 八种拒绝策略,对的,不是4种

转载自 ThreadPoolExecutor 八种拒绝策略&#xff0c;对的&#xff0c;不是4种 前言 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了&#xff0c;jdk1.5 新增的 java.util.concurrent 包下的这个 api&#xff0c;大大的简化了多线程代码的开发。而不论你用 Fixed…

采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)

前言之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. ASP.NET Core之跨平台的实时性能监控ASP.NET Core之跨平台的实时性能监控(2.健康检查)今天我们主要来介绍一下,如何使用Opserver监控我们的服务器状态.Opserver的功能其实很强大,他可以用于连接任何支持…

Net Core中数据库事务隔离详解——以Dapper和Mysql为例

事务隔离级别.NET Core中的IDbConnection接口提供了BeginTransaction方法作为执行事务&#xff0c;BeginTransaction方法提供了两个重载&#xff0c;一个不需要参数BeginTransaction()默认事务隔离级别为RepeatableRead;另一个BeginTransaction(IsolationLevel il)可以根据业务…