编写第一个 .NET 微服务

介绍

本文的目的是:通过创建一个返回列表的简单服务,并在 Docker 容器中运行该服务,让您熟悉使用 .NET 创建微服务的构建过程。

安装 .NET SDK

要开始构建 .NET 应用程序,首先下载并安装 .NET Core SDK(软件开发工具包)。

根据操作系统的类型下载并安装对应版本的 .NET Core SDK v3.1: 

  • .NET SDK (64-位):https://dotnet.microsoft.com/download/dotnet-core/thank-you/sdk-3.1.401-windows-x64-installer

  • .NET SDK (32-位):https://dotnet.microsoft.com/download/dotnet-core/thank-you/sdk-3.1.401-windows-x86-installer

检查安装是否正确

.NET SDK 安装完成后,打开一个命令提示符窗口并运行以下命令:

dotnet

如果命令运行时,打印出的信息是介绍如何使用 dotnet,说明安装正确。

创建您的服务

创建一个应用

在命令提示符窗口运行以下命令:

dotnet new webapi -o myMicroservice --no-https
cd myMicroservice

第一行中 dotnet 命令创建了一个 webapi(一个 REST API 终端)类型的“新”应用。

  • 参数 -o 创建一个名为 myMicroservice 的目录,用于存储应用程序。

  • 标记 --no-https 创建一个不需要 HTTPS 证书就可以运行的应用程序,以便简化部署。

使用 cd myMicroservice 命令进入新建应用程序的目录。

生成的代码

可以看到,在 myMicroservice 目录中创建了几个文件,为您提供了一个可以运行的简单服务。

  • myMicroservice.csproj 定义了项目引用的库等。

  • Startup.cs 包含应用程序启动时加载的所有设置和配置。

  • Controllers/WeatherForecastController.cs 有一个简单 API 的代码,可以返回未来 5 天的天气预报(模拟数据)。

Controllers/WeatherForecastController.cs 文件中代码:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}
}

运行您的服务

确保命令提示符定位在 myMicroservice 目录中,运行以下命令:

dotnet run

命令完成后,在浏览器中打开『http://localhost:5000/WeatherForecast』

恭喜,您已经运行了一个简单的服务。

安装 Docker

Docker 是一个平台,它可以让你将一个应用程序及其配置和依赖项组合成一个叫作容器的单独的、可独立部署的单元。

下载并安装 Docker Desktop

请参阅我之前翻译的 Docker 快速入门(一)

或者查看这篇文章:
https://ittranslator.cn/backend/docker/2020/06/19/quickstart-1.html

检查 Docker 是否可用

安装完成后,打开一个新的命令提示符窗口并运行以下命令:

docker --version

若命令运行后,显示一个版本信息,那么表示 Docker 安装成功了。

添加 Docker 元数据

要运行 Docker 镜像,需要一个 Dockerfile —— 一个文本文件,其中包含如何将应用构建为 Docker 镜像的指令。Docker 镜像包含将您的应用作为 Docker 容器运行所需的所有内容。

添加 Dockerfile 文件

在 myMicroservice 目录中,使用文本编辑器(推荐使用 Visual Studio Code)创建一个名为 Dockerfile 的文件,包含以下内容:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY myMicroservice.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c release -o /appFROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "myMicroservice.dll"]

注意:确保将文件命名为 Dockerfile(没有扩展名),而不是 Dockerfile.txt 或其他名称。

添加 .dockerignore 文件(可选的)

.dockerignore 文件可以减少 docker build 过程中使用的文件集,文件越少则构建越快。

在文本编辑器中创建一个名为 .dockerignore 的文件(这个文件类似于 .gitignore 文件,如果你熟悉的话),包含以下内容:

Dockerfile
[b|B]in
[O|o]bj

创建 Docker 镜像

运行以下命令:

docker build -t mymicroservice .

docker build 命令使用 Dockerfile 构建 Docker 镜像。

  • 参数 -t mymicroservice 告诉命令标记(或命名)镜像为 mymicroservice

  • 最后一个参数告诉命令使用哪个目录来查找 Dockerfile (. 指定当前目录)。

译者注:
如果是第一次在本机上创建基于 mcr.microsoft.com/dotnet/core/sdk:3.1 和 mcr.microsoft.com/dotnet/core/aspnet:3.1 的镜像,构建 mymicroservice 镜像将会是一个漫长的过程,因为从官方 Docker 注册表拉取镜像实在是太慢了!耐心等待,终会成功的,我已经实践过了。

等待镜像构建完成,可以运行下面的命令来查看计算机上可用的所有镜像的列表,包括您刚刚创建的 mymicroservice 镜像。

docker images

运行 Docker 镜像

您可以使用下面的命令在容器中运行您的应用:

docker run -it --rm -p 3000:80 --name mymicroservicecontainer mymicroservice

可选地,您可以在单独的新的命令提示符窗口中输入下面的命令查看正在运行的容器:

docker ps

在运行 docker run 命令后,您可以在浏览器中输入 URL『http://localhost:3000/WeatherForecast』来访问正在容器中运行的应用程序。

恭喜!您已经成功地创建了一个可以使用 Docker 容器部署和缩放的小型、独立的服务。

以上这些就是微服务的基本构建块。

作者 :Microsoft 官网 
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

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

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

相关文章

模板编译template的背后,究竟发生了什么事?带你了解template的纸短情长

解析模板编译template的背后发生了什么一、&#x1f4d1;初识模板编译1、vue组件中使用render代替template2、模板编译总结二、✏️感受模板编译的美1、with语法&#xff08;1&#xff09;例子展示&#x1f330;&#xff08;2&#xff09;知识点归纳三、&#x1f4c8;编译模板1…

leetcode24. 两两交换链表中的节点(思路+解析)

一:题目 二:思路 思路: 1.分析题意 这是相邻结点进行交换 如果是4个结点 那么1和2交换 3和4交换 如果是3个结点 那么就1和2进行交换 3不动 2.这里我们定义一个虚拟头节点方便操作&#xff0c;我们只需三步实现结点的交换 <1>:让虚拟结点指向第二个结点(进行交换的结点我…

把Autofac玩的和java Spring一样6

大家好&#xff0c;今天来介绍我开源的一个autofac.Annotation项目 源码&#xff1a;https://github.com/yuzd/Autofac.Annotation本项目是autofa的一个扩展组件&#xff0c;autofac是一个老牌的DI容器框架 &#xff0c;支持netframework和netcoreAnnotdation是注解的意思&…

『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!

浅谈软件测试中的性能测试一、&#x1f92a;性能测试概念1、为什么要有性能测试&#xff1f;2、性能测试是什么&#xff1f;3、性能测试的目的二、&#x1f910;性能测试指标1、响应时间2、吞吐量3、并发用户数4、TPS(Transaction Per Second)5、点击率6、资源利用率三、&#…

CLR的简单理解

CLR加载程序生成进程&#xff0c;一个进程中可以存在多个线程&#xff0c;当创建一个线程时&#xff0c;会分配1Mb的空间&#xff0c;也就是线程的栈空间&#xff0c;对应jvm的虚拟机堆栈&#xff0c;是线程执行过程中用到的工作内存。这片内存用于方法传递实参&#xff0c;并存…

『软件测试6』bug一两是小事,但安全漏洞是大事!

详解软件测试中的安全测试一、&#x1f4bf;安全测试概念1、安全测试概述2、安全测试与软件生命周期的关系3、常规测试与安全测试的不同&#xff08;1&#xff09;测试目标不同&#xff08;2&#xff09;假设条件不同&#xff08;3&#xff09;思考域不同&#xff08;4&#xf…

我们真的需要JWT吗?

JWT&#xff08;JSON Web Token&#xff09;是目前最流行的认证方案之一。博客园、各种技术公众号隔三差五就会推一篇JWT相关的文章&#xff0c;真的多如牛毛。但我对JWT有点困惑&#xff0c;今天写出来跟大家探讨探讨&#xff0c;不要喷哈。JWT原理本文默认读者已经对JWT有所了…

leetcode面试题 02.07. 链表相交

一:题目 二:思路 1.这道题我们是需要找到一个结点&#xff0c;并且从这个结点往后的结点都相等 2.我们需要将两个链表 右对齐 3.然后将长链表的指针移动到和短链表头结点相同的位置 4.接下来就是比较指针&#xff0c;当一个指针相同也就意味着往后的结点的数值也相等 三:上码…

详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务

队列在前端中的应用一、队列是什么二、应用场景三、前端与队列&#xff1a;事件循环与任务队列1、event loop2、JS如何执行3、event loop过程4、 DOM 事件和 event loop5、event loop 总结四、宏任务和微任务1、引例2、宏任务和微任务&#xff08;1&#xff09;常用的宏任务和微…

终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

一&#xff1a;背景1. 讲故事前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton&#xff0c;Transient&#xff0c;Scoped&#xff0c;挺有意思&#xff0c;这篇就来聊一聊这一话题&#xff0c;自从 core 中有了 S…

leetcode142. 环形链表 II(暴力+双链表)

一:题目 二:思路 1.双指针 快慢指针(快指针一次一个结点&#xff0c;慢指针一次两个结点) 2.如果有环的话&#xff0c;那么快慢指针肯定会相遇 3.那么相遇的地点一定在环中 因为如果没有环的话慢指针是永远追不到快指针的 4.接下来就是判断出口在那里&#xff0c;我们定义一个…

动态 Restful API 生成

介绍通常在DDD开发架构中&#xff0c;我们写完服务层需要在控制器中写API&#xff0c;今天介绍一个组件 Plus.AutoApi 可以用它来动态生成 Restful 风格的 WebApi&#xff0c;不用写 Controller。快速使用在你的应用服务层中添加组件Install-Package Plus.AutoApi在 Startup 中…

卷死了!再不学vue3就没有人要你了!速来围观vue3新特性

一文全面了解vue3新特性一、&#x1f636;vue3比vue2有什么优势&#xff1f;二、&#x1f9d0;Vue3升级了哪些重要的功能1、createApp2、emits(父子组件间的通信)&#xff08;1&#xff09;通信方式&#xff08;2&#xff09;举个例子&#x1f330;3、多事件处理4、Fragment5、…

idea报错Class not found (在target中没有生成对应的class文件)

一&#xff1a;问题描述 二:解决 既然他不自动生成&#xff0c;那么我们就手动导入&#xff1b; 点击后应用 然后再次运行我们的测试用例&#xff1b;如果不行 再取消勾选 然后再运行我们的测试用例

敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs

一文了解Composition API新特性&#xff1a;ref、toRef、toRefs一、&#x1f64e;如何理解ref、toRef和toRefs1、ref、toRef和toRefs是什么&#xff08;1&#xff09;ref1&#xff09;ref是什么2&#xff09;举个例子&#x1f330;&#xff08;2&#xff09;toRef是什么1&#…

C# 枚举转列表

C# 枚举转列表独立观察员 2020 年 9 月 1 日今天有朋友问我&#xff0c;ComboBox 怎么绑定一个 Enum&#xff0c;其实他的意思是枚举如何转换为列表。想想这确实是一个挺正常的需求&#xff0c;但我一时也只想到遍历&#xff0c;他觉得麻烦&#xff0c;于是我在网上帮忙查了一下…

leetcode242. 有效的字母异位词(两种方法map或数组)

一:题目 二:上码 1:方法一&#xff08;map解法&#xff09; class Solution { public:bool isAnagram(string s, string t) {/**思路:1.分析题意&#xff0c;这个是要判断t中的字符出现次数和s中字符出现的次数相同2.可以用map<char,int>来做*/map<char,int>m1,m…

活久见!月薪30k的小程序全栈开发到底有多难?

10年前&#xff0c;公司的标配是门户网站&#xff0c;造就了一批网站工作室。随着移动互联网大潮兴起&#xff0c;App又成了企业标配&#xff0c;IOS和Android开发赚的盆满钵满。然而App导致的手机内存告急&#xff0c;无止尽的信息推送&#xff0c;让微信小程序应运而生。然而…

卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!

vue3进阶新特性一、&#x1f4d7;watch和watchEffect1、watch和watchEffect的区别2、举个例子&#xff08;1&#xff09;wtach监听&#xff08;2&#xff09;watchEffect监听二、&#x1f4d8;setup如何获取组件实例&#xff08;1&#xff09;为什么需要获取组件实例&#xff0…

leetcode349. 两个数组的交集(思路+详解)

一:题目 二:上码 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {/**思路:本题我们采用的哈希表数据结构是unordered_set,没有用数组因为我们不确定给出的数组中数值的范围如果 强上会出现空间的大量…