.netcore微服务——项目搭建

在.NET Core中,微服务是一种架构风格,它将应用程序构造为一组小型服务的集合,这些服务都通过HTTP-based API进行通信。每个服务都是独立部署的,可以用不同的编程语言编写,并且可以使用不同的数据存储技术。

微服务的主要优点包括:

  • 增强容错能力:一个服务的故障不会影响其他服务。

  • 增强弹性:可以根据需求增加或减少服务的实例。

  • 增加弹性:使用更适合的语言或工具。

  • 增加敏捷性:每个服务都可以独立于其他服务进行更新和迭代。

以下是一个简单的例子,展示如何在.NET Core中创建一个简单的微服务。

首先,创建一个ASP.NET Core Web 项目作为客户端,两个ASP.NET Core Web API项目作为服务(产品服务和订单服务),添加docker支持,为产品、订单服务添加一些基础代码,就简单的返回一下 服务名称,当前时间,服务的ip、端口

在Docker中运行服务

安装docker客户端

点击启用或关闭 windows 功能,然后勾选上 Hyper-V 以及适用于 Linux 的 Windows 子系统

 安装完客户端后报错:You are trying to start Docker Desktop but you don't have enough memory. Free some memory or change your settings.这是内存不足导致,可以修改docker的配置文件

 在项目根目录打开PowerShell窗口执行:docker build -t productapi -f ./Product.API/Dockerfile .

 运行容器:执行:docker run -d -p 9050:80 --name productservice productapi

查看运行的容器: 执行:docker ps

 产品服务部署成功。

 产品服务部署好了,下面部署一下订单服务,也是同样的流程:

build镜像:docker build -t orderapi -f ./Order.API/Dockerfile .
运行容器:docker run -d -p 9060:80 --name orderservice orderapi

 订单服务也部署完成了。

 在客户端调用

 客户端新建一个web用来测试,客户端需要http请求服务端接口,所以需要一个http请求客户端,这里使用RestSharp

 新建接口和实现IProductService.cs,IOrderService,ProductService,OrderService,并在program.cs里注入服务。

namespace ProjectCore.MVC.Services
{public interface IOrderService{/// <summary>/// 获取产品数据/// </summary>/// <returns></returns>Task<string> GetOrders();}
}
namespace ProjectCore.MVC.Services
{public interface IProductService{/// <summary>/// 获取产品数据/// </summary>/// <returns></returns>Task<string> GetProducts();}
}
using RestSharp;namespace ProjectCore.MVC.Services
{public class OrderService : IOrderService{public async Task<string> GetOrders(){string serviceUrl = "http://localhost:9060";var Client = new RestClient(serviceUrl);var request = new RestRequest("/api/order", Method.Get);var reponse = await Client.ExecuteAsync(request);return reponse.Content;}}
}

using RestSharp;namespace ProjectCore.MVC.Services
{public class ProductService : IProductService{public async Task<string> GetProducts(){string serviceUrl = "http://localhost:9050";var Client = new RestClient(serviceUrl);var request = new RestRequest("/api/product", Method.Get);var reponse = await Client.ExecuteAsync(request);return reponse.Content;}}
}
builder.Services.AddSingleton<IProductService, ProductService>();
builder.Services.AddSingleton<IOrderService, OrderService>();
//HomeController.csusing Microsoft.AspNetCore.Mvc;
using ProjectCore.MVC.Models;
using ProjectCore.MVC.Services;
using System.Diagnostics;namespace ProjectCore.MVC.Controllers
{public class HomeController : Controller{private readonly ILogger<HomeController> _logger;private readonly IProductService _productService;private readonly IOrderService _orderService;public HomeController(ILogger<HomeController> logger, IProductService productService, IOrderService orderService){_logger = logger;_productService = productService;_orderService = orderService;}public async Task<IActionResult> Index(){ViewBag.OrderData = await _orderService.GetOrders();ViewBag.ProductData = await _productService.GetProducts();return View();}public IActionResult Privacy(){return View();}[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]public IActionResult Error(){return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });}}
}
//Index.cshtml
@{ViewData["Title"] = "Home Page";
}<div class="text-center"><h1 class="display-4">Welcome</h1><p>@ViewBag.OrderData</p><p>@ViewBag.ProductData</p>
</div>

 F5启动项目:

 将订单服务停止:

 客户端无法获取订单数据了。

这样可以通过简单的集群来解决,部署多个订单实例

