using GrpcServer = Grpc.Core;
using Grpc.Core;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Linq;
using System.Net.Sockets;
using TEAMModelOS.SDK.Module.GrpcServer.Interfaces;
using TEAMModelOS.SDK.Module.GrpcServer.Extensions;
using Grpc.HealthCheck;
using Grpc.Health.V1;
using TEAMModelOS.SDK.Module.GrpcServer.Internal;
using TEAMModelOS.SDK.Helper.Network.NetworkHelper;
namespace TEAMModelOS.SDK.Module.GrpcServer.Implements
{
public class RpcConfig : IRpcConfig
{
///
/// 注入外部Proto gRPC Service
/// service.Add(MsgService.BindService(new MsgServiceImpl()));
///
private static List _servers { get; set; }
List _grpcServices;
private static List _iPConfig { get; set; }
public static IList> ListInfo { get; } = new List>();
static GrpcServerConfig[] _serverConfigs;
public RpcConfig(GrpcServerConfig[] serverConfigs , GrpcIPConfig iPConfig , IEnumerable grpcServices)
{
_grpcServices = grpcServices.ToList();
_iPConfig = iPConfig.BlackList;
_serverConfigs = serverConfigs;
_servers = new List();
}
public void Start()
{
HealthServiceImpl healthServiceImpl = new HealthServiceImpl();
healthServiceImpl.SetStatus("HealthCheckService", HealthCheckResponse.Types.ServingStatus.Serving);
List services = new List();
List ips = NetHelper.getIPAddress();
ips = ips.Where(a => !_iPConfig.Exists(t => a.Contains(t))).ToList();
var builder = ServerServiceDefinition.CreateBuilder();
_grpcServices.ForEach(grpc => grpc.RegisterMethod(builder));
foreach (GrpcServerConfig config in _serverConfigs) {
foreach (string ip in ips) {
//获取扫描的_grpcServices
_grpcServices.ForEach(grpc => services.Add(new Cnode { Name = grpc.GetType().FullName, Ip = ip, Port = config.Port }));
Server _server = new Server
{
Services = { builder.Build() },
Ports = { new ServerPort(ip, config.Port, ServerCredentials.Insecure) }
};
//获取健康检查
_server.Services.Add(Health.BindService(healthServiceImpl));
services.Add(new Cnode { Port = config.Port, Ip = ip, Name = Health.Descriptor.FullName });
//获取手动注入的
foreach (GrpcServerServiceDefinition definition in config.GrpcServices)
{
_server.Services.Add(definition.ServerServiceDefinition);
Dictionary service = new Dictionary();
Cnode cnode = new Cnode { Port=config.Port, Ip=ip, Name=definition.ServiceDescriptor.FullName};
services.Add(cnode);
}
_server.Start();
_servers.Add(_server);
}
}
ProtoGenerator.Gen("proto");
foreach (IGrouping group in services.GroupBy(c =>c.Name)){
Dictionary dictInfo = new Dictionary();
List nodes = new List();
foreach(Cnode dict in group) {
Node node = new Node { Ip =dict.Ip,Port=dict.Port };
nodes.Add(node);
}
dictInfo.Add("name", group.Key);
dictInfo.Add("node", nodes);
ListInfo.Add(dictInfo);
}
}
}
internal class Cnode
{
public string Ip { get; set; }
public int Port { get; set; }
public string Name { get; set; }
}
internal class Node {
public string Ip { get; set; }
public int Port { get; set; }
}
}