.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.hqwc.cn/news/336339.html

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

相关文章

10.文件上传

Spring MVC 为 文 件 上 传 提 供 了 直 接 的 支 持 &#xff0c; 这 种 支 持 是 通 过 即 插 即 用 的MultipartResolver 实现的。 Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类&#xff1a;CommonsMultipartResolver Spring MVC 上下文中…

什么是活动的DWDM网络?

DWDM系统被认为是一个基于应答器的系统&#xff0c;可以帮助在数据中心互连设置中在站点之间传输大量数据。不同于无源DWDM网络&#xff0c; DWDM网络通常包括OEO、主动DWDM Mux Demux、EDFA、DCM和其他主动WDM组件&#xff0c;更适合远程传输。此外&#xff0c;主动DWDM网络还…

小美的蛋糕切割(美团2024届秋招笔试第一场编程真题)

题目分析&#xff1a;切蛋糕问题切记可以横着切&#xff0c;也可以竖着切。本题目需要快速求得两个矩形的和&#xff0c;可以用二维前缀和数组解决。然后枚举一刀切的位置。 #include <iostream> #include <algorithm> using namespace std; int a[1005][1005]; l…

投稿《证券期货业-测试技术与质量管理》的文章发表了

前一段时间给《证券期货业-测试技术与质量管理》季刊投稿的文章在第32期发表了&#xff0c;题目是《大数据背景下基于信息熵增益率的数据生成》 第一次给行业内专业的机构投稿&#xff0c;过程也算是比较辛苦&#xff0c;已经很少这么正式的编写一篇文章了&#xff0c;经过三轮…

C#封装服务

C#封装服务 新建服务项目&#xff1b;重构 OnStart 和 OnStop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using S…

针对远程40G网络的DWDM解决方案

目前&#xff0c;用户和企业积累的数据量非常巨大&#xff0c;并在不断增长。因此&#xff0c;存储和访问这些数据也变得更加苛刻&#xff0c;需要更高的数据容量和更长距离的数据传输。我们的一个客户正在考虑为现有的40G网络添加DWDM系统&#xff0c;作为一种更严肃的未来技术…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…

web自动化之巩固练习(第九天)

练习1 一.对于这个网址 https://www.51job.com 1.点击搜索 2.输入搜索关键词-python 3.选择工作职能--互联网技术-高级软件工程师 4.地区选择杭州&#xff08;点击地区按钮&#xff0c;把默认的城市取消掉&#xff0c;选择杭州&#xff0c;点击确定按钮&#xff09; 5.打印搜索…

RK3566环境搭建

环境&#xff1a;vmware16&#xff0c;ubuntu 18.04 安装依赖库&#xff1a; sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool expect g patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakero…

信号浪涌保护器的原理和行业应用方案

信号浪涌保护器&#xff08;Surge Protective Device&#xff0c;简称SPD&#xff09;是一种用于限制信号线路中瞬态过电压和分泄浪涌电流的防雷装置&#xff0c;主要用于保护各类信号线路及设备的防雷安全。信号浪涌保护器的原理是利用气体放电管、压敏电阻、齐纳二极管等非线…

一篇文章了解做仿真软件的达索系统-达索代理商

达索系统是一家全球领先的仿真软件公司&#xff0c;致力于为客户提供创新和高效的解决方案。该公司的仿真软件被广泛应用于航空航天、汽车、能源、医疗等领域&#xff0c;为客户提供了强大的工程仿真能力。 达索系统的仿真软件具有多个特点&#xff0c;包括高精度、高效率、易用…

07、Kafka ------ 消息生产者(演示 发送消息) 和 消息消费者(演示 监听消息)

目录 Kafka --- 消息生产者★ 消息★ 消息的分发机制★ 分发到哪个分区★ 轮询策略&#xff08;round-robin&#xff09;★ 使用命令行工具发送消息演示添加消息 Kafka --- 消息消费者★ 消息消费者命令▲ 监听 【指定主题】 的所有消息:▲ 监听 【指定主题、指定分区】的所有消…