docker run -d -p 9061:80 --name orderservice1 orderapi
docker run -d -p 9062:80 --name orderservice2 orderapi
docker run -d -p 9051:80 --name productservice1 productapi
docker run -d -p 9052:80 --name productservice2 productapi

 然后客户端中做个随机访问服务实例:


using RestSharp;namespace ProjectCore.MVC.Services
{public class ProductService : IProductService{public async Task<string> GetProducts(){string[] serviceUrl = { "http://localhost:9050","http://localhost:9051", "http://localhost:9052" };var Client = new RestClient(serviceUrl[new Random().Next(0, 3)]);var request = new RestRequest("/api/product", Method.Get);var reponse = await Client.ExecuteAsync(request);return reponse.Content;}}
}
using RestSharp;namespace ProjectCore.MVC.Services
{public class OrderService : IOrderService{public async Task<string> GetOrders(){string[] serviceUrl = { "http://localhost:9060", "http://localhost:9061", "http://localhost:9062" };//随机访问一个实例var Client = new RestClient(serviceUrl[new Random().Next(0, 3)]);var request = new RestRequest("/api/order", Method.Get);var reponse = await Client.ExecuteAsync(request);return reponse.Content;}}
}

 但是这样也会存在一个问题,如果正好随机到停止的服务就会导致客户端读不到数据。所以将使用Consul来进行服务的注册与发现。

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

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

相关文章

什么是网络抓取|常见用例和问题

你可能听说过数据被称为现代信息社会的新石油。由于线上信息量庞大&#xff0c;能够有效地收集和分析网页数据已经成为企业、研究人员和开发人员的关键技能。这就是网页抓取技术的用武之地。网页抓取&#xff0c;也称为网页数据提取&#xff0c;是一种强大的技术&#xff0c;能…

IDEA 2018提交Git之后撤销commit

1、选择项目——>右击git——>找到Repostiory——>执行rest head 2、编辑reset head 3、回退到上一个版本&#xff08;HEAD~1&#xff09;&#xff0c;点击reset即可&#xff0c;如果还想继续回滚&#xff0c;再次执行即可

Linux平台x86_64|aarch64架构如何实现轻量级RTSP服务

技术背景 我们在做Linux平台x86_64架构或aarch64架构的推送模块的时候&#xff0c;有公司提出这样的技术需求&#xff0c;希望在Linux平台&#xff0c;实现轻量级RTSP服务&#xff0c;实现对摄像头或屏幕对外RTSP拉流&#xff0c;同步到大屏上去。 技术实现 废话不多说&…

在 Baklib Experience 中实现混合 CMS 架构

“还记得 CMS 主要用于在网页上布局内容吗&#xff1f;当时&#xff0c;这满足了网站管理需求。然而&#xff0c;行业正在发生变化&#xff0c;数字体验平台 Baklib Digital Content Experience 正在引领潮流。继续阅读以了解如何以及详细了解可用于确保全渠道成功的两个原则。…

python笔记和练习----少儿编程课程

第1课&#xff1a; 认识新朋友-python 知识点&#xff1a; 1、在英文状态下编写Python语句。 2、内置函数print()将结果输出到标准的控制台上&#xff0c;它的基本语法格式如下&#xff1a; print("即将输出的内容") #输出的内容要用引号引起来&#xff0c;可…

遗漏知识点

什么是RAII&#xff1f; RAII是Resource Acquisition Is Initialization&#xff08;wiki上面翻译成 “资源获取就是初始化”&#xff09;的简称&#xff0c;是C语言的一种管理资源、避免泄漏的惯用法。利用的就是C构造的对象最终会被销毁的原则。RAII的做法是使用一个对象&am…

DC/AC电源模块在不同的电源类型之间进行转换

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换 电力转换是现代社会不可或缺的一部分&#xff0c;它使我们能够在不同的电源类型之间进行转换&#xff0c;从而满足各种设备和应用的需求。DC/AC电源模块是一种用于将直流电转换为交流电的设备&#xff0c;它在电子设备、太…

[单master节点k8s部署]19.监控系统构建(四)kube-state-metrics

kube-state-metrics 是一个Kubernetes的附加组件&#xff0c;它通过监听 Kubernetes API 服务器来收集和生成关于 Kubernetes 对象&#xff08;如部署、节点和Pod等&#xff09;的状态的指标。这些指标可供 Prometheus 进行抓取和存储&#xff0c;从而使你能够监控和分析Kubern…

软件是什么?一个软件到底是哪些部分组成的-软件到底有哪些分支呢?

https://doc.youyacao.com/117/2163 软件是什么&#xff1f;一个软件到底是哪些部分组成的-软件到底有哪些分支呢&#xff1f; 何为软件 软件定义 的本质是通过软件编程实现硬件资源的虚拟化、灵活、多样和定制化功能&#xff0c;以最大化系统运行效率和能量效率。它基于硬…

VirtualBox的windows server 2016设置主机和虚拟机共享文件夹

文章目录 安装步骤1. windows server 2016安装增强功能2.上述安装完成之后&#xff0c;需要做共享文件夹&#xff0c;在宿主机&#xff0c;新建一个test文件夹&#xff0c;做共享设置&#xff0c;如下图&#xff1a;3.然后打开虚拟机&#xff0c;设置文件共享 安装步骤 1. win…

kafka系列之消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用KafkaListener(其实底层也是poll()方法)时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前所述&#xff0c;Kafka的一…

Java数据结构-树的面试题

目录 一.谈谈树的种类 二.红黑树如何实现 三.二叉树的题目 1.求一个二叉树的高度&#xff0c;有两种方法。 2.寻找二叉搜索树当中第K大的值 3、查找与根节点距离K的节点 4.二叉树两个结点的公共最近公共祖先 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xf…

如何在Qt使用uchardet库

如何在 Qt 中使用 uchardet 库 文章目录 如何在 Qt 中使用 uchardet 库一、简介二、uchardet库的下载三、在Qt中直接调用四、编译成库文件后调用4.1 编译工具下载4.2 uchardet源码编译4.3 测试编译文件4.4 Qt中使用 五、一些小问题5.1 测试文件存在的问题5.2 uchardet库相关 六…

聚合支付系统主要分账方案及API分析

1 常见分账场景介绍 分账一般分为线下场景分账和线上场景分账&#xff0c;分账API分为微信&#xff0c;支付宝或其他第三方支付公司、银行。今天我们主要探讨微信、支付宝线上和线下场景分账流程。 微信分账API分为收付通和线下服务商分账&#xff0c;支付宝分账分为互联网平…

YOLOV++ 详解 | 网络结构、代码解析、YOLOV 论文阅读、初识 VID

前言 代码地址&#xff1a;https://github.com/YuHengsss/YOLOV 本文网络结构按 YOLOV SwinTiny 绘制&#xff0c;不同的模型主要差异在于 Backbone&#xff0c;VID 相关的部分基本相同。 Predict Input 代码基于 vid_demo。首先会读取视频中的所有帧&#xff08;只能用短视频…

c++ 构造,析构,拷贝,移动构造函数

文章目录 概述1.构造函数2. 拷贝构造函数3.移动构造函数4.析构函数 例子QTUE4/5 c 小结 概述 对于c来说&#xff0c;最基础的是类。对于一个类来说&#xff0c;主要由以下函数构成。如下&#xff1a; 构造函数拷贝构造函数移动构造函数析构函数 当然&#xff0c;还有一个操作…

【简历】郑州某二本学院:JAVA实习简历指导,基本没有面试机会

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这份简历是一个25届二本同学找JAVA实习的简历&#xff0c;从整体来看&#xff0c;简历版式没有问题&#xff0c;非常清晰。 但是内容特…

数据操作10-15题(30 天 Pandas 挑战)

数据操作 1. 相关知识点1.12 分组与连表1.13 排名 2. 题目2.10 第N高的薪水2.11 第二高的薪水2.12 部门工资最高的员工2.13 分数排名2.14 删除重复的电子邮箱2.15 每个产品在不同商店的价格 1. 相关知识点 1.12 分组与连表 分组max_salaryemployee.groupby(departmentId)[sal…

搜索+动态规划

刷题刷题刷题刷题 ​​​​​​​​​​​​​​Forgery - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; 需要两个数组&#xff0c;一个数组全部初始化为".",另一个数组输入数据&#xff0c;每碰到一个“.”就进行染色操作&#xff0c;将其周围的…

Java后端每日面试题(day3)

目录 Spring中Bean的作用域有哪些&#xff1f;Spring中Bean的生命周期Bean 是线程安全的吗&#xff1f;了解Spring Boot中的日志组件吗&#xff1f; Spring中Bean的作用域有哪些&#xff1f; Bean的作用域&#xff1a; singleton&#xff1a;单例&#xff0c;Spring中的bean默…