前言:简单介绍微服务中服务注册与发现的配置使用
一,微服务中的服务注册与发现
分布式微服务架构中一个应用可能由一组职责单一化的服务组成, 所以服务需要一个统一的管理中间件,往上可以为方便服务之间的调用,往下可以便于服务的水平扩展以及服务状态的管理。
服务的注册:为每一个服务实例提供注册的服务组件(比如zookeeper\consul),为服务发现提供可用服务的目录
服务的发现:服务模块能够被其他调用及时发现
二,微服务中的Consul
1,什么是Consul
Consul 是HashiCorp公司推出的开源工具,由Go语言开发的服务网格解决方案,提供具有服务发现、配置和分段功能的全功能控制平面
2,Consul的特点
服务发现:Consul 的客户端可以注册一个服务,例如 api或mysql,其他客户端可以使用 Consul 来发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。
健康检查:Consul 客户端可以提供任意数量的健康检查,要么与给定的服务相关联(“网络服务器是否返回 200 OK”),要么与本地节点(“存 利 用 率 低 于 90%”)相关联。操作员可以使用此信息来监视集群健
康状况,并且服务发现组件可以使用它来将流量从不健的主 机 路由 出 去。
KV 存储:应用程序可以将 Consul 的分层键/值存储用于多种目的,包括动态配置、功能标记、协调、领导选举等。简单的 HTTP API 使其易于使 用。
安全服务通信:Consul 可以为服务生成和分发 TLS 证书,以建立相互的 TLS 连接。 意图 可用于定义允许哪些服务进行通信。可以通过实时更 意 图 轻 松 管 理 服 务 分段,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
三,Consul的简单使用
1,安装:直接在官网下载解压即可 (Consul官网:https://www.consul.io/)
2,运行 在consul.exe目录下打开命令行执行 consul.exe agent -dev,然后浏览器访问:http://localhost:8500/
3,项目中使用:
(1)首先Nuget安装一下Consul:
(2)添加注册配置:
、 ConsulSetHelper:
public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime) { var list = ConsulSetting.List(); if (list != null && list.Count > 0) { foreach (var item in list) { var consulClient = new ConsulClient(c => { //consul地址 c.Address = new Uri(item.ConsulAddress); }); var registration = new AgentServiceRegistration() { ID = item.ID,//服务实例唯一标识 Name = item.ServiceName,//服务名 Address = item.ServiceIP, //服务IP Port = item.ServicePort,//服务端口 Check = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔 HTTP = $"http://{item.ServiceIP}:{item.ServicePort}{item.ServiceHealthCheck}",//健康检查地址 Timeout = TimeSpan.FromSeconds(5)//超时时间 } }; //服务注册 consulClient.Agent.ServiceRegister(registration).Wait(); //应用程序终止时,取消注册 lifetime.ApplicationStopping.Register(() => { consulClient.Agent.ServiceDeregister(registration.ID).Wait(); }); } } return app; }
服务注册就是把服务的基础信息插入到consul中,同一集群的服务建议使用相同的Name
Startup:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); //服务注册与发现 app.RegisterConsul(lifetime); app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); }); }
运行效果:
到这个界面就说明服务已经注册成功,其中consul 是系统默认的实例,OrderService(单机)和ProductService(集群) 为测试实例
4,consul服务监听--Watches
低故障率高可用的系统都不离不开一个及时的健康监控,consul 不仅提供了服务注册与发现、安全服务通信、多数据中心等功能,还有Watches机制,
添加一个server.json配置文件
{ "watches": [ { "type": "checks",//监听类型 "state": "critical",//监控服务的状态值:Passing,Warning,Critical "handler_type": "http", "http_handler_config": { "path": "http://localhost:6001/home/get",//通知路径 "method": "get",//通知请求类型 "header": { "x-foo": [ "XX", "XX" ] }, "timeout": "10s", "tls_skip_verify": true } } ] }
Watches支持如下类型:
- Key – 监视指定K/V键值对
- Keyprefix – Watch a prefix in the KV store
- Services – 监视服务列表
- nodes – 监控节点列表
- service – 监视服务实例
- checks- 监视健康检查的值
- event – 监视用户事件
加上监听之后需要修改启动命令:consul.exe agent -config-dir=server.json -dev,server.json和consul.exe放在同一目录
下一篇 Ocelot中的服务发现、注册、健康检查以及简单的服务治理
--------to be continue --------