public static IServiceHostServerBuilder UseInServerForDiscovery(this IServiceHostServerBuilder serviceHostBuilder) { serviceHostBuilder.RegisterService(containerBuilder => { containerBuilder.RegisterType <InServerServiceDiscovery>().As <IServiceDiscovery>().SingleInstance(); containerBuilder.RegisterType <InServerServiceDiscovery>().SingleInstance(); }); serviceHostBuilder.AddInitializer(async container => //serviceHostBuilder.AddRunner(async container => { var logger = container.Resolve <ILogger>(); logger.Info($"[config]use in server for discovery"); while (!container.IsRegistered <IServer>()) { default(SpinWait).SpinOnce(); } IServer server = container.Resolve <IServer>(); IServiceEntryContainer entryContainer = container.Resolve <IServiceEntryContainer>(); // register the method of GetRoutesAsync as microservice so that the client can call it from remote entryContainer.AddServices(new[] { typeof(InServerServiceDiscovery) }); var routes = server.GetServiceRoutes(); var discovery = container.Resolve <IServiceDiscovery>(); await discovery.ClearAsync(); await discovery.SetRoutesAsync(routes); }); return(serviceHostBuilder); }
public Startup(IConfiguration configuration, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger) { Configuration = configuration; _middlewares = middlewares; _serviceEntryContainer = serviceEntryContainer; _logger = logger; }
public static IServiceHostServerBuilder UseInServerForDiscovery(this IServiceHostServerBuilder serviceHostBuilder) { serviceHostBuilder.RegisterService(containerBuilder => { containerBuilder.RegisterType <InServerServiceDiscovery>().As <IServiceDiscovery>().SingleInstance(); containerBuilder.RegisterType <InServerServiceDiscovery>().AsSelf().AsImplementedInterfaces().InstancePerDependency(); }); serviceHostBuilder.AddInitializer(async container => { ILogger logger = container.Resolve <ILogger>(); logger.Info($"本地服务器为注册服务器"); while (!container.IsRegistered <IServer>()) { default(SpinWait).SpinOnce(); } IServer server = container.Resolve <IServer>(); IServiceEntryContainer entryContainer = container.Resolve <IServiceEntryContainer>(); // 添加一个获取所有服务路径的服务 entryContainer.AddServices(new[] { typeof(InServerServiceDiscovery) }); List <ServiceRoute> routes = server.GetServiceRoutes(); IServiceDiscovery discovery = container.Resolve <IServiceDiscovery>(); await discovery.ClearAsync(); await discovery.SetRoutesAsync(routes); }); return(serviceHostBuilder); }
public HttpMiddleware(RequestDelegate next, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger) { _next = next; _middlewares = middlewares; _serviceEntryContainer = serviceEntryContainer; _logger = logger; }
public RemoteExecutorContext(TransportMsg transportMessage, IServiceEntryContainer serviceEntryContainer, IResponse response, ISerializer serializer, ILogger logger, IServiceDiscovery serviceDiscovery) { Response = response; TransportMessage = transportMessage; try { RemoteInvokeMessage = transportMessage.GetContent <RemoteCallData>(serializer); } catch (Exception ex) { logger.Error("failed to convert transportmsg.content to RemoteCallerData.", ex); return; } ServiceEntry = serviceEntryContainer.GetServiceEntry() .FirstOrDefault(x => x.Descriptor.Id == RemoteInvokeMessage.ServiceId); ServiceDesc serviceDesc; if (ServiceEntry == null) { logger.Warn($"not found service: {RemoteInvokeMessage.ServiceId}"); List <ServiceRoute> router = serviceDiscovery.GetRoutesAsync().Result; serviceDesc = router.FirstOrDefault(o => o.ServiceDescriptor.Id == RemoteInvokeMessage.ServiceId).ServiceDescriptor; } else { serviceDesc = ServiceEntry.Descriptor; } RemoteInvokeMessage.Parameters = CheckParameters(RemoteInvokeMessage.Parameters, serviceDesc, serializer); }
public DotNettyServer(JimuAddress address, IServiceEntryContainer serviceEntryContainer, ILogger logger) { _serviceEntryContainer = serviceEntryContainer; _address = address; _logger = logger; _middlewares = new Stack <Func <RequestDel, RequestDel> >(); }
public HttpMiddleware(RequestDelegate next, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger, ISerializer serializer, ITypeConvertProvider typeConvert) { _next = next; _middlewares = middlewares; _serviceEntryContainer = serviceEntryContainer; _logger = logger; _serializer = serializer; _typeConvert = typeConvert; }
public Startup(IConfiguration configuration, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger, ISerializer serializer, ITypeConvertProvider typeConvert) { Configuration = configuration; _middlewares = middlewares; _serviceEntryContainer = serviceEntryContainer; _logger = logger; _serializer = serializer; _typeConvert = typeConvert; }
public DotNettyServer(string serverIp, int serverPort, JimuAddress serviceInvokeAddress, IServiceEntryContainer serviceEntryContainer, ILogger logger) { _serviceEntryContainer = serviceEntryContainer; _serviceInvokeAddress = serviceInvokeAddress; _logger = logger; _middlewares = new Stack <Func <RequestDel, RequestDel> >(); _serverIp = serverIp; _serverPort = serverPort; }
//private readonly Action<IWebHostBuilder> _builderAction; public HttpServer(string ip, int port, IServiceEntryContainer serviceEntryContainer, ILogger logger) { _serviceEntryContainer = serviceEntryContainer; _ip = ip; _port = port; _logger = logger; _middlewares = new Stack <Func <RequestDel, RequestDel> >(); //_builderAction = builderAction; }
public DotNettyServer(string serverIp, int serverPort, JimuAddress serviceInvokeAddress, IServiceEntryContainer serviceEntryContainer, IJimuDiagnostic jimuApm, ILoggerFactory loggerFactory) { _serviceEntryContainer = serviceEntryContainer; _serviceInvokeAddress = serviceInvokeAddress; _logger = loggerFactory.Create(this.GetType()); _middlewares = new Stack <Func <RequestDel, RequestDel> >(); _serverIp = serverIp; _serverPort = serverPort; _jimuApm = jimuApm; }
/// <summary> /// dll loader /// </summary> /// <param name="serviceEntryContainer"></param> /// <param name="logger"></param> /// <param name="path">where are the dll directory</param> /// <param name="watchingFilePattern">what type of file will be watch when enableWatchChanged is true</param> /// <param name="enableWatchChanged">whether enable watch file changed</param> public ServicesLoader(IServiceEntryContainer serviceEntryContainer, ILogger logger, ServiceOptions options) { _logger = logger; _serviceEntryContainer = serviceEntryContainer; _options = options; //if (string.IsNullOrEmpty(_options.Path)) //{ // _options.Path = "./"; //} }
public HttpServer(string ip, int port, Action <IWebHostBuilder> builderAction, IServiceEntryContainer serviceEntryContainer, ILogger logger, ISerializer serializer, ITypeConvertProvider typeConvert) { _serviceEntryContainer = serviceEntryContainer; _ip = ip; _port = port; _logger = logger; _serializer = serializer; _middlewares = new Stack <Func <RequestDel, RequestDel> >(); _builderAction = builderAction; _typeConvert = typeConvert; }
public RpcServer(ServerAddress address, IServiceEntryContainer serviceEntryContainer, ISerializer serializer, ILogger logger, IServiceDiscovery serviceDiscovery) { _address = address; _serializer = serializer; _logger = logger; _serviceEntryContainer = serviceEntryContainer; _serviceDiscovery = serviceDiscovery; //中间件执行委托 _middlewares = new Stack <Func <RequestDel, RequestDel> >(); }
public RemoteCallerContext(JimuTransportMsg transportMessage, IServiceEntryContainer serviceEntryContainer, IResponse response, ILogger logger) { Response = response; TransportMessage = transportMessage; try { RemoteInvokeMessage = transportMessage.GetContent <JimuRemoteCallData>(); } catch (Exception ex) { logger.Error("failed to convert transportmsg.content to JimuRemoteCallerData.", ex); return; } ServiceEntry = serviceEntryContainer.GetServiceEntry() .FirstOrDefault(x => x.Descriptor.Id == RemoteInvokeMessage.ServiceId); if (ServiceEntry == null) { logger.Error($"not found service: {RemoteInvokeMessage.ServiceId}", new EntryPointNotFoundException($"{RemoteInvokeMessage.ServiceId}")); } }
public static IServiceHostServerBuilder LoadServices(this IServiceHostServerBuilder serviceHostBuilder, params string[] assemblyNames) { List <Assembly> assemblies = new List <Assembly>(); foreach (string assemblyName in assemblyNames) { string name = assemblyName; if (name.EndsWith(".dll")) { name = name.Substring(0, name.Length - 4); } Assembly assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(name)); assemblies.Add(assembly); } List <Type> serviceTypes = assemblies.SelectMany(x => x.ExportedTypes) .Where(x => x.GetMethods().Any(y => y.GetCustomAttribute <ServiceAttribute>() != null)).ToList(); serviceHostBuilder.RegisterService(containerBuilder => { containerBuilder.RegisterTypes(serviceTypes.ToArray()).AsSelf().AsImplementedInterfaces() .InstancePerDependency(); // 注册模块 assemblies.ForEach(x => { containerBuilder.RegisterAssemblyModules(x); }); }); serviceHostBuilder.AddInitializer(container => { IServiceEntryContainer serviceEntryContainer = container.Resolve <IServiceEntryContainer>(); serviceEntryContainer.AddServices(serviceTypes.ToArray()); ILogger logger = container.Resolve <ILogger>(); logger.Info($"已经注册的服务: {string.Join(",", assemblies)}"); }); return(serviceHostBuilder); }
/// <summary> /// dll loader /// </summary> /// <param name="serviceEntryContainer"></param> /// <param name="logger"></param> /// <param name="path">where are the dll directory</param> /// <param name="watchingFilePattern">what type of file will be watch when enableWatchChanged is true</param> /// <param name="enableWatchChanged">whether enable watch file changed</param> public ServicesLoader(IServiceEntryContainer serviceEntryContainer, ILogger logger, ServiceOptions options) { _logger = logger; _serviceEntryContainer = serviceEntryContainer; _options = options; }