RegisterServiceHosted.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. namespace Grpc.Extension.AspNetCore.Internal
  17. {
  18. public class RegisterServiceHosted : IHostedService
  19. {
  20. private readonly IServiceRegister _serviceRegister;
  21. private readonly IServer _server;
  22. private readonly GrpcServerOptions _grpcServerOptions;
  23. private readonly IHostApplicationLifetime _hostApplicationLifetime;
  24. private readonly ILogger _logger;
  25. public RegisterServiceHosted(IServiceRegister serviceRegister, IServer server, IOptions<GrpcServerOptions> grpcServerOptions,
  26. IHostApplicationLifetime hostApplicationLifetime, ILogger<RegisterServiceHosted> logger)
  27. {
  28. _serviceRegister = serviceRegister;
  29. _server = server;
  30. _grpcServerOptions = grpcServerOptions.Value;
  31. _hostApplicationLifetime = hostApplicationLifetime;
  32. _logger = logger;
  33. }
  34. public Task StartAsync(CancellationToken cancellationToken)
  35. {
  36. if(_grpcServerOptions.EnableDiscovery)
  37. _hostApplicationLifetime.ApplicationStarted.Register(Start);
  38. return Task.CompletedTask;
  39. }
  40. public void Start()
  41. {
  42. var serverAddressesFeature = _server.Features?.Get<IServerAddressesFeature>();
  43. if (serverAddressesFeature == null || serverAddressesFeature.Addresses.Count == 0)
  44. {
  45. _logger.LogError("can not found IServerAddressesFeature in IServer,can not register service.");
  46. return;
  47. }
  48. //添加服务IPAndPort
  49. var ipPort = NetHelper.GetIPAndPort(_grpcServerOptions.ServiceAddress);
  50. var serverAddress = BindingAddress.Parse(serverAddressesFeature.Addresses.First());
  51. MetaModel.StartTime = DateTime.Now;
  52. MetaModel.Ip = ipPort.Item1;
  53. MetaModel.Port = serverAddress.Port;
  54. Console.WriteLine($"server listening {MetaModel.Ip}:{MetaModel.Port}");
  55. //使用BaseServices
  56. Console.WriteLine($"use {_serviceRegister.GetType().Name} register");
  57. Console.WriteLine($" DiscoveryUrl:{_grpcServerOptions.DiscoveryUrl}");
  58. Console.WriteLine($" ServiceName:{_grpcServerOptions.DiscoveryServiceName}");
  59. var registerModel = _grpcServerOptions.ToJson().FromJson<ServiceRegisterModel>();
  60. registerModel.ServiceIp = MetaModel.Ip;
  61. registerModel.ServicePort = MetaModel.Port;
  62. _serviceRegister.RegisterService(registerModel);
  63. }
  64. public Task StopAsync(CancellationToken cancellationToken)
  65. {
  66. if(_grpcServerOptions.EnableDiscovery)
  67. _serviceRegister.DeregisterService();
  68. return Task.CompletedTask;
  69. }
  70. }
  71. }