当前位置: 首页 > news >正文

Ocelot与.NETcore7.0部署(基于腾讯云)

资料链接:https://download.csdn.net/download/ly1h1/90731290

1.效果

基于Ocelot,实现对3个微服务的轮询调用,实现不停机更新,无缝更新;

2.环境要求

1.部署环境:腾讯云的轻量化应用服务器

2.系统环境:Window Server 2016

3..net托管包:dotnet-hosting-9.0.4-win.exe

3.配置开放端口号

 3.1 端口号说明:端口5000(服务1),端口5001(服务2),端口5002(服务3),端口5010(Ocelot)

3.2 在服务器管理平台上的开放以上4个端口号

2.3 配置入站规则端口号

4.服务1的代码

4.1 Program.cs

var builder = WebApplication.CreateBuilder(args);// 添加Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "ServerAPI1", Version = "v1" });
});builder.WebHost.ConfigureKestrel(serverOptions => { }).UseUrls("http://*:5000"); // 允许所有Hostbuilder.Services.AddControllers();
var app = builder.Build();// 配置Swagger
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ServerAPI1 v1"));
}app.UseRouting();
app.MapControllers();app.Run();

4.2 接口

using Microsoft.AspNetCore.Mvc;
using ServerAPI1.Models;namespace ServerAPI1.Controllers
{[ApiController][Route("api/[controller]")][Produces("application/json")]public class ValuesController : ControllerBase{/// <summary>/// 获取服务基本信息/// </summary>[HttpGet("info")][ProducesResponseType(200)]public IActionResult GetInfo(){return Ok(new { Service = "ServerAPI1", Port = 5000 });}/// <summary>/// 计算服务 (A+B)/// </summary>/// <param name="model">输入参数</param>[HttpPost("calculate")][ProducesResponseType(200)][ProducesResponseType(400)]public IActionResult Calculate([FromBody] TestModel model){if (!ModelState.IsValid) return BadRequest(ModelState);return Ok(new { Result = 123 + 321, Input = model });}}
}

4.2 数据模型

using System.ComponentModel.DataAnnotations;namespace ServerAPI1.Models
{public class TestModel{[Required][StringLength(100)]public string AAA { get; set; }[StringLength(200)]public string BBB { get; set; }}
}

5.服务2的代码

5.1  Program.cs

var builder = WebApplication.CreateBuilder(args);// 添加Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "ServerAPI2", Version = "v1" });
});builder.WebHost.ConfigureKestrel(serverOptions => { }).UseUrls("http://*:5001"); // 允许所有Hostbuilder.Services.AddControllers();
var app = builder.Build();// 配置Swagger
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ServerAPI2 v1"));
}app.UseRouting();
app.MapControllers();app.Run();

5.2 接口

using Microsoft.AspNetCore.Mvc;
using ServerAPI2.Models;namespace ServerAPI2.Controllers
{[ApiController][Route("api/[controller]")][Produces("application/json")]public class ValuesController : ControllerBase{/// <summary>/// 获取服务元数据/// </summary>[HttpGet("info")][ProducesResponseType(200)]public IActionResult GetInfo(){return Ok(new { Service = "ServerAPI2", Port = 8016 });}/// <summary>/// 字符串转换服务/// </summary>/// <param name="model">输入参数</param>[HttpPost("calculate")][ProducesResponseType(200)][ProducesResponseType(400)]public IActionResult Transform([FromBody] TestModel model){if (!ModelState.IsValid) return BadRequest(ModelState);return Ok(new { Result = $"{model.AAA}-{model.BBB}".ToUpper() });}}
}

5.3 数据模型

    using System.ComponentModel.DataAnnotations;namespace ServerAPI2.Models{public class TestModel{[Required][StringLength(100)]public string AAA { get; set; }[StringLength(200)]public string BBB { get; set; }}}

6.服务3的代码

6.1 Program.cs

var builder = WebApplication.CreateBuilder(args);// 添加Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "ServerAPI3", Version = "v1" });
});builder.WebHost.ConfigureKestrel(serverOptions => { }).UseUrls("http://*:5002"); // 允许所有Hostbuilder.Services.AddControllers();
var app = builder.Build();// 配置Swagger
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ServerAPI3 v1"));
}app.UseRouting();
app.MapControllers();app.Run();

