首页 > 其他分享 >.netcore微服务——项目搭建

.netcore微服务——项目搭建

时间:2024-07-05 13:28:10浏览次数:17  
标签:服务 netcore http var new docker public 搭建

在.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.cs

using 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来进行服务的注册与发现。

标签:服务,netcore,http,var,new,docker,public,搭建
From: https://blog.csdn.net/yigu4011/article/details/139525687

相关文章

  • 服务器忘记IP后找回IP地址
    在工程现场,我们时常会遇到忘记BMCIP地址的情况,在忘记BMCIP后有两种方法可以帮助我们找回忘记的IP地址1、外接显示器(在服务器开机过程中右下角会显示出IP地址)2、通过抓包软件(Wireshark)来抓取设备发到广播报前提条件服务器先完全断电电脑网口和IPMI口直连,确保正常有速率......
  • 做了一款服务网络安全的多端系统。内置AI(gpt4o)/ai绘画(sd)/ChatTTS,无需登陆免费使用
    上一篇魔盒介绍文章已被我删除,因为本次重新做了产品定位,之前定位有点混乱先上链接之前有个哥们说做了app还不如先做网站,因为不方便下载,这次做了哈。重点:里面有gpt4o,充了几十美元反正也用不完,给大家用了网页端:https://mgb.abyssdawn.com/H5端:https://mgb-h5.abyssdaw......
  • UWA学堂上新|MMO游戏创建加载游戏角色对应服务器数据存储和读取
    课程是《基于.NetCore开发MMORPG分布式游戏服务器》系列课程第5节,课程旨在帮助大家从零开始搭建商业化MMORPG的分布式服务器框架,包括不同种类服务器的线程模型,如中心服务器、网关服务器、游戏服务器、寻路服务器等,并讲解了这些服务器该如何根据各自的职责进行业务模块分工。 ......
  • 服务器安装多个Tomcat
    服务器安装多个Tomcat因为申请了一个域名,然后想设置一个二级域名,让不同的二级域名访问到不同的项目,例如blog.booleandev.xyz访问到博客项目,www.booleandev.xyz访问到主页,网上找了找资料,发现一般是使用nginx反向代理映射到不同的端口,再跳转到不同的项目,因此想到自己的服务器上安装......
  • 基于飞腾FT2000+/64 全国产化 服务器主板
    全国产化飞腾服务器主板:全国产化服务器主板是指在中国自主研发和生产,旨在减少对外部技术依赖并提升信息安全和自主可控性的服务器主板。山东未来通信科技有限公司生产的全国产服务器主板从处理器、芯片组以及元器件,实现了100%的国产化率。以下是这款主板的基本介绍:主板介绍:处......
  • 做了一款服务网络安全的多端系统。内置AI(gpt4o)/ai绘画(sd)/ChatTTS,无需登陆免费使用
    上一篇魔盒介绍文章已被我删除,因为本次重新做了产品定位,之前定位有点混乱先上链接之前有个哥们说做了app还不如先做网站,因为不方便下载,这次做了哈。重点:里面有gpt4o,充了几十美元反正也用不完,给大家用了网页端:https://mgb.abyssdawn.com/H5端:https://mgb-h5.abyssdawn.co......
  • 政务服务网用哪种HTTPS证书
    政务服务网作为连接政府与民众的重要桥梁,承载着提供高效、安全、透明的在线服务的重任。在众多HTTPS证书类型中,政务服务网应当如何选择最合适的证书?一、证书类型推荐OV(组织验证)SSL证书:特点:OVSSL证书需要验证申请证书组织的真实身份,包括组织名称、地址、电话号码等信息。......
  • China.NETConf2019 - 用ASP.NETCore构建可检测的高可用服务
    一、前言2019中国.NET开发者峰会(.NETConfChina2019)于2019年11月10日完美谢幕,校宝在线作为星牌赞助给予了峰会大力支持,我和项斌等一行十位同事以讲师、志愿者的身份公司参与到峰会的支持工作中,我自己很荣幸能够作为讲师与大家交流,分享了主题《用ASP.NETCore构建可检测的高......
  • 智慧矿山EasyCVR视频汇聚系统,助力矿井视频多业务融合及视频转发服务平台建设
    一、方案背景随着矿井安全生产要求的不断提高,视频监控、数据传输、通讯联络等业务的需求日益增长。为满足矿井生产管理的多元化需求,提高矿井作业的安全性和效率,TSINGSEE青犀EasyCVR视频汇聚/安防监控综合管理平台,旨在构建一个矿井视频多业务融合及视频流媒体转发服务平台。该平台......
  • 搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列
    搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列vulfocus简介vulfocus,作为一款前沿的漏洞集成平台,它巧妙地将多种最新的CVE漏洞环境封装于Docker容器之中,便于部署与操作,成为提升安全实战技能的理想靶场。用户既可选择在本地VMware环境中亲手搭建,享受从零到一的......