You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
5.0KB

  1. using DotNetty.Codecs;
  2. using DotNetty.Transport.Bootstrapping;
  3. using DotNetty.Transport.Channels;
  4. using DotNetty.Transport.Channels.Sockets;
  5. using Microsoft.Extensions.Configuration;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Hosting;
  8. using NearCardAttendance.Common;
  9. using NearCardAttendance.Common.helper;
  10. using NearCardAttendance.Service.TcpServer.Handler;
  11. using NearCardAttendance.Service.TcpServer.Mapper;
  12. using NearCardAttendance.TcpServer.Config;
  13. using Serilog;
  14. using NearCardAttendance.Model;
  15. using TelpoDataService.Util.Clients;
  16. using System.Text;
  17. using NearCardAttendance.Service.MessageQueue.Kafka;
  18. using NearCardAttendance.Service.MessageQueue;
  19. namespace NearCardAttendance.TcpServer
  20. {
  21. internal class Program
  22. {
  23. static void Main(string[] args)
  24. {
  25. var config = new ConfigurationBuilder()
  26. .SetBasePath(Directory.GetCurrentDirectory())
  27. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  28. .Build();
  29. Log.Logger = new LoggerConfiguration()
  30. .ReadFrom.Configuration(config).Enrich.WithThreadInfo()
  31. .Filter.ByExcluding(logEvent => logEvent.Level == Serilog.Events.LogEventLevel.Verbose) // 过滤掉VRB级别的日志
  32. .CreateLogger();
  33. try
  34. {
  35. Log.Information("Starting up");
  36. CreateHostBuilder(args).Build().Run();
  37. }
  38. catch (Exception ex)
  39. {
  40. Log.Fatal(ex, "Application start-up failed");
  41. }
  42. finally
  43. {
  44. Log.CloseAndFlush();
  45. }
  46. }
  47. public static IHostBuilder CreateHostBuilder(string[] args) =>
  48. Host.CreateDefaultBuilder(args)
  49. .UseSerilog()
  50. .ConfigureServices((hostContext, services) => {
  51. var configuration = hostContext.Configuration;
  52. services.AddTelpoDataServices(opt =>
  53. {
  54. opt.TelpoDataUrl = configuration["ServiceConfig:TelpoDataUrl"];
  55. });
  56. #region 配置信息
  57. services
  58. .Configure<ServiceConfig>(configuration.GetSection("ServiceConfig"))
  59. ;
  60. #endregion
  61. #region Http请求
  62. services
  63. .AddSingleton<HttpHelper>()
  64. .AddHttpClient(Consts.DEFAULT_HTTPCLIENT_NAME, c =>
  65. {
  66. c.Timeout = TimeSpan.FromSeconds(10); //超时限制
  67. c.DefaultRequestHeaders.Add("Accept", "application/json");
  68. })
  69. ;
  70. #endregion
  71. #region TcpService
  72. services
  73. .AddSingleton<ServerBootstrap>(provider =>
  74. {
  75. var bossGroup = new MultithreadEventLoopGroup();
  76. var workerGroup = new MultithreadEventLoopGroup();
  77. var bootstrap = new ServerBootstrap();
  78. bootstrap.Group(bossGroup, workerGroup)
  79. .Channel<TcpServerSocketChannel>()
  80. .Option(ChannelOption.SoBacklog, 100)
  81. .ChildOption(ChannelOption.TcpNodelay, true) // 低延迟
  82. .ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
  83. {
  84. // var handler = provider.GetRequiredService<ProtocolHandler>();
  85. // var handler = provider.GetRequiredService<SomeServerHandler>();
  86. var pipeline = channel.Pipeline;
  87. pipeline.AddLast(new StringEncoder(Encoding.ASCII));
  88. pipeline.AddLast(
  89. provider.GetRequiredService<ProtocolHandler>(),
  90. provider.GetRequiredService<RegisterHandler>()
  91. //provider.GetRequiredService<HeartBeatHandler>(),
  92. //provider.GetRequiredService<PassThroughHandler>()
  93. ); // Add the injected handler
  94. }));
  95. return bootstrap;
  96. })
  97. .AddSingleton<TcpClientsManager>()
  98. .AddSingleton<ScheduleResendManager>()
  99. .AddTransient<ProtocolHandler>()
  100. .AddTransient<RegisterHandler>()
  101. //.AddTransient<HeartBeatHandler>()
  102. //.AddTransient<PassThroughHandler>()
  103. .AddHostedService<Server>()
  104. ;
  105. #endregion
  106. services.AddSingleton<MqProcessLogic>();
  107. services.AddSingleton<KafkaService>();
  108. });
  109. }
  110. }