Browse Source

refactor service load

arthur.wu 3 years ago
parent
commit
e69188552c

+ 1 - 2
clone&pull tool.bat

@@ -35,7 +35,7 @@ if %pullnum% equ 0 (
 		)
 		cd ..
 	)
-	if %pullnum% lss 14 (
+	if %pullnum% lss 13 (
 		goto MsgClone
 	)
 ) 
@@ -70,7 +70,6 @@ if not exist WingRemedicalModule (git clone http://git.ius.plus:88/Project-Wing/
 if not exist WingManagementModule (git clone http://git.ius.plus:88/Project-Wing/WingManagementModule.git && echo;)
 if not exist WingEmailModule (git clone http://git.ius.plus:88/Project-Wing/WingEmailModule.git && echo;)
 if not exist WingInternalInterface (git clone http://git.ius.plus:88/Project-Wing/WingInternalInterface.git && echo;)
-if not exist WingRpcSDK (git clone http://git.ius.plus:88/Project-Wing/WingRpcSDK.git && echo;)
 if not exist WingInterfaceLibrary (git clone http://git.ius.plus:88/Project-Wing/WingInterfaceLibrary.git && echo;)
 if not exist WingCloudServer (git clone http://git.ius.plus:88/Project-Wing/WingCloudServer.git && echo;)
 if not exist DeviceService (git clone http://git.ius.plus:88/Project-Wing/DeviceService.git && echo;)

+ 0 - 128
src/Loader/BaseServiceLoader.cs

@@ -1,128 +0,0 @@
-using WingRpcSDK.Common.Loader;
-using WingRpcSDK.JsonRpc.Driver;
-using JsonRpcLite.InProcess;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using WingServerCommon.Log;
-using System.Collections.Concurrent;
-
-namespace WingCloudServer
-{
-    internal abstract class BaseServiceLoader
-    {
-        private static AssemblyLoader _assemblyLoader;
-        internal static object RestartLocker = new object();
-
-        /// <summary>
-        /// RpcInProcessClient
-        /// </summary>
-        internal static InProcessRpcClient RpcInProcessClient { get; }
-
-        /// <summary>
-        /// InProcessServer
-        /// </summary>
-        /// <value></value>
-        internal static RpcServer InProcessServer { get; }
-
-        /// <summary>
-        /// InProcessEngine
-        /// </summary>
-        /// <value></value>
-        internal static JsonRpcInProcessEngine InProcessEngine { get; }
-
-        static BaseServiceLoader()
-        {
-            InProcessEngine = new JsonRpcInProcessEngine();
-            InProcessServer = new RpcServer(InProcessEngine);
-            RpcInProcessClient = InProcessRpcClient.CreateClient(InProcessEngine);
-            _assemblyLoader = new AssemblyLoader();
-        }
-
-        /// <summary>
-        /// Create service
-        /// </summary>
-        /// <typeparam name="T">Service convert type</typeparam>
-        /// <param name="serviceType">Create source type</param>
-        /// <returns>return need type created instance</returns>
-        private T CreateLoader<T>(Type serviceType)
-        {
-            var service = (T)Activator.CreateInstance(serviceType);
-            return service;
-        }
-
-        /// <summary>
-        /// Register service
-        /// </summary>
-        /// <typeparam name="T">Service type</typeparam>
-        /// <param name="service">Service instance</param>
-        /// <param name="rpcService">Run rpc service instance</param>
-        /// <param name="interfaceType">The service implement from interface type</param>
-        internal void CallRegister(RpcServer rpcServer, Type serviceType, object service)
-        {
-            rpcServer.RegisterService(serviceType, service);
-        }
-
-        /// <summary>
-        /// Get the service base type,used to create and register service  
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="filePath"></param>
-        /// <returns></returns>
-        internal IEnumerable<Type> GetLoaders<T>(string filePath)
-        {
-            var assembly = _assemblyLoader.LoadAssemblyDependencies(filePath);
-            var allTypes = assembly.GetTypes();
-            return allTypes.Where(t => t.GetInterface(typeof(T).Name) != null);
-        }
-
-        /// <summary>
-        /// Load service dll
-        /// </summary>
-        internal virtual void LoadModules(string path)
-        {
-            if (Directory.Exists(path))
-            {
-                var dlls = Directory.GetFiles(path, "*.dll");
-                foreach (var file in dlls)
-                {
-                    if (file.IndexOf("Module") > -1 || file.IndexOf("DeviceService.dll") > -1)
-                    {
-                        var serviceLoaders = GetLoaders<IServiceLoader>(file);
-                        foreach (var serviceLoader in serviceLoaders)
-                        {
-                            var loader = CreateLoader<IServiceLoader>(serviceLoader);
-                            var serviceType = loader.GetServiceType();
-                            var service = loader.CreateService();
-                            RegisterService(serviceType, service);
-                            Logger.WriteLineInfo($"Register {Path.GetFileName(file)}.{serviceType.Name}");
-                        }
-                    }
-                }
-                var dirs = Directory.GetDirectories(path);
-                foreach (var dir in dirs)
-                {
-                    LoadModules(dir);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Start service
-        /// </summary>
-        internal abstract void StartService();
-
-        /// <summary>
-        /// Stop service
-        /// </summary>
-        internal abstract void StopService();
-
-        /// <summary>
-        /// Register servcie
-        /// </summary>
-        /// <param name="serviceType">service type</param>
-        /// <param name="service">instance</param>
-        internal abstract void RegisterService(Type serviceType, object service);
-    }
-}

+ 0 - 13
src/Loader/IServiceContainer.cs

@@ -1,13 +0,0 @@
-namespace WingRpcSDK.Common
-{
-    internal interface IServiceContainer
-    {
-        string ServiceName { get; }
-
-        void LoadDlls();
-
-        void StartService();
-
-        void StopService();
-    }
-}

+ 0 - 71
src/Loader/InProcessServiceLoader.cs

@@ -1,71 +0,0 @@
-using WingRpcSDK.JsonRpc.Driver;
-using System;
-using WingCloudServer.Loader;
-using System.IO;
-
-namespace WingCloudServer
-{
-    internal class InProcessServiceLoader : BaseServiceLoader
-    {
-        private DllWatcher _dllWatcher;
-
-        /// <summary>
-        /// RegisterService
-        /// </summary>
-        /// <param name="serviceType"></param>
-        /// <param name="service"></param>
-        internal override void RegisterService(Type serviceType, object service)
-        {
-            var baseService = (BaseRpcService)service;
-            if(baseService!=null)
-            {
-                baseService.InProcessClient = RpcInProcessClient;
-                baseService.Name = string.IsNullOrWhiteSpace(baseService.Name) ? serviceType.Name.Trim('I') : baseService.Name;
-                baseService.InitService();
-                CallRegister(InProcessServer, serviceType, baseService);
-            }
-        }
-
-        /// <summary>
-        /// Start service
-        /// </summary>
-        internal override void StartService()
-        {
-            InProcessServer.Start();
-        }
-
-        /// <summary>
-        /// Stop service
-        /// </summary>
-        internal override void StopService()
-        {
-            InProcessServer.End();
-        }
-
-        internal override void LoadModules(string path)
-        {
-            _dllWatcher = new DllWatcher(path, () => {
-                lock(RestartLocker)
-                {
-                    Console.WriteLine("Server is reboot now...");
-                    var startServerBat = string.Empty;
-                    switch(Environment.OSVersion.Platform)
-                    {
-                        case PlatformID.Win32NT:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "start.bat");
-                        break;
-                        case PlatformID.MacOSX:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "macstart.bat");
-                        break;
-                        default:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "start.sh");
-                        break;
-                    }
-                    ProcessStarter.StartTool("ServerReboot", $" WingCloudeServer {startServerBat}");
-                    Environment.Exit(0);    
-                }
-            });
-            base.LoadModules(path);
-        }
-    }
-}

+ 0 - 81
src/Loader/NetServiceLoader.cs

@@ -1,81 +0,0 @@
-using WingRpcSDK.JsonRpc.Driver;
-using JsonRpcLite.Network;
-using System;
-using System.Collections.Concurrent;
-using WingCloudServer.Loader;
-using System.IO;
-
-namespace WingCloudServer
-{
-    internal class NetServiceLoader: BaseServiceLoader
-    {
-        private DllWatcher _dllWatcher;
-        private RpcServer _netRpcService;
-        private ConcurrentDictionary<string, BaseRpcService> _netRpcServiceDic = new();
-
-        public NetServiceLoader(int port)
-        {
-            _netRpcService = new(new JsonRpcHttpServerEngine($"http://*:{port}/"));
-        }
-
-        /// <summary>
-        /// Register service
-        /// </summary>
-        /// <param name="serviceType">Service type</param>
-        /// <param name="service">Service instance</param>
-        internal override void RegisterService(Type serviceType, object service)
-        {
-            var baseService = (BaseRpcService)service;
-            if(baseService!=null)
-            {
-                baseService.InProcessClient = RpcInProcessClient;
-                baseService.InitService();
-                baseService.Name = string.IsNullOrWhiteSpace(baseService.Name) ? serviceType.Name.Trim('I') : baseService.Name;
-                CallRegister(_netRpcService, serviceType, service);
-                _netRpcServiceDic.AddOrUpdate(baseService.Name, baseService, (k, v) => baseService);
-            }
-        }
-
-
-        /// <summary>
-        /// Start service
-        /// </summary>
-        internal override void StartService()
-        {
-            _netRpcService?.Start();
-        }
-
-        /// <summary>
-        /// Stop service
-        /// </summary>
-        internal override void StopService()
-        {
-            _netRpcService?.End();
-        }
-
-        internal override void LoadModules(string path)
-        {
-            _dllWatcher = new DllWatcher(path, () => {
-                lock (RestartLocker)
-                {
-                    Console.WriteLine("Server is reboot now...");
-                    var startServerBat = string.Empty;
-                    switch(Environment.OSVersion.Platform)
-                    {
-                        case PlatformID.Win32NT:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "start.bat");
-                        break;
-                        case PlatformID.MacOSX:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "macstart.bat");
-                        break;
-                        default:
-                            startServerBat = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "start.sh");
-                        break;
-                    }
-                    ProcessStarter.StartTool("ServerReboot", startServerBat);
-                }
-            });
-            base.LoadModules(path);
-        }
-    }
-}

+ 0 - 44
src/Loader/ThreadServiceContainer.cs

@@ -1,44 +0,0 @@
-using System;
-using System.IO;
-
-using WingRpcSDK.Common;
-namespace WingCloudServer
-{
-    internal class ThreadServiceContainer : IServiceContainer
-    {
-        private InProcessServiceLoader _inProcessServiceLoader;
-        private NetServiceLoader _netServiceLoader;
-
-        public ThreadServiceContainer(int rpcServerPort)
-        {
-            _inProcessServiceLoader = new();
-            _netServiceLoader = new(rpcServerPort);
-        }
-
-        string IServiceContainer.ServiceName => "WingCloudServer";
-
-        /// <summary>
-        /// Load all dll
-        /// </summary>
-        void IServiceContainer.LoadDlls()
-        {
-            _inProcessServiceLoader.LoadModules(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "InternalService"));
-            _netServiceLoader.LoadModules(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NetService"));
-        }
-
-        /// <summary>
-        /// Start all service
-        /// </summary>
-        void IServiceContainer.StartService()
-        {
-            _inProcessServiceLoader.StartService();
-            _netServiceLoader.StartService();
-        }
-
-        void IServiceContainer.StopService()
-        {
-            _inProcessServiceLoader.StopService();
-            _netServiceLoader.StopService();
-        }
-    }
-}

+ 9 - 15
src/Program.cs

@@ -1,25 +1,20 @@
-using WingRpcSDK.Common;
-using System;
-using System.Text;
-using System.Diagnostics;
+using System;
 using System.Threading.Tasks;
-using System.IO;
-using System.Net;
-using System.Collections.Generic;
 using WingCloudServer.Loader;
 using WingServerCommon.Log;
 using WingServerCommon.Config;
+using src;
 
 namespace WingCloudServer
 {
     class Program
     {
-        private static IServiceContainer _rpcServiceContainer;
+        private static WingServer _wingServer;
         static void Main(string[] args)
         {
             var logEngine = new ServerLoggerEngine();
             Logger.RegisterEngine(logEngine);
-            
+            
             while (!StartServer())
             {
                 Console.WriteLine("The server is abnormal,wait 5 second will to reboot server!");
@@ -36,12 +31,11 @@ namespace WingCloudServer
                 //启动短信服务
                 ProcessStarter.StartTool("Sms.Tool"); //Should be actived by deploy service in the future
                 Logger.WriteLineInfo($"Process Sms.Tool started!");
-                
+                
                 var rpcServerPort = ConfigurationManager.ServerGatewayPort;
-                _rpcServiceContainer = new ThreadServiceContainer(rpcServerPort);
-                _rpcServiceContainer.StartService();
-                _rpcServiceContainer.LoadDlls();
-
+                _wingServer = new WingServer(rpcServerPort);
+                _wingServer.Start();
+              
                 Logger.WriteLineInfo($"Server is running on port {rpcServerPort}!");
 
                 string readStr = Console.ReadLine();
@@ -49,7 +43,7 @@ namespace WingCloudServer
                 {
                     readStr = Console.ReadLine();
                 }
-                _rpcServiceContainer.StopService();
+                _wingServer.Stop();
                 return true;
             }
             catch (Exception ex)

+ 0 - 10
src/States/IStateService.cs

@@ -1,10 +0,0 @@
-using System.Threading.Tasks;
-using WingRpcSDK.JsonRpc.Driver;
-
-namespace WingCloudServer.State
-{
-    public interface IStateService
-    {
-        Task<ServiceStateEnum> GetServiceState(ServiceEnum serviceEnum);
-    }
-}

+ 0 - 22
src/States/StateService.cs

@@ -1,22 +0,0 @@
-using System.Threading.Tasks;
-using WingRpcSDK.JsonRpc.Driver;
-
-namespace WingCloudServer.State
-{
-    public class StateService : BaseRpcService, IStateService
-    {
-        private BaseServiceRunStateManager _baseServiceRunStateManager = new();
-
-        public async Task<bool> SetServiceState(ServiceEnum serviceEnum, ServiceStateEnum serviceStateEnum)
-        {
-            _baseServiceRunStateManager.SetServiceState(serviceEnum, serviceStateEnum);
-            return await Task.FromResult(true);
-        }
-
-        public async Task<ServiceStateEnum> GetServiceState(ServiceEnum serviceEnum)
-        {
-            var state = _baseServiceRunStateManager.GetServiceState(serviceEnum);
-            return await Task.FromResult(state.CurrentState);
-        }
-    }
-}

+ 2 - 2
src/WingCloudServer.csproj

@@ -6,9 +6,9 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="JsonRpcLite" Version="1.1.0.2" />
     <PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="5.0.0" />
-    <PackageReference Include="WingRpcSDK" Version="1.0.0.12" />
-    <PackageReference Include="WingServerCommon" Version="1.0.0.4" />
+    <PackageReference Include="WingServerCommon" Version="1.0.0.5" />
   </ItemGroup>
   
   <ItemGroup>

+ 106 - 0
src/WingServer.cs

@@ -0,0 +1,106 @@
+using System.Diagnostics;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using JsonRpcLite.InProcess;
+using JsonRpcLite.Network;
+using JsonRpcLite.Rpc;
+using WingCloudServer;
+using WingServerCommon.Service;
+
+namespace src
+{
+    internal class WingServer
+    {
+         private JsonRpcServer _rpcHttpServer;
+        private JsonRpcServer _rpcInProcessServer;
+        public WingServer(int port)
+        {
+            _rpcInProcessServer = new JsonRpcServer();
+            var inProcessEngine = new JsonRpcInProcessEngine();
+            _rpcInProcessServer.UseEngine(inProcessEngine);
+
+           
+            _rpcHttpServer = new JsonRpcServer();
+            var jsonRpcHttpServerEngine = new JsonRpcHttpServerEngine($"http://*:{port}/");
+            _rpcHttpServer.UseEngine(jsonRpcHttpServerEngine);
+        }
+
+        /// <summary>
+        /// Start server to load all service
+        /// </summary>
+        internal void Start(){            
+            
+            InitializeServices();
+            _rpcInProcessServer.Start();
+            _rpcHttpServer.Start();
+        }       
+              
+        /// <summary>
+        /// Stop server
+        /// </summary>
+        internal void Stop()
+        {
+            //TODO dispose service
+            _rpcHttpServer.Stop();
+            _rpcInProcessServer.Stop();            
+        }
+
+        void InitializeServices()
+        {               
+            //initiaize rpc client pool
+            var remoteRpcHttpServices = new RemoteServiceInfo[0]; //TODO from settings
+            var rpcClientPool = new JsonRpcClientPool();
+            rpcClientPool.Initialize(remoteRpcHttpServices.ToArray());  
+
+            var folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Services"); //TODO from settings
+            var inProcessServices = new List<string>(){"WingEmailModule", "WingMongoDBModule","WingSessionModule", "WingSMSModule" }; //TODO from settings
+            var rpcHttpServices = new List<string>(){"WingManagementModule", "WingStorageModule","WingUserModule"}; //TODO from settings
+            
+            if (!Directory.Exists(folder))
+            {
+                throw new NotSupportedException($"Folder {folder} not exist");
+            }
+          
+            //InProcess service load and register to InPrcess rpc server
+            foreach (var service in inProcessServices)
+            {                
+                var wingServiceType = LoadService(folder, service);
+                var instance = Activator.CreateInstance(wingServiceType);
+                var method =  wingServiceType.GetMethod("Load");
+                method.Invoke(instance, new object[] { rpcClientPool});     
+                _rpcInProcessServer.RegisterService(wingServiceType, instance); //TODO register one service or multi ?
+            }
+
+            //Rpc http service load and register to rpc http server
+            foreach (var service in rpcHttpServices)
+            {
+                var wingServiceType = LoadService(folder, service);
+                var instance = Activator.CreateInstance(wingServiceType);
+                var method =  wingServiceType.GetMethod("Load");
+                method.Invoke(instance, new object[] { rpcClientPool});                
+                _rpcHttpServer.RegisterService(wingServiceType, instance); //TODO register one service or multi ?
+            }
+        }
+        
+        private Type LoadService(string folder, object serviceName)
+        {
+            var file = Path.Combine(folder, $"{serviceName}.dll");
+            if (!Directory.Exists(folder))
+            {
+                throw new NotSupportedException($"File {file} not exist");
+            }
+            var assemblyLoader = new  AssemblyLoader();
+            var assembly = assemblyLoader.LoadAssemblyDependencies(file);
+            var types = assembly.GetTypes();                
+            var wingServiceType = types.FirstOrDefault(x=>typeof(JsonRpcService).IsAssignableFrom(x) && x.IsClass && !x.IsAbstract);
+            if (wingServiceType == null)
+            {
+                throw new NotImplementedException($"WingService not find in {file}");
+            }
+
+            return wingServiceType;
+        }
+    }          
+}