.NetCore部署微服务(二)

目录

前言

概念

一 Consul注册服务中心

1.1 consul下载

1.2 consul运行

二 服务注册

2.1 安装Consul包

2.2 修改配置文件 

2.3 注入Consul服务

2.3 修改Controller,增加HealthCheck方法

三 运行服务

3.1 docker运行服务


前言

上一篇讲到微服务要灵活伸缩,需要一种特殊的机制去实现它,这个机制就是服务注册与发现,但是不肯定不是必须的,如果你的服务实例很少,并且非常稳定,那么就没有必要使用服务注册与发现了,毕竟写代码如此麻烦。

概念

什么叫服务注册与发现呢

服务注册:简单理解就是,有那么一个注册中心,我们每一个服务实例启动时,都去注册中心注册一下,告诉注册中心我的地址,端口等信息,同样的服务实例需要删除时,也去注册中心删除一下,注册中心就服务维护这些服务实例的信息。

服务发现:既然注册中心维护了各个服务实例的信息,那么客户端就可以通过注册中心很容易发现服务的变化了。

有了服务注册跟发现,客户端就不用再去配置各个服务实例的地址,就可以改为从注册中心统一获取,那么注册中心又怎么可以保证每个服务实例的可用状态呢,假如某一个实例挂了,我们肯定不可以让该挂掉的实例让客户端获取到,这个时候,就引入了另外一个概念,叫做,健康检查。

健康检查:每个服务都需要提供一个用于健康检查的接口,该接口不具备任何业务功能,服务注册时把这个接口的地址也告诉注册中心,注册中心会定时调用这个接口来检测服务是否正常,如果不正常,则将它移除,这样就可以保证服务的可用性。

常见的服务注册中心有Consul、ZooKeeper、etcd、Eureka。

一 Consul注册服务中心

1.1 consul下载

Consul官网地址:https://www.consul.io/icon-default.png?t=N7T8https://www.consul.io/

Consul提供的主要功能有服务注册与发现,健康检查,K-V存储,多数据中心等等功能。

Consul安装非常简单,在官网,点击download

由于我是在window中测试,所以我选择window版本

Consul安装:下载后,解压即可。解压后只有一个consul.exe可执行文件。

1.2 consul运行

Consul运行命令如下:

cd F:\工具\consul_1.17.1_windows_amd64
 .\consul.exe agent -dev

 运行该命令后,出现如下提示信息:

我们在浏览器中访问地址,http://localhost:8500/ 以判断我们的Consul服务是否运行成功。

访问结果如下:

这表示我们的consul已经运行成功了。

二 服务注册

2.1 安装Consul包

consul安装完成后,我们需要修改我们的服务实例的代码。

我们需要使用Nuget安装一下consul。

这个类库封装了consul的api方法,方便我们直接调用,当然你也可以直接写http请求去调用consul的接口。

接口文档说明:Consul HTTP API Overview | Consul | HashiCorp DeveloperLearn about the Consul REST API, which is the primary interface to all functionality available in Consul.icon-default.png?t=N7T8https://www.consul.io/api-docs

2.2 修改配置文件 

我们需要在appsettings中添加Consul配置信息

ConsulSetting.json的内容如下:

