微服务
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。
本质就是用一些功能比较明确、业务比较精练的服务去解决更大、更实际的问题
概念
把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议
定义
围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能使产品交付变得更加简单。
一、服务通信及简介
1.Redis/DB/Queue/硬盘文件
被动式通信,门槛低。
2.WebService/WCF/WebApi/甚至ashx aspx
| 主动触发 | 数据序列化传递 | 跨平台 | 跨语言 | http穿透防火墙 |
|---|
3.RPC-Remote Procedure Call
| .Net Remoting | gRPC |
|---|---|
| .Net平台独有的,不支持跨平台 | 高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计 |
二、Consul 服务发现
核心思想为将集群中每一个服务注册到consul由Consul进行统一管理,提供统一入口由consul代理访问,并可以在代理访问时进行合理的负载均衡策略。
Consul和Nginx简单对比
Consul | 负载均衡(屏蔽实例细节) | 服务注册与发现 | 健康检查 |
|---|
Nginx | 负载均衡(屏蔽实例细节) | 单纯是负载均衡 | 被动获取,有新增的实例需要改变配置文件 |
|---|
1.在服务中注册Consul服务
在.net中需要载nuget下载Consul对应的SDK
public static void ConsulRegist(this IConfiguration configuration)
{
ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "dc1";
});
string ip = configuration["ip"];
int port = int.Parse(configuration["port"]);//命令行参数必须传入
int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);//命令行参数必须传入
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
//Guid.NewGuid(),//唯一的
ID = "service" + ip+":" + port ,
//组名称-Group
Name = "ServiceTest",
//ip地址
Address = ip,
//不同服务实例
Port = port,
//标签 用作负载策略
Tags = new string[] { weight.ToString() },
//配置心跳检查
Check = new AgentServiceCheck()
{
//服务健康检查轮询时间
Interval = TimeSpan.FromSeconds(12),
//心跳服务地址
HTTP = $"http://{ip}:{port}/Api/Health/Index",
//超时时间
Timeout = TimeSpan.FromSeconds(5),
//服务挂掉之后5秒注销服务
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5)
}
}); ;
Console.WriteLine($"http://{ip}:{port}完成注册");
}
2.启动consul服务
@echo off
color 02
consul_1.6.2.exe agent -dev
pause
3.启动api服务
@echo off
color 02
dotnet WebApplication.Core.WebApi.dll --urls="http://*:5177" --ip="127.0.0.1" --port=5177 --weight=3
pause
三、Consul (负载均衡策略)服务调用
获取注册的服务集合array
Uri uri = new Uri("http://ServiceTest/api/users/get");
string groupName = uri.Host;
using (ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "dc1";
}))
var dictionary = client.Agent.Services().Result.Response;
var list = dictionary.Where(k => k.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)) ;
KeyValuePair<string, AgentService> keyValuePair = new KeyValuePair<string, AgentService>();
keyValuePair = list.First();//直接拿的第一个
//服务集合
var array = list.ToArray();
}
1.随机平均策略访问
private static int iSeed = 0;
//随机策略---平均策略
keyValuePair = array[new Random(iSeed++).Next(0, array.Length)];
2.轮询平均策略访问
private static int iSeed = 0;
//随机策略---平均策略
keyValuePair = array[iSeed++ % array.Length];
3.权重策略访问
在注册服务时,设置权重,在分配时获取权重并以此为依据
List<KeyValuePair<string, AgentService>> pairsList = new List<KeyValuePair<string, AgentService>>();
foreach (var pair in list)
{
//得到每一个服务实例设置的权重,然后加入到集合
int count = int.Parse(pair.Value.Tags?[0]);
for (int i = 0; i < count; i++)
{
pairsList.Add(pair);
}
}
keyValuePair = pairsList.ToArray()[new Random(iSeed++).Next(0, pairsList.Count())];
tring resultUrl = $"{uri.Scheme}://{keyValuePair.Value.Address}:{keyValuePair.Value.Port}{uri.PathAndQuery}";
1073

被折叠的 条评论
为什么被折叠?



