RegisterServiceHosted.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Grpc.Extension.Abstract.Discovery;
  2. using Grpc.Extension.BaseService.Model;
  3. using Microsoft.Extensions.Hosting;
  4. using System;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Grpc.Extension.AspNetCore;
  8. using Microsoft.Extensions.Options;
  9. using Grpc.Extension.Abstract.Model;
  10. using Grpc.Extension.Common;
  11. using Microsoft.AspNetCore.Hosting.Server;
  12. using Microsoft.AspNetCore.Http;
  13. using Microsoft.Extensions.Logging;
  14. using Microsoft.AspNetCore.Hosting.Server.Features;
  15. using System.Linq;
  16. using TEAMModelOS.SDK.Extension;
  17. namespace Grpc.Extension.AspNetCore.Internal
  18. {
  19. public class RegisterServiceHosted : IHostedService
  20. {
  21. private readonly IServiceRegister _serviceRegister;
  22. private readonly IServer _server;
  23. private readonly GrpcServerOptions _grpcServerOptions;
  24. private readonly IHostApplicationLifetime _hostApplicationLifetime;
  25. private readonly ILogger _logger;
  26. public RegisterServiceHosted(IServiceRegister serviceRegister, IServer server, IOptions<GrpcServerOptions> grpcServerOptions,
  27. IHostApplicationLifetime hostApplicationLifetime, ILogger<RegisterServiceHosted> logger)
  28. {
  29. _serviceRegister = serviceRegister;
  30. _server = server;
  31. _grpcServerOptions = grpcServerOptions.Value;
  32. _hostApplicationLifetime = hostApplicationLifetime;
  33. _logger = logger;
  34. }
  35. public Task StartAsync(CancellationToken cancellationToken)
  36. {
  37. if(_grpcServerOptions.EnableDiscovery)
  38. _hostApplicationLifetime.ApplicationStarted.Register(Start);
  39. return Task.CompletedTask;
  40. }
  41. public void Start()
  42. {
  43. var serverAddressesFeature = _server.Features?.Get<IServerAddressesFeature>();
  44. if (serverAddressesFeature == null || serverAddressesFeature.Addresses.Count == 0)
  45. {
  46. _logger.LogError("can not found IServerAddressesFeature in IServer,can not register service.");
  47. return;
  48. }
  49. //添加服务IPAndPort
  50. var ipPort = NetHelper.GetIPAndPort(_grpcServerOptions.ServiceAddress);
  51. var serverAddress = BindingAddress.Parse(serverAddressesFeature.Addresses.First());
  52. MetaModel.StartTime = DateTime.Now;
  53. MetaModel.Ip = ipPort.Item1;
  54. MetaModel.Port = serverAddress.Port;
  55. Console.WriteLine($"server listening {MetaModel.Ip}:{MetaModel.Port}");
  56. //使用BaseServices
  57. Console.WriteLine($"use {_serviceRegister.GetType().Name} register");
  58. Console.WriteLine($" DiscoveryUrl:{_grpcServerOptions.DiscoveryUrl}");
  59. Console.WriteLine($" ServiceName:{_grpcServerOptions.DiscoveryServiceName}");
  60. var registerModel = _grpcServerOptions.ToJsonString().ToObject<ServiceRegisterModel>();
  61. registerModel.ServiceIp = MetaModel.Ip;
  62. registerModel.ServicePort = MetaModel.Port;
  63. _serviceRegister.RegisterService(registerModel);
  64. }
  65. public Task StopAsync(CancellationToken cancellationToken)
  66. {
  67. if(_grpcServerOptions.EnableDiscovery)
  68. _serviceRegister.DeregisterService();
  69. return Task.CompletedTask;
  70. }
  71. }
  72. }