예제 #1
0
        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);
        }
예제 #2
0
 public Startup(IConfiguration configuration, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger)
 {
     Configuration          = configuration;
     _middlewares           = middlewares;
     _serviceEntryContainer = serviceEntryContainer;
     _logger = logger;
 }
예제 #3
0
        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);
        }
예제 #4
0
 public HttpMiddleware(RequestDelegate next, Stack <Func <RequestDel, RequestDel> > middlewares, IServiceEntryContainer serviceEntryContainer, ILogger logger)
 {
     _next                  = next;
     _middlewares           = middlewares;
     _serviceEntryContainer = serviceEntryContainer;
     _logger                = logger;
 }
예제 #5
0
        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);
        }
예제 #6
0
 public DotNettyServer(JimuAddress address, IServiceEntryContainer serviceEntryContainer, ILogger logger)
 {
     _serviceEntryContainer = serviceEntryContainer;
     _address     = address;
     _logger      = logger;
     _middlewares = new Stack <Func <RequestDel, RequestDel> >();
 }
예제 #7
0
 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;
 }
예제 #8
0
파일: Startup.cs 프로젝트: zmk523/jimu
 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;
 }
예제 #9
0
 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;
 }
예제 #10
0
 //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;
 }
예제 #11
0
 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;
 }
예제 #12
0
        /// <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 = "./";
            //}
        }
예제 #13
0
파일: HttpServer.cs 프로젝트: zmk523/jimu
 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;
 }
예제 #14
0
        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> >();
        }
예제 #15
0
        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}"));
            }
        }
예제 #16
0
        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);
        }
예제 #17
0
 /// <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;
 }