Consul主要的性能出现在服务发现,网络IO是很耗性能的。
下面以本地缓存为案例
/// <summary>
/// consul服务发现实现
/// </summary>
public class ConsulServiceDiscovery : AbstractServiceDiscovery
{public ConsulServiceDiscovery(IOptions<ServiceDiscoveryOptions> options) : base(options){}protected override CatalogService[] RemoteDiscovery(string serviceName){// 1、创建consul客户端连接 2s 1、使用单例全局共享 2、使用数据缓存(进程:字典,集合) 3、使用连接池var consulClient = new ConsulClient(configuration =>{//1.1 建立客户端和服务端连接configuration.Address = new Uri(serviceDiscoveryOptions.DiscoveryAddress);});// 2、consul查询服务,根据具体的服务名称查询var queryResult = consulClient.Catalog.Service(serviceName).Result;// 3、判断请求是否失败if (!queryResult.StatusCode.Equals(HttpStatusCode.OK)){throw new FrameException($"consul连接失败:{queryResult.StatusCode}");}return queryResult.Response;}}
/// <summary>
/// 抽象服务发现,主要是缓存功能
/// </summary>
public abstract class AbstractServiceDiscovery : IServiceDiscovery
{// 字典缓存private readonly Dictionary<string, List<ServiceNode>> CacheConsulResult = new Dictionary<string, List<ServiceNode>>();protected readonly ServiceDiscoveryOptions serviceDiscoveryOptions;public AbstractServiceDiscovery(IOptions<ServiceDiscoveryOptions> options){this.serviceDiscoveryOptions = options.Value;// 1、创建consul客户端连接var consulClient = new ConsulClient(configuration =>{//1.1 建立客户端和服务端连接configuration.Address = new Uri(serviceDiscoveryOptions.DiscoveryAddress);});// 2、consul 先查询服务var queryResult = consulClient.Catalog.Services().Result;if (!queryResult.StatusCode.Equals(HttpStatusCode.OK)){throw new FrameException($"consul连接失败:{queryResult.StatusCode}");}// 3、获取服务下的所有实例foreach (var item in queryResult.Response){QueryResult<CatalogService[]> result = consulClient.Catalog.Service(item.Key).Result;if (!queryResult.StatusCode.Equals(HttpStatusCode.OK)){throw new FrameException($"consul连接失败:{queryResult.StatusCode}");}var list = new List<ServiceNode>();foreach (var service in result.Response){list.Add(new ServiceNode { Url = service.ServiceAddress + ":" + service.ServicePort });}CacheConsulResult.Add(item.Key, list);}}public List<ServiceNode> Discovery(string serviceName){// 1、从缓存中查询consulj结果if (CacheConsulResult.ContainsKey(serviceName)){return CacheConsulResult[serviceName];}else{// 1.2、从远程服务器取CatalogService[] queryResult = RemoteDiscovery(serviceName);var list = new List<ServiceNode>();foreach (var service in queryResult){list.Add(new ServiceNode { Url = service.ServiceAddress + ":" + service.ServicePort });}// 1.3 将结果添加到缓存CacheConsulResult.Add(serviceName, list);return list;}}/// <summary>/// 远程服务发现/// </summary>/// <param name="serviceName"></param>/// <returns></returns>protected abstract CatalogService[] RemoteDiscovery(string serviceName);
}
原本一个接口是3秒的响应时间,通过缓存可以在0.1秒内响应。
本文发布于:2024-02-03 02:11:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170689750547954.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |