Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cce6dbb

Browse files
committed
Split rabbitmq component scan dynamic loading
1 parent db77a59 commit cce6dbb

File tree

12 files changed

+247
-27
lines changed

12 files changed

+247
-27
lines changed

src/Surging.Core/Surging.Core.CPlatform/Module/AbstractModule.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Autofac;
22
using Autofac.Core.Lifetime;
33
using Surging.Core.CPlatform.Exceptions;
4+
using Surging.Core.CPlatform.Utilities;
45
using System;
56
using System.Collections.Generic;
67
using System.Reflection;
@@ -50,7 +51,7 @@ public virtual void Initialize(CPlatformContainer serviceProvider)
5051
{
5152
}
5253

53-
protected override void Load(ContainerBuilder builder)
54+
protected override void Load(ContainerBuilder builder)
5455
{
5556
try
5657
{
@@ -60,6 +61,7 @@ protected override void Load(ContainerBuilder builder)
6061
{
6162
RegisterBuilder(Builder);
6263
RegisterComponents(Builder);
64+
6365
}
6466
}
6567
catch (Exception ex)
@@ -72,6 +74,7 @@ protected override void Load(ContainerBuilder builder)
7274
protected virtual void RegisterBuilder(ContainerBuilderWrapper builder)
7375
{
7476
}
77+
7578

7679
internal virtual void RegisterComponents(ContainerBuilderWrapper builder)
7780
{
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1-
using System;
1+
using Surging.Core.CPlatform.Utilities;
2+
using System;
23
using System.Collections.Generic;
34
using System.Text;
45

56
namespace Surging.Core.CPlatform.Module
67
{
7-
public class EnginePartModule : AbstractModule
8+
public class EnginePartModule : AbstractModule
89
{
910
public override void Initialize(CPlatformContainer serviceProvider)
1011
{
1112
base.Initialize(serviceProvider);
1213
}
14+
15+
16+
protected virtual void RegisterServiceBuilder(IServiceBuilder builder)
17+
{
18+
}
19+
1320

1421
internal override void RegisterComponents(ContainerBuilderWrapper builder)
1522
{
1623
base.RegisterComponents(builder);
24+
1725
}
26+
1827
}
28+
1929
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
using Autofac;
2+
using Microsoft.Extensions.Configuration;
3+
using Surging.Core.Caching.AddressResolvers;
4+
using Surging.Core.Caching.AddressResolvers.Implementation;
5+
using Surging.Core.Caching.Configurations;
6+
using Surging.Core.Caching.Configurations.Implementation;
7+
using Surging.Core.Caching.HashAlgorithms;
8+
using Surging.Core.Caching.HealthChecks;
9+
using Surging.Core.Caching.HealthChecks.Implementation;
10+
using Surging.Core.Caching.Interfaces;
11+
using Surging.Core.Caching.Internal.Implementation;
12+
using Surging.Core.Caching.Models;
13+
using Surging.Core.CPlatform;
14+
using Surging.Core.CPlatform.Cache;
15+
using Surging.Core.CPlatform.Module;
16+
using System;
17+
using System.Collections.Generic;
18+
using System.Linq;
19+
using System.Reflection;
20+
21+
namespace Surging.Core.Caching
22+
{
23+
public class CachingModule : EnginePartModule
24+
{
25+
public override void Initialize(CPlatformContainer serviceProvider)
26+
{
27+
base.Initialize(serviceProvider);
28+
var serviceCacheProvider = serviceProvider.GetInstances<ICacheNodeProvider>();
29+
var addressDescriptors = serviceCacheProvider.GetServiceCaches().ToList();
30+
serviceProvider.GetInstances<IServiceCacheManager>().SetCachesAsync(addressDescriptors);
31+
serviceProvider.GetInstances<IConfigurationWatchProvider>();
32+
}
33+
34+
/// <summary>
35+
/// Inject dependent third-party components
36+
/// </summary>
37+
/// <param name="builder"></param>
38+
protected override void RegisterBuilder(ContainerBuilderWrapper builder)
39+
{
40+
base.RegisterBuilder(builder);
41+
builder.RegisterType(typeof(DefaultHealthCheckService)).As(typeof(IHealthCheckService)).SingleInstance();
42+
builder.RegisterType(typeof(DefaultAddressResolver)).As(typeof(IAddressResolver)).SingleInstance();
43+
builder.RegisterType(typeof(HashAlgorithm)).As(typeof(IHashAlgorithm)).SingleInstance();
44+
builder.RegisterType(typeof(DefaultServiceCacheFactory)).As(typeof(IServiceCacheFactory)).SingleInstance();
45+
builder.RegisterType(typeof(DefaultCacheNodeProvider)).As(typeof(ICacheNodeProvider)).SingleInstance();
46+
builder.RegisterType(typeof(ConfigurationWatchProvider)).As(typeof(IConfigurationWatchProvider)).SingleInstance();
47+
RegisterConfigInstance(builder);
48+
RegisterLocalInstance("ICacheClient`1", builder);
49+
}
50+
51+
private static void RegisterLocalInstance(string typeName, ContainerBuilderWrapper builder)
52+
{
53+
var types = typeof(AppConfig)
54+
.Assembly.GetTypes().Where(p => p.GetTypeInfo().GetInterface(typeName) != null);
55+
foreach (var t in types)
56+
{
57+
var attribute = t.GetTypeInfo().GetCustomAttribute<IdentifyCacheAttribute>();
58+
builder.RegisterGeneric(t).Named(attribute.Name.ToString(), typeof(ICacheClient<>)).SingleInstance();
59+
}
60+
}
61+
62+
private static void RegisterConfigInstance(ContainerBuilderWrapper builder)
63+
{
64+
var cacheWrapperSetting = AppConfig.Configuration.Get<CachingProvider>();
65+
var bingingSettings = cacheWrapperSetting.CachingSettings;
66+
try
67+
{
68+
var types =
69+
typeof(AppConfig)
70+
.Assembly.GetTypes()
71+
.Where(
72+
p => p.GetTypeInfo().GetInterface("ICacheProvider") != null);
73+
foreach (var t in types)
74+
{
75+
foreach (var setting in bingingSettings)
76+
{
77+
var properties = setting.Properties;
78+
var args = properties.Select(p => GetTypedPropertyValue(p)).ToArray(); ;
79+
var maps =
80+
properties.Select(p => p.Maps)
81+
.FirstOrDefault(p => p != null && p.Any());
82+
var type = Type.GetType(setting.Class, throwOnError: true);
83+
builder.Register(p => Activator.CreateInstance(type, args)).Named(setting.Id, type).SingleInstance();
84+
85+
if (maps == null) continue;
86+
if (!maps.Any()) continue;
87+
foreach (
88+
var mapsetting in
89+
maps.Where(mapsetting => t.Name.StartsWith(mapsetting.Name, StringComparison.CurrentCultureIgnoreCase)))
90+
{
91+
builder.Register(p => Activator.CreateInstance(t, new object[] { setting.Id })).Named(string.Format("{0}.{1}", setting.Id, mapsetting.Name), typeof(ICacheProvider)).SingleInstance();
92+
}
93+
}
94+
var attribute = t.GetTypeInfo().GetCustomAttribute<IdentifyCacheAttribute>();
95+
if (attribute != null)
96+
builder.Register(p => Activator.CreateInstance(t)).Named(attribute.Name.ToString(), typeof(ICacheProvider)).SingleInstance();
97+
}
98+
}
99+
catch { }
100+
}
101+
102+
private static object GetTypedPropertyValue(Property obj)
103+
{
104+
var mapCollections = obj.Maps;
105+
if (mapCollections != null && mapCollections.Any())
106+
{
107+
var results = new List<object>();
108+
foreach (var map in mapCollections)
109+
{
110+
object items = null;
111+
if (map.Properties != null) items = map.Properties.Select(p => GetTypedPropertyValue(p)).ToArray();
112+
results.Add(new
113+
{
114+
Name = Convert.ChangeType(obj.Name, typeof(string)),
115+
Value = Convert.ChangeType(map.Name, typeof(string)),
116+
Items = items
117+
});
118+
}
119+
return results;
120+
}
121+
else if (!string.IsNullOrEmpty(obj.Value))
122+
{
123+
return new
124+
{
125+
Name = Convert.ChangeType(obj.Name ?? "", typeof(string)),
126+
Value = Convert.ChangeType(obj.Value, typeof(string)),
127+
};
128+
}
129+
else if (!string.IsNullOrEmpty(obj.Ref))
130+
return Convert.ChangeType(obj.Ref, typeof(string));
131+
132+
return null;
133+
}
134+
}
135+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using Autofac;
2+
using Microsoft.Extensions.Configuration;
3+
using Microsoft.Extensions.Logging;
4+
using RabbitMQ.Client;
5+
using Surging.Core.CPlatform;
6+
using Surging.Core.CPlatform.EventBus;
7+
using Surging.Core.CPlatform.EventBus.Events;
8+
using Surging.Core.CPlatform.Module;
9+
using Surging.Core.EventBusRabbitMQ.Configurations;
10+
using Surging.Core.EventBusRabbitMQ.Implementation;
11+
using System;
12+
using System.Collections.Generic;
13+
using Microsoft.Extensions.DependencyInjection;
14+
using Autofac;
15+
using Surging.Core.CPlatform.EventBus.Implementation;
16+
17+
namespace Surging.Core.EventBusRabbitMQ
18+
{
19+
public class EventBusRabbitMQModule : EnginePartModule
20+
{
21+
public override void Initialize(CPlatformContainer serviceProvider)
22+
{
23+
base.Initialize(serviceProvider);
24+
serviceProvider.GetInstances<ISubscriptionAdapt>().SubscribeAt();
25+
}
26+
27+
/// <summary>
28+
/// Inject dependent third-party components
29+
/// </summary>
30+
/// <param name="builder"></param>
31+
protected override void RegisterBuilder(ContainerBuilderWrapper builder)
32+
{
33+
base.RegisterBuilder(builder);
34+
UseRabbitMQTransport(builder)
35+
.AddRabbitMQAdapt(builder);
36+
}
37+
38+
public EventBusRabbitMQModule UseRabbitMQTransport(ContainerBuilderWrapper builder)
39+
{
40+
builder.RegisterType(typeof(Implementation.EventBusRabbitMQ)).As(typeof(IEventBus)).SingleInstance();
41+
builder.RegisterType(typeof(DefaultConsumeConfigurator)).As(typeof(IConsumeConfigurator)).SingleInstance();
42+
builder.RegisterType(typeof(InMemoryEventBusSubscriptionsManager)).As(typeof(IEventBusSubscriptionsManager)).SingleInstance();
43+
builder.Register(provider =>
44+
{
45+
var logger = provider.Resolve<ILogger<DefaultRabbitMQPersistentConnection>>();
46+
EventBusOption option = new EventBusOption();
47+
var section = CPlatform.AppConfig.GetSection("EventBus");
48+
if (section.Exists())
49+
option = section.Get<EventBusOption>();
50+
else if (AppConfig.Configuration != null)
51+
option = AppConfig.Configuration.Get<EventBusOption>();
52+
var factory = new ConnectionFactory()
53+
{
54+
HostName = option.EventBusConnection,
55+
UserName = option.EventBusUserName,
56+
Password = option.EventBusPassword,
57+
VirtualHost = option.VirtualHost,
58+
Port = int.Parse(option.Port),
59+
};
60+
factory.RequestedHeartbeat = 60;
61+
AppConfig.BrokerName = option.BrokerName;
62+
return new DefaultRabbitMQPersistentConnection(factory, logger);
63+
}).As<IRabbitMQPersistentConnection>();
64+
return this;
65+
}
66+
67+
private ContainerBuilderWrapper UseRabbitMQEventAdapt(ContainerBuilderWrapper builder, Func<IServiceProvider, ISubscriptionAdapt> adapt)
68+
{
69+
builder.RegisterAdapter(adapt);
70+
return builder;
71+
}
72+
73+
private EventBusRabbitMQModule AddRabbitMQAdapt(ContainerBuilderWrapper builder)
74+
{
75+
UseRabbitMQEventAdapt(builder,provider =>
76+
new RabbitMqSubscriptionAdapt(
77+
provider.GetService<IConsumeConfigurator>(),
78+
provider.GetService<IEnumerable<IIntegrationEventHandler>>()
79+
)
80+
);
81+
return this;
82+
}
83+
}
84+
}

src/Surging.Core/Surging.Core.NLog/NLogModule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Surging.Core.Nlog
1010
{
1111
public class NLogModule : EnginePartModule
1212
{
13-
private string nlogConfigFile = "${LogPath}|nLog.config";
13+
private string nlogConfigFile = "${LogPath}|NLog.config";
1414
public override void Initialize(CPlatformContainer serviceProvider)
1515
{
1616
base.Initialize(serviceProvider);

src/Surging.Core/Surging.Core.ProxyGenerator/ServiceProxyModule.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using Surging.Core.CPlatform;
2+
using Surging.Core.CPlatform.Convertibles;
23
using Surging.Core.CPlatform.Module;
4+
using Surging.Core.CPlatform.Runtime.Client;
5+
using Surging.Core.ProxyGenerator.Implementation;
36
using System;
47
using System.Collections.Generic;
58
using System.Text;
@@ -22,5 +25,6 @@ protected override void RegisterBuilder(ContainerBuilderWrapper builder)
2225
base.RegisterBuilder(builder);
2326

2427
}
28+
2529
}
2630
}

src/Surging.Services/Surging.Services.Client/Program.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,7 @@ static void Main(string[] args)
4141
{
4242
option.AddClient()
4343
.AddClientIntercepted(typeof(CacheProviderInterceptor))
44-
//option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181"));
45-
.UseRabbitMQTransport()
4644
.AddCache();
47-
//.UseKafkaMQTransport(kafkaOption =>
48-
//{
49-
// kafkaOption.Servers = "127.0.0.1";
50-
//});
51-
//.UseProtoBufferCodec()
5245
builder.Register(p => new CPlatformContainer(ServiceLocator.Current));
5346
});
5447
})
@@ -59,8 +52,6 @@ static void Main(string[] args)
5952
.Configure(build =>
6053
build.AddCPlatformFile("${surgingpath}|surgingSettings.json", optional: false, reloadOnChange: true))
6154
.UseNLog(LogLevel.Error)
62-
// .UseLog4net(LogLevel.Error)
63-
.UseServiceCache()
6455
.UseClient()
6556
.UseStartup<Startup>()
6657
.Build();

src/Surging.Services/Surging.Services.Client/surgingSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"Packages": [
1616
{
1717
"TypeName": "EnginePartModule",
18-
"Using": "${UseEngineParts}|DotNettyModule;NLogModule;MessagePackModule;ConsulModule;HttpProtocolModule;HttpProtocolModule;"
18+
"Using": "${UseEngineParts}|DotNettyModule;NLogModule;MessagePackModule;ConsulModule;HttpProtocolModule;EventBusRabbitMQModule;"
1919
}
2020
]
2121
},

src/Surging.Services/Surging.Services.Server/Program.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,18 @@ static void Main(string[] args)
4040
option.AddServiceRuntime()
4141
.AddRelateService()
4242
.AddConfigurationWatch()
43-
//option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181"));
44-
.UseRabbitMQTransport()
45-
.AddRabbitMQAdapt()
46-
.AddCache()
43+
//option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181"));
4744
.AddServiceEngine(typeof(SurgingServiceEngine));
4845
builder.Register(p => new CPlatformContainer(ServiceLocator.Current));
4946
});
5047
})
51-
.SubscribeAt()
5248
.ConfigureLogging(logger =>
5349
{
5450
logger.AddConfiguration(
5551
Core.CPlatform.AppConfig.GetSection("Logging"));
5652
})
5753
.UseServer(options =>{ })
5854
.UseConsoleLifetime()
59-
.UseServiceCache()
6055
.Configure(build =>
6156
build.AddCacheFile("${cachepath}|cacheSettings.json", optional: false, reloadOnChange: true))
6257
.Configure(build =>

src/Surging.Services/Surging.Services.Server/Surging.Services.Server.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
<ProjectReference Include="..\..\Surging.Core\Surging.Core.ServiceHosting\Surging.Core.ServiceHosting.csproj" />
3232
<ProjectReference Include="..\..\Surging.Core\Surging.Core.System\Surging.Core.System.csproj" />
3333
<ProjectReference Include="..\..\Surging.Core\Surging.Core.Zookeeper\Surging.Core.Zookeeper.csproj" />
34-
<ProjectReference Include="..\..\Surging.IModuleServices\Surging.IModuleServices.Common\Surging.IModuleServices.Common.csproj" />
35-
<ProjectReference Include="..\..\Surging.Modules\Surging.Modules.Common\Surging.Modules.Common.csproj" />
3634
</ItemGroup>
3735

3836
<ItemGroup>

0 commit comments

Comments
 (0)