{"ConsulSetting": {"ServiceName": "OrderService","ServiceIP": "localhost","ServiceHealthCheck": "/healthcheck","ConsulAddress": "http://host.docker.internal:8500", //注意,docker容器内部无法使用localhost访问宿主机器,如果是控制台启动的话就用localhost"ServicePort": "8050"}
}

注意,我们在使用 http://host.docker.internal:8500  

 之前,需要先检测一下当前版本的docker是否支持host.docker.internal,我们需要在DNS查询,输入如下命令

nslookup host.docker.internal

如果您看到类似于以下输出,表示您的 Docker 支持 host.docker.internal

Server:    192.168.65.1
Address 1: 192.168.65.1Name:      host.docker.internal
Address 1: 192.168.X.X   # 宿主机的 IP 地址

如果输出显示了宿主机的 IP 地址,则说明 Docker 支持 host.docker.internal 主机名。

如果查询失败或显示其他错误消息,则可能是因为您的 Docker 版本不支持 host.docker.internal

2.3 注入Consul服务

同时我们还需要注册Consul,我们需要写一个基于IServiceCollection的扩展方法ConsulExtendsion。

ConsulExtendsion的完整代码如下:

namespace ForumOrderApi
{public static class ConsulExtendsion{/// <summary>/// 服务注册到consul/// </summary>/// <param name="services"></param>/// <returns></returns>public static IServiceCollection RegisterConsul(this IServiceCollection services, IConfiguration configuration, IHostApplicationLifetime lifetime){var consulClient = new ConsulClient(c =>{//consul地址c.Address = new Uri(configuration["ConsulSetting:ConsulAddress"]);});var registration = new AgentServiceRegistration(){ID = Guid.NewGuid().ToString(),//服务实例唯一标识Name = configuration["ConsulSetting:ServiceName"],//服务名Address = configuration["ConsulSetting:ServiceIP"], //服务IPPort = int.Parse(configuration["ConsulSetting:ServicePort"]),//服务端口 因为要运行多个实例,端口不能在appsettings.json里配置,在docker容器运行时传入Check = new AgentServiceCheck(){DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔HTTP = $"http://{configuration["ConsulSetting:ServiceIP"]}:{configuration["ConsulSetting:ServicePort"]}{configuration["ConsulSetting:ServiceHealthCheck"]}",//健康检查地址Timeout = TimeSpan.FromSeconds(5)//超时时间}};//服务注册consulClient.Agent.ServiceRegister(registration).Wait();//应用程序终止时,取消注册lifetime.ApplicationStopping.Register(() =>{consulClient.Agent.ServiceDeregister(registration.ID).Wait();});return services;}}
}

同时我们在Program中调用该扩展方法,完整代码如下:

using Consul;
using ForumOrderApi;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();//服务注册
builder.Services.RegisterConsul(builder.Configuration, app.Lifetime);// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();app.UseSwaggerUI();
//}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();

2.3 修改Controller,增加HealthCheck方法

我们还需要修改OrderController方法,我们增加一个serviceport参数,方便我们更好的观察结果,完整代码如下:

namespace ForumOrderApi.Controllers
{[ApiController][Route("order")]public class OrderController : ControllerBase{private readonly ILogger<OrderController> _logger;private readonly IConfiguration _configuration;public OrderController(ILogger<OrderController> logger, IConfiguration configuration){_logger = logger;_configuration = configuration;}[HttpGet(Name = "GetOrder")]public Task<OrderEntity> GetOrder(){return Task.FromResult(new OrderEntity(){date_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),ip_address = Request.HttpContext.Connection.LocalIpAddress?.ToString(),ip_port = Request.HttpContext.Connection.LocalPort.ToString(),service_name = "订单服务",service_port= _configuration["ConsulSetting:ServicePort"]});}}public class OrderEntity{/// <summary>/// 当前时间/// </summary>public string? date_time { get; set; }/// <summary>/// Ip地址/// </summary>public string? ip_address { get; set; }/// <summary>/// Ip端口/// </summary>public string? ip_port { get; set; }/// <summary>/// 服务名称/// </summary>public string? service_name { get; set; }/// <summary>/// 服务端端口/// </summary>public string? service_port { get; set; }}
}

同时我们增加一个HealthCheck的接口,由于该接口只用于返回Ok,所以我们写一个基于app的扩展方法即可,我们可以将代码写入ConsulExtendsion中,完整代码如下:

public static void UseHealthCheckMiddleware(this IApplicationBuilder app, string checkPath = "/healthcheck")
{app.Map(checkPath, applicationBuilder => applicationBuilder.Run(async context =>{context.Response.StatusCode = (int)HttpStatusCode.OK;await context.Response.WriteAsync("OK");}));
}

同样我们需要在Program中注册该方法。

app.UseHealthCheckMiddleware();

 至此就完成了服务注册,取消注册,健康检查等功能的代码编写。

同样的方式我们改造一下产品服务,代码一模一样,这里我就不再重复黏贴了。

三 运行服务

3.1 docker运行服务

我们需要发布项目,然后在docker中运行项目,docker部署我就不再重复了。

然后我们需要在docker中运行实例。

运行OrderService

docker run -d -p 8060:80 --name orderapi1  ordercontainer:1.0 --ConsulSetting:ServicePort="8060"docker run -d -p 8061:80 --name orderapi2  ordercontainer:1.0 --ConsulSetting:ServicePort="8061"docker run -d -p 8062:80 --name orderapi3  ordercontainer:1.0 --ConsulSetting:ServicePort="8062"

运行ProductService

docker run -d -p 8050:80 --name productapi1 productcontainer:1.0 --ConsulSetting:ServicePort="8050"docker run -d -p 8051:80 --name productapi2 productcontainer:1.0 --ConsulSetting:ServicePort="8051"docker run -d -p 8052:80 --name productapi3 productcontainer:1.0 --ConsulSetting:ServicePort="8052"

然后这里注意一下 ConsulSetting:ServicePort="8061"
这里的意思是会替换appsetting.json 文件中的ConsulSetting配置文件中ServicePort的内容,这里可以方便后面启动多实例时指定对应端口,

然后访问 http://localhost:8500 查看Consul查看服务是否注册成功。

至此,6个服务器实例都已运行,并且成功注册到Consul。

随便停止2个服务:

docker stop orderapi1 productapi1

可以看到停止的服务已经在Consul中被移除。注意,这个是我们停止程序时主动调用Consul移除的。

//应用程序终止时,取消注册
lifetime.ApplicationStopping.Register(() =>
{consulClient.Agent.ServiceDeregister(registration.ID).Wait();
});

当然程序发生异常,健康检查不能正确响应的话,Consul也会移除,有一点区别。

那么注册,发现,健康检查功能都完成了,下一步就该考虑客户端如何拿到这些服务实例的地址了

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

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

相关文章

「超级细菌」魔咒或将打破,MIT 利用深度学习发现新型抗生素

作者&#xff1a;加零 编辑&#xff1a;李宝珠、三羊 MIT 利用图神经网络 Chemprop 识别潜在抗生素&#xff0c;特异性杀死鲍曼不动杆菌。 自然界中充满了各种各样的微生物&#xff0c;例如结核杆菌&#xff08;导致肺结核&#xff09;、霍乱弧菌&#xff08;导致霍乱&#…

数据结构实验4:链表的基本操作

目录 一、实验目的 二、实验原理 1. 节点 2. 指针 3.链表的类型 3.1 单向链表 3.2 双向链表 3.3 单向循环链表 3.4 双向循环链表 4. 单链表的插入 4.1 头插法 4.2 尾插法 4.3 在指定位置插入元素 5. 单链表的删除 5.1 删除指定数值的节点 5.2 删除指定位置的节点 …

Pytorch从零开始实战16

Pytorch从零开始实战——ResNeXt-50算法的思考 本系列来源于365天深度学习训练营 原作者K同学 对于上次ResNeXt-50算法&#xff0c;我们同样有基于TensorFlow的实现。具体代码如下。 引入头文件 import numpy as np from tensorflow.keras.preprocessing.image import Ima…

Rust基础类型之布尔类型和字符

布尔类型 Rust 中的布尔类型为 bool&#xff0c;仅仅有两个值&#xff0c;true 和 false。比如下方代码&#xff1a; let flag1 true; let flag2: bool false;字符 Rust 中的字符类型是 char&#xff0c;值用单引号括起来。 fn main() {let char1 z;let char2: char ℤ…

TensorRt(5)动态尺寸输入的分割模型测试

文章目录 1、固定输入尺寸逻辑2、动态输入尺寸2.1、模型导出2.2、推理测试2.3、显存分配问题2.4、完整代码 这里主要说明使用TensorRT进行加载编译优化后的模型engine进行推理测试&#xff0c;与前面进行目标识别、目标分类的模型的网络输入是固定大小不同&#xff0c;导致输入…

Java单元测试 1.SpringBoot 2.普通java工程

1)SpringBoot工程 1.注意&#xff1a;新建SpringBoot工程时&#xff0c;一定要根据你当前的jdk版本选择好SpringBoot的版本&#xff0c;比如&#xff1a;jdk为11&#xff0c;则不能创建3.x的SpringBoot工程&#xff0c;有时候2021版本的idea强制我创建3.x版本的SpringBoot&…

【打卡】牛客网:BM79 打家劫舍(二)

资料&#xff1a; dp.clear()会把dp的size变为0。 assign和insert的对比&#xff1a; v1.assign(v2.begin(), v2.end()); v1.insert(pos,n,elem); //在pos位置插入n个elem数据&#xff0c;无返回值。 v1.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据&#xff0…

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第二部分流加密与CPA多重加密 CPA安全加密方案CPA安全实验、预言机访问&#xff08;oracle access&#xff09; 操作模式伪随机函数PR…

Java微服务系列之 ShardingSphere - ShardingSphere-JDBC

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

复习python从入门到实践——类

复习python从入门到实践——类 学好继承&#xff0c;你就初步学习了程序面向对象啦&#xff5e;本章我依旧为大家整理好了运行的步骤&#xff0c;以及举了尽可能清晰简单的例子为大家展示。 目录 复习python从入门到实践——类1. Syntax注意&#xff1a; 2.修改属性值3.继承4…

报错解决:No module named ‘pytorch_lightning‘ 安装pytorch_lightning

报错记录 执行如下代码&#xff1a; import pytorch_lightning报错&#xff1a; No module named ‘pytorch_lightning’ 解决方式 安装pytorch_lightning包即可。 一般情况下&#xff0c;缺失的包通过pip安装&#xff0c;即&#xff1a; pip install pytorch_lightning然…

C++性能优化简单总结

什么样的代码是高度优化的&#xff1f; 我们先出去数据结构和算法本身的使用。C 的高效代码通常是利用了各种编译器优化和语言特性来最大程度地提高执行效率和资源利用率的代码。我们需要编写编译器友好的代码来让编译器优化或者说编写出不用编译器高度优化优化也能达到同样效果…

1 快速前端开发

1 前端开发 目的&#xff1a;开发一个平台&#xff08;网站&#xff09;- 前端开发&#xff1a;HTML、CSS、JavaScript- Web框架&#xff1a;接收请求并处理- MySQL数据库&#xff1a;存储数据地方快速上手&#xff1a;基于Flask Web框架让你快速搭建一个网站出来。1.快速开发…

HarmonyOS应用开发学习笔记 应用上下文Context 获取文件夹路径

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

14-股票K线图功能-个股日K线SQL分析__ev

需求&#xff1a;统计个股日K线数据&#xff0c;也就是把某只股票每天的最高价&#xff0c;开盘价&#xff0c;收盘价&#xff0c;最低价形成K线图。

山西电力市场日前价格预测【2024-01-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-11&#xff09;山西电力市场全天平均日前电价为231.43元/MWh。其中&#xff0c;最高日前电价为422.21元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

现代软件测试中的自动化测试工具

自动化测试的重要性和优势 引言&#xff1a;随着软件开发的不断发展&#xff0c;自动化测试工具在现代软件测试中扮演着重要角色。提高效率&#xff1a;自动化测试可以加快测试流程&#xff0c;减少人工测试所需的时间和资源。提升准确性&#xff1a;自动化测试工具可以减少人…

二分图最大匹配算法:匈牙利、KM

文章目录 基础定义匹配二分图二分图的矩阵覆盖交错路与增广路匈牙利算法饱和X的匹配不管X、Y求最大匹配KM算法可行顶点标号、相等子图相等子图的若干性质KM算法的正确性基于以下定理:算法流程描述1描述2基础定义 匹配 匹配:给定一个无向图 G = < V , E > G=<V,E>…

基于云平台技术的车外视频隐私合规的浅谈

基于云平台技术的车外视频隐私合规创新旨在确保车外视频数据的合法、合规使用&#xff0c;同时保护个人隐私不受侵犯。以下是基于云平台技术的车外视频隐私合规的创新实践和考虑因素&#xff1a; 实践&#xff1a; 数据采集&#xff1a;对车外视频数据进行采集时&#xff0c;…

PACS医学影像报告管理系统源码带CT三维后处理技术

PACS从各种医学影像检查设备中获取、存储、处理影像数据&#xff0c;传输到体检信息系统中&#xff0c;生成图文并茂的体检报告&#xff0c;满足体检中心高水准、高效率影像处理的需要。 自主知识产权&#xff1a;拥有完整知识产权&#xff0c;能够同其他模块无缝对接 国际标准…