6.2 接口

using Microsoft.AspNetCore.Mvc;
using ServerAPI3.Models;namespace ServerAPI3.Controllers
{[ApiController][Route("api/[controller]")][Produces("application/json")]public class ValuesController : ControllerBase{/// <summary>/// 获取服务元数据/// </summary>[HttpGet("info")][ProducesResponseType(200)]public IActionResult GetInfo(){return Ok(new { Service = "ServerAPI4", Port = 8016 });}/// <summary>/// 字符串转换服务/// </summary>/// <param name="model">输入参数</param>[HttpPost("calculate")][ProducesResponseType(200)][ProducesResponseType(400)]public IActionResult Transform([FromBody] TestModel model){if (!ModelState.IsValid) return BadRequest(ModelState);return Ok(new { Result = $"{model.AAA}-{model.BBB}".ToUpper() });}}
}

6.3 数据模型

    using System.ComponentModel.DataAnnotations;namespace ServerAPI3.Models{public class TestModel{[Required][StringLength(100)]public string AAA { get; set; }[StringLength(200)]public string BBB { get; set; }}}

7.Ocelot的代码

7.1 Program.cs

using Ocelot.DependencyInjection;
using Ocelot.Middleware;var builder = WebApplication.CreateBuilder(args);// 强制指定 Kestrel 端口(优先级最高)
builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.ListenAnyIP(5010); // 监听所有IP的5010端口
});builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);var app = builder.Build();
await app.UseOcelot();
app.Run();

7.2 ocelot.json

{"Routes": [{"DownstreamPathTemplate": "/api/values/{action}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "192.168.0.102","Port": 5000}, // ServerAPI1{"Host": "192.168.0.102","Port": 5001} ,// ServerAPI2{"Host": "192.168.0.102","Port": 5002} // ServerAPI3],"UpstreamPathTemplate": "/balanced-api/values/{action}","UpstreamHttpMethod": [ "GET", "POST" ],"LoadBalancerOptions": {"Type": "RoundRobin" // 轮询策略}}],"GlobalConfiguration": {"BaseUrl": "http://192.168.0.102:5010"}
}

8.生成发布文件

8.1 选中发布项目,右键点击发布

8.2 选择文件发布,选择文件路径,部署模式为独立,目标运行时为win-x64。

8.3 生成publish文件

9.文件拷贝到服务器的制定目录下

10.点击5个文件夹内部的exe,即可运行;

相关文章:

  • loads、dumps、jsonpath使用场景
  • 上位机知识篇---二进制操作
  • 科学养生,解锁健康生活密码
  • 【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)
  • 【DeepMLF】具有可学习标记的多模态语言模型,用于情感分析中的深度融合
  • npm命令介绍(Node Package Manager)
  • 2025五一杯数学建模竞赛B题 矿山数据处理 保姆级教程讲解|模型讲解
  • 2025五一杯数学建模ABC题赛题已出
  • SpringAI系列 - 升级1.0.0-M8
  • VBA数据库解决方案第二十讲:Select From Where条件表达式
  • CMake中的“包管理“模块FetchContent
  • 2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)
  • 【CV数据集】DIOR遥感目标检测数据集(含处理好的YOLO、COCO、VOC格式和相关配置文件下载链接)
  • 数字智慧方案5971丨智慧农业大数据平台解决方案(59页PPT)(文末有下载方式)
  • AM剪辑软件汉化版:简单易用,开启视频创作之旅
  • 实现Sentinel与Nacos的规则双向同步
  • 案例:自动化获取Web页面小说(没钱修什么仙)——selenium
  • C++之特殊类设计及类型转换
  • linux下安装ollama网不好怎么办?
  • 【分享】数据恢复大师6.10[特殊字符]恢复手机误删的数据[特殊字符]
  • 全国铁路昨日发送2311.9万人次,同比增长11.7%创历史新高
  • 三大上市猪企:前瞻应对饲料原材料价格波动
  • 内蒙古公开宣判144件毁林毁草刑案,单起非法占用林地逾250亩
  • AI世界的年轻人,如何作答未来
  • 商务部:一季度我国服务贸易较快增长,进出口总额同比增8.7%
  • 葡萄牙总理:未来几小时内将全面恢复供电