.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…

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

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

【现代密码学】笔记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项…

报错解决: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然…

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;自动化测试工具可以减少人…

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

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

Linux CentOS 7.6安装JDK详细保姆级教程

一、检查系统是否自带jdk java --version 如果有的话&#xff0c;找到对应的文件删除 第一步&#xff1a;先查看Linux自带的JDK有几个&#xff0c;用命令&#xff1a; rpm -qa | grep -i java第二步:删除JDK&#xff0c;执行命令&#xff1a; rpm -qa | grep -i java | xarg…

企业的 Android 移动设备管理 (MDM) 解决方案

移动设备管理可帮助您在不影响最终用户体验的情况下&#xff0c;通过无线方式管理和保护组织的移动设备群&#xff0c;现代 MDM 解决方案还可以控制 App、内容和安全性&#xff0c;因此员工可以毫无顾虑地在托管设备上工作。移动设备管理软件可有效管理个人设备上的公司空间。M…

优化CentOS 7.6的HTTP隧道代理网络性能

在CentOS 7.6上&#xff0c;通过HTTP隧道代理优化网络性能是一项复杂且细致的任务。首先&#xff0c;我们要了解HTTP隧道代理的工作原理&#xff1a;通过建立一个安全的隧道&#xff0c;HTTP隧道代理允许用户绕过某些网络限制&#xff0c;提高数据传输的速度和安全性。然而&…

工业交换机在智慧水务和水处理中的应用

智慧水务是一种基于互联网和物联网技术的水务管理模式。它利用现代信息技术&#xff0c;将传统的水务管理模式升级&#xff0c;实现智慧化的水务管理方式。智慧水务的实现离不开各种先进的技术手段。物联网技术是智慧水务的重要组成部分。通过在水务系统中部署工业交换机、传感…

C/C++调用matlab

C/C调用matlab matlab虽然可以生成C/C的程序&#xff0c;但其能力很有限&#xff0c;很多操作无法生成C/C程序&#xff0c;比如函数求解、优化、拟合等。为了解决这个问题&#xff0c;可以采用matlab和C/C联合编程的方式进行。使用matlab将关键操作打包成dll环境&#xff0c;再…

MySQL 存储引擎全攻略:选择最适合你的数据库引擎

1. MySQL的支持的存储引擎有哪些 官方文档给出的有以下几种&#xff1a; 我们也可以通过SHOW ENGINES命令来查看&#xff1a; 还可以通过ENGINES表查看 2. 存储引擎比较 我们通过存储引擎表来看各自的优点&#xff1a; InnoDB 默认的存储引擎&#xff08;SUPPORT字段为D…

广东做“人工心脏”可以报销啦

&#xff08;人民日报健康客户端记者 杨林宋&#xff09;1月5日&#xff0c;据南方医科大学珠江医院消息&#xff0c;医院为一位57岁患者处于心衰终末期的患者&#xff0c;植入一款国产“人工心脏”——左心室辅助装置。据了解&#xff0c;这是该款“人工心脏”纳入广东省医保准…