RpcConfig.cs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using GrpcServer = Grpc.Core;
  2. using Grpc.Core;
  3. using System.Collections.Generic;
  4. using System.Net.NetworkInformation;
  5. using System.Linq;
  6. using System.Net.Sockets;
  7. using TEAMModelOS.SDK.Module.GrpcServer.Interfaces;
  8. using TEAMModelOS.SDK.Module.GrpcServer.Extensions;
  9. using Grpc.HealthCheck;
  10. using Grpc.Health.V1;
  11. using TEAMModelOS.SDK.Module.GrpcServer.Internal;
  12. using TEAMModelOS.SDK.Helper.Network.NetworkHelper;
  13. namespace TEAMModelOS.SDK.Module.GrpcServer.Implements
  14. {
  15. public class RpcConfig : IRpcConfig
  16. {
  17. /// <summary>
  18. /// 注入外部Proto gRPC Service
  19. /// service.Add(MsgService.BindService(new MsgServiceImpl()));
  20. /// </summary>
  21. private static List<Server> _servers { get; set; }
  22. List<IGrpcService> _grpcServices;
  23. private static List<string> _iPConfig { get; set; }
  24. public static IList<Dictionary<string, object>> ListInfo { get; } = new List<Dictionary<string, object>>();
  25. static GrpcServerConfig[] _serverConfigs;
  26. public RpcConfig(GrpcServerConfig[] serverConfigs , GrpcIPConfig iPConfig , IEnumerable<IGrpcService> grpcServices)
  27. {
  28. _grpcServices = grpcServices.ToList();
  29. _iPConfig = iPConfig.BlackList;
  30. _serverConfigs = serverConfigs;
  31. _servers = new List<Server>();
  32. }
  33. public void Start()
  34. {
  35. HealthServiceImpl healthServiceImpl = new HealthServiceImpl();
  36. healthServiceImpl.SetStatus("HealthCheckService", HealthCheckResponse.Types.ServingStatus.Serving);
  37. List<Cnode> services = new List<Cnode>();
  38. List<string> ips = NetHelper.getIPAddress();
  39. ips = ips.Where(a => !_iPConfig.Exists(t => a.Contains(t))).ToList();
  40. var builder = ServerServiceDefinition.CreateBuilder();
  41. _grpcServices.ForEach(grpc => grpc.RegisterMethod(builder));
  42. foreach (GrpcServerConfig config in _serverConfigs) {
  43. foreach (string ip in ips) {
  44. //获取扫描的_grpcServices
  45. _grpcServices.ForEach(grpc => services.Add(new Cnode { Name = grpc.GetType().FullName, Ip = ip, Port = config.Port }));
  46. Server _server = new Server
  47. {
  48. Services = { builder.Build() },
  49. Ports = { new ServerPort(ip, config.Port, ServerCredentials.Insecure) }
  50. };
  51. //获取健康检查
  52. _server.Services.Add(Health.BindService(healthServiceImpl));
  53. services.Add(new Cnode { Port = config.Port, Ip = ip, Name = Health.Descriptor.FullName });
  54. //获取手动注入的
  55. foreach (GrpcServerServiceDefinition definition in config.GrpcServices)
  56. {
  57. _server.Services.Add(definition.ServerServiceDefinition);
  58. Dictionary<string, object> service = new Dictionary<string, object>();
  59. Cnode cnode = new Cnode { Port=config.Port, Ip=ip, Name=definition.ServiceDescriptor.FullName};
  60. services.Add(cnode);
  61. }
  62. _server.Start();
  63. _servers.Add(_server);
  64. }
  65. }
  66. ProtoGenerator.Gen("proto");
  67. foreach (IGrouping<string, Cnode> group in services.GroupBy(c =>c.Name)){
  68. Dictionary<string, object> dictInfo = new Dictionary<string, object>();
  69. List<Node> nodes = new List<Node>();
  70. foreach(Cnode dict in group) {
  71. Node node = new Node { Ip =dict.Ip,Port=dict.Port };
  72. nodes.Add(node);
  73. }
  74. dictInfo.Add("name", group.Key);
  75. dictInfo.Add("node", nodes);
  76. ListInfo.Add(dictInfo);
  77. }
  78. }
  79. }
  80. internal class Cnode
  81. {
  82. public string Ip { get; set; }
  83. public int Port { get; set; }
  84. public string Name { get; set; }
  85. }
  86. internal class Node {
  87. public string Ip { get; set; }
  88. public int Port { get; set; }
  89. }
  90. }