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; } } }