From 685620f65b1f7d3875a378a8e408a2e6e219496e Mon Sep 17 00:00:00 2001 From: Owen <315872858@qq.com> Date: Sun, 28 Apr 2019 18:08:46 +0800 Subject: [PATCH 1/3] Update PollyCircuitBreaker.cs --- src/Uragano.Core/PollyCircuitBreaker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Uragano.Core/PollyCircuitBreaker.cs b/src/Uragano.Core/PollyCircuitBreaker.cs index 3e62cd2..caceb33 100644 --- a/src/Uragano.Core/PollyCircuitBreaker.cs +++ b/src/Uragano.Core/PollyCircuitBreaker.cs @@ -58,7 +58,7 @@ private AsyncPolicy GetPolicy(string route, Type returnValueType) return null; if (service.ServiceCircuitBreakerOptions.HasInjection) return await ScriptInjection.Run(route); - return returnValueType.IsValueType ? Activator.CreateInstance(returnValueType) : null; + return returnValueType.IsValueType ? Activator.CreateInstance(returnValueType) : default; }); if (serviceCircuitBreakerOptions.ExceptionsAllowedBeforeBreaking > 0) { From 7ddc8bb1865a12acacf6e286bfebe9e21c50771e Mon Sep 17 00:00:00 2001 From: Owen <315872858@qq.com> Date: Mon, 29 Apr 2019 17:03:40 +0800 Subject: [PATCH 2/3] Optimized circuit breaker --- samples/Sample.Common/CircuitBreakerEvent.cs | 21 ++++++++---- samples/Sample.Server/HelloService.cs | 2 +- samples/Sample.Server/Startup.cs | 1 + samples/Sample.Server/appsettings.json | 6 ++-- .../CircuitBreaker/ICircuitBreaker.cs | 4 +-- src/Uragano.Abstract/IUraganoBuilder.cs | 8 +++-- src/Uragano.Core/PollyCircuitBreaker.cs | 26 +++++--------- src/Uragano.Core/UraganoBuilder.cs | 34 ++++++++++++------- .../Interceptor/ClientDefaultInterceptor.cs | 22 +++--------- src/Uragano.DynamicProxy/ServiceFactory.cs | 2 ++ 10 files changed, 63 insertions(+), 63 deletions(-) diff --git a/samples/Sample.Common/CircuitBreakerEvent.cs b/samples/Sample.Common/CircuitBreakerEvent.cs index c5bb8b0..9818ca4 100644 --- a/samples/Sample.Common/CircuitBreakerEvent.cs +++ b/samples/Sample.Common/CircuitBreakerEvent.cs @@ -16,37 +16,44 @@ public CircuitBreakerEvent(ILogger logger) } public async Task OnFallback(string route, MethodInfo methodInfo) { - Logger.LogTrace("Raise OnFallback"); + Logger.LogWarning("Raise OnFallback"); + await Task.CompletedTask; } public async Task OnBreak(string route, MethodInfo methodInfo, Exception exception, TimeSpan time) { - Logger.LogTrace($"Raise OnBreak;{exception.Message}"); + Logger.LogError($"Raise OnBreak;{exception.Message}"); + await Task.CompletedTask; } public async Task OnRest(string route, MethodInfo methodInfo) { - Logger.LogTrace("Raise OnRest"); + Logger.LogWarning("Raise OnRest"); + await Task.CompletedTask; } public async Task OnHalfOpen(string route, MethodInfo methodInfo) { - Logger.LogTrace("Raise OnHalfOpen"); + Logger.LogWarning("Raise OnHalfOpen"); + await Task.CompletedTask; } public async Task OnTimeOut(string route, MethodInfo methodInfo, Exception exception) { - Logger.LogTrace($"Raise OnTimeOut;{exception.Message}"); + Logger.LogWarning($"Raise OnTimeOut;{exception.Message}"); + await Task.CompletedTask; } public async Task OnRetry(string route, MethodInfo methodInfo, Exception exception, int retryTimes) { - Logger.LogTrace($"Raise OnRetry;{exception.Message};{retryTimes}"); + Logger.LogWarning($"Raise OnRetry;{exception.Message};{retryTimes}"); + await Task.CompletedTask; } public async Task OnBulkheadRejected(string route, MethodInfo methodInfo) { - Logger.LogTrace("Raise OnBulkheadRejected;"); + Logger.LogWarning("Raise OnBulkheadRejected;"); + await Task.CompletedTask; } } } diff --git a/samples/Sample.Server/HelloService.cs b/samples/Sample.Server/HelloService.cs index aa8d1c8..651fea3 100644 --- a/samples/Sample.Server/HelloService.cs +++ b/samples/Sample.Server/HelloService.cs @@ -15,7 +15,7 @@ public class HelloService : IHelloService [ServerMethodInterceptor] public async Task SayHello(string name) { - // await Task.Delay(2000); + //await Task.Delay(5000); return await Task.FromResult(new ResultModel { Message = name }); } diff --git a/samples/Sample.Server/Startup.cs b/samples/Sample.Server/Startup.cs index 7feb371..89a3dcb 100644 --- a/samples/Sample.Server/Startup.cs +++ b/samples/Sample.Server/Startup.cs @@ -44,6 +44,7 @@ public void ConfigureServices(IServiceCollection services) //builder.AddRedisPartitionCaching(); //builder.AddRedisCaching(); //builder.AddMemoryCaching(); + builder.AddCircuitBreaker(); builder.AddOption(UraganoOptions.Remoting_Invoke_CancellationTokenSource_Timeout, TimeSpan.FromSeconds(60)); builder.AddOptions(); }); diff --git a/samples/Sample.Server/appsettings.json b/samples/Sample.Server/appsettings.json index 3d0f01d..8ac8827 100644 --- a/samples/Sample.Server/appsettings.json +++ b/samples/Sample.Server/appsettings.json @@ -50,11 +50,11 @@ }, "CircuitBreaker": { "Polly": { - "timeout": 2000, - "retry": 3, + "timeout": 1000, + "retry": 1, "ExceptionsAllowedBeforeBreaking": 10, "DurationOfBreak": 60000, - "MaxParallelization": 0, + "MaxParallelization": 10, "MaxQueuingActions": 0 } }, diff --git a/src/Uragano.Abstract/CircuitBreaker/ICircuitBreaker.cs b/src/Uragano.Abstract/CircuitBreaker/ICircuitBreaker.cs index 810ae11..beb5969 100644 --- a/src/Uragano.Abstract/CircuitBreaker/ICircuitBreaker.cs +++ b/src/Uragano.Abstract/CircuitBreaker/ICircuitBreaker.cs @@ -5,8 +5,6 @@ namespace Uragano.Abstractions.CircuitBreaker { public interface ICircuitBreaker { - Task ExecuteAsync(string route, Func> action, Type returnValueType); - - Task ExecuteAsync(string route, Func action); + Task ExecuteAsync(string route, Func> action, Type returnValueType); } } diff --git a/src/Uragano.Abstract/IUraganoBuilder.cs b/src/Uragano.Abstract/IUraganoBuilder.cs index 7c83082..afc7a95 100644 --- a/src/Uragano.Abstract/IUraganoBuilder.cs +++ b/src/Uragano.Abstract/IUraganoBuilder.cs @@ -54,13 +54,15 @@ void AddServiceDiscovery(Type serviceDiscovery, IServiceDiscoveryClientConfigura void AddOptions(IConfigurationSection configuration); - void AddCircuitBreaker(int timeout = 3000, int retry = 3, int exceptionsAllowedBeforeBreaking = 10, int durationOfBreak = 60 * 1000) where TCircuitBreakerEvent : ICircuitBreakerEvent; + void AddCircuitBreaker(int timeout = 3000, int retry = 3, int exceptionsAllowedBeforeBreaking = 10, int durationOfBreak = 60 * 1000, int maxParallelization = 0, int maxQueuingActions = 0) where TCircuitBreakerEvent : ICircuitBreakerEvent; void AddCircuitBreaker(int timeout = 3000, int retry = 3, int exceptionsAllowedBeforeBreaking = 10, - int durationOfBreak = 60 * 1000); + int durationOfBreak = 60 * 1000, int maxParallelization = 0, int maxQueuingActions = 0); void AddCircuitBreaker(IConfigurationSection configurationSection); + void AddCircuitBreaker(IConfigurationSection configurationSection) where TCircuitBreakerEvent : ICircuitBreakerEvent; + void AddCodec() where TCodec : ICodec; void AddCaching(ICachingOptions cachingOptions) where TCaching : class, ICaching; @@ -90,5 +92,7 @@ public interface IUraganoSampleBuilder : IUraganoBuilder void AddOptions(); void AddCircuitBreaker(); + + void AddCircuitBreaker() where TCircuitBreakerEvent : ICircuitBreakerEvent; } } diff --git a/src/Uragano.Core/PollyCircuitBreaker.cs b/src/Uragano.Core/PollyCircuitBreaker.cs index caceb33..83272d6 100644 --- a/src/Uragano.Core/PollyCircuitBreaker.cs +++ b/src/Uragano.Core/PollyCircuitBreaker.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Concurrent; using System.Threading.Tasks; +using Uragano.Abstractions; using Uragano.Abstractions.CircuitBreaker; using Uragano.Abstractions.Service; @@ -17,7 +18,7 @@ public class PollyCircuitBreaker : ICircuitBreaker private IServiceFactory ServiceFactory { get; } - private static readonly ConcurrentDictionary> Policies = new ConcurrentDictionary>(); + private static readonly ConcurrentDictionary> Policies = new ConcurrentDictionary>(); public PollyCircuitBreaker(IServiceProvider serviceProvider, IScriptInjection scriptInjection, IServiceFactory serviceFactory) { @@ -26,39 +27,30 @@ public PollyCircuitBreaker(IServiceProvider serviceProvider, IScriptInjection sc ServiceFactory = serviceFactory; } - public async Task ExecuteAsync(string route, Func> action, Type returnValueType) + public async Task ExecuteAsync(string route, Func> action, Type returnValueType) { var policy = GetPolicy(route, returnValueType); return await policy.ExecuteAsync(action); } - public async Task ExecuteAsync(string route, Func action) - { - var policy = GetPolicy(route, null); - await policy.ExecuteAsync(async () => - { - await action(); - return null; - }); - } - - private AsyncPolicy GetPolicy(string route, Type returnValueType) + private AsyncPolicy GetPolicy(string route, Type returnValueType) { return Policies.GetOrAdd(route, key => { var service = ServiceFactory.Get(route); var serviceCircuitBreakerOptions = service.ServiceCircuitBreakerOptions; var circuitBreakerEvent = ServiceProvider.GetService(); - AsyncPolicy policy = Policy.Handle().FallbackAsync( + AsyncPolicy policy = Policy.Handle().FallbackAsync( async ct => { + //TODO 如果多次降级,根据路由排除此node if (circuitBreakerEvent != null) await circuitBreakerEvent.OnFallback(route, service.ClientMethodInfo); if (returnValueType == null) - return null; + return new ServiceResult(null); if (service.ServiceCircuitBreakerOptions.HasInjection) - return await ScriptInjection.Run(route); - return returnValueType.IsValueType ? Activator.CreateInstance(returnValueType) : default; + return new ServiceResult(await ScriptInjection.Run(route)); + return new ServiceResult(returnValueType.IsValueType ? Activator.CreateInstance(returnValueType) : default); }); if (serviceCircuitBreakerOptions.ExceptionsAllowedBeforeBreaking > 0) { diff --git a/src/Uragano.Core/UraganoBuilder.cs b/src/Uragano.Core/UraganoBuilder.cs index c3e847f..62820e1 100644 --- a/src/Uragano.Core/UraganoBuilder.cs +++ b/src/Uragano.Core/UraganoBuilder.cs @@ -230,27 +230,31 @@ public void AddOptions(IConfigurationSection configuration) #region Circuit breaker public void AddCircuitBreaker(int timeout = 3000, int retry = 3, - int exceptionsAllowedBeforeBreaking = 10, int durationOfBreak = 60000) where TCircuitBreakerEvent : ICircuitBreakerEvent + int exceptionsAllowedBeforeBreaking = 10, int durationOfBreak = 60000, int maxParallelization = 0, int maxQueuingActions = 0) where TCircuitBreakerEvent : ICircuitBreakerEvent { UraganoSettings.CircuitBreakerOptions = new CircuitBreakerOptions { Timeout = TimeSpan.FromMilliseconds(timeout), Retry = retry, ExceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking, - DurationOfBreak = TimeSpan.FromMilliseconds(durationOfBreak) + DurationOfBreak = TimeSpan.FromMilliseconds(durationOfBreak), + MaxParallelization = maxParallelization, + MaxQueuingActions = maxQueuingActions }; RegisterSingletonService(typeof(ICircuitBreakerEvent), typeof(TCircuitBreakerEvent)); } public void AddCircuitBreaker(int timeout = 3000, int retry = 3, int exceptionsAllowedBeforeBreaking = 10, - int durationOfBreak = 60000) + int durationOfBreak = 60000, int maxParallelization = 0, int maxQueuingActions = 0) { UraganoSettings.CircuitBreakerOptions = new CircuitBreakerOptions { Timeout = TimeSpan.FromMilliseconds(timeout), Retry = retry, ExceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking, - DurationOfBreak = TimeSpan.FromMilliseconds(durationOfBreak) + DurationOfBreak = TimeSpan.FromMilliseconds(durationOfBreak), + MaxParallelization = maxParallelization, + MaxQueuingActions = maxQueuingActions }; } @@ -261,16 +265,15 @@ public void AddCircuitBreaker(IConfigurationSection configurationSection) Timeout = TimeSpan.FromMilliseconds(configurationSection.GetValue("timeout")), Retry = configurationSection.GetValue("retry"), ExceptionsAllowedBeforeBreaking = configurationSection.GetValue("ExceptionsAllowedBeforeBreaking"), - DurationOfBreak = TimeSpan.FromMilliseconds(configurationSection.GetValue("DurationOfBreak")) + DurationOfBreak = TimeSpan.FromMilliseconds(configurationSection.GetValue("DurationOfBreak")), + MaxParallelization = configurationSection.GetValue("MaxParallelization"), + MaxQueuingActions = configurationSection.GetValue("MaxQueuingActions") }; - var eventTypeName = configurationSection.GetValue("EventHandler"); - if (!string.IsNullOrWhiteSpace(eventTypeName)) - { - var eventType = ReflectHelper.Find(eventTypeName); - if (eventType == null) - throw new TypeLoadException($"Cannot load type of {eventTypeName}."); - RegisterSingletonService(typeof(ICircuitBreakerEvent), eventType); - } + } + + public void AddCircuitBreaker(IConfigurationSection configurationSection) where TCircuitBreakerEvent : ICircuitBreakerEvent + { + AddCircuitBreaker(configurationSection.GetValue("timeout"), configurationSection.GetValue("retry"), configurationSection.GetValue("ExceptionsAllowedBeforeBreaking"), configurationSection.GetValue("DurationOfBreak"), configurationSection.GetValue("MaxParallelization"), configurationSection.GetValue("MaxQueuingActions")); } #endregion @@ -494,6 +497,11 @@ public void AddCircuitBreaker() { AddCircuitBreaker(Configuration.GetSection("Uragano:CircuitBreaker:Polly")); } + + public void AddCircuitBreaker() where TCircuitBreakerEvent : ICircuitBreakerEvent + { + AddCircuitBreaker(Configuration.GetSection("Uragano:CircuitBreaker:Polly")); + } } } diff --git a/src/Uragano.DynamicProxy/Interceptor/ClientDefaultInterceptor.cs b/src/Uragano.DynamicProxy/Interceptor/ClientDefaultInterceptor.cs index 79ef051..db89f9f 100644 --- a/src/Uragano.DynamicProxy/Interceptor/ClientDefaultInterceptor.cs +++ b/src/Uragano.DynamicProxy/Interceptor/ClientDefaultInterceptor.cs @@ -29,33 +29,21 @@ public override async Task Intercept(IInterceptorContext context //No circuit breaker if (UraganoSettings.CircuitBreakerOptions == null) { - if (ctx.ReturnType != null) - return new ServiceResult(await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta, - ctx.ReturnType)); - await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta, null); - return new ServiceResult(null); + return await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta); } //Circuit breaker - if (ctx.ReturnType != null) - return new ServiceResult(await CircuitBreaker.ExecuteAsync(ctx.ServiceRoute, - async () => await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta, - ctx.ReturnType), ctx.ReturnType)); - - await CircuitBreaker.ExecuteAsync(ctx.ServiceRoute, - async () => { await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta, null); }); - return new ServiceResult(null); + return await CircuitBreaker.ExecuteAsync(ctx.ServiceRoute, + async () => await Exec(ctx.ServiceName, ctx.ServiceRoute, ctx.Args, ctx.Meta), ctx.ReturnType); } - private async Task Exec(string serviceName, string route, object[] args, Dictionary meta, Type returnValueType) + private async Task Exec(string serviceName, string route, object[] args, Dictionary meta) { var node = await LoadBalancing.GetNextNode(serviceName, route, args, meta); var client = await ClientFactory.CreateClientAsync(serviceName, node); var result = await client.SendAsync(new InvokeMessage(route, args, meta)); if (result.Status != RemotingStatus.Ok) throw new RemoteInvokeException(route, result.Result?.ToString(), result.Status); - if (returnValueType == null) - return null; - return result.Result; + return result; } } } diff --git a/src/Uragano.DynamicProxy/ServiceFactory.cs b/src/Uragano.DynamicProxy/ServiceFactory.cs index 81cf63a..e63589c 100644 --- a/src/Uragano.DynamicProxy/ServiceFactory.cs +++ b/src/Uragano.DynamicProxy/ServiceFactory.cs @@ -58,6 +58,8 @@ public void Create(string route, MethodInfo serverMethodInfo, MethodInfo clientM breaker.ExceptionsAllowedBeforeBreaking = globalCircuitBreaker.ExceptionsAllowedBeforeBreaking; breaker.DurationOfBreak = globalCircuitBreaker.DurationOfBreak; + breaker.MaxParallelization = globalCircuitBreaker.MaxParallelization; + breaker.MaxQueuingActions = globalCircuitBreaker.MaxQueuingActions; } if (circuitBreakerAttr != null) From f16b2c33d99e069e672d0ace8b7c16e3caea30b3 Mon Sep 17 00:00:00 2001 From: Owen <315872858@qq.com> Date: Mon, 29 Apr 2019 17:20:49 +0800 Subject: [PATCH 3/3] v0.0.4 --- build.cake | 2 +- src/Uragano.Abstract/Uragano.Abstractions.csproj | 2 +- src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj | 2 +- src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj | 2 +- src/Uragano.Codec.MessagePack/Uragano.Codec.MessagePack.csproj | 2 +- src/Uragano.Consul/Uragano.Consul.csproj | 2 +- src/Uragano.Core/Uragano.Core.csproj | 2 +- src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj | 2 +- .../Uragano.Logging.Exceptionless.csproj | 2 +- src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj | 2 +- src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj | 2 +- src/Uragano.Remoting/Uragano.Remoting.csproj | 2 +- src/Uragano.ZooKeeper/Uragano.ZooKeeper.csproj | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build.cake b/build.cake index d742bac..597a9f7 100644 --- a/build.cake +++ b/build.cake @@ -5,7 +5,7 @@ /////////////////////////////////////////////////////////////////////////////// var output=Argument("output", "Output"); -var version=Argument("version", "0.0.3"); +var version=Argument("version", "0.0.4"); var target = Argument("target", "Default"); var release = Argument("release", true); var nugetApiKey = Argument("nugetApiKey", null); diff --git a/src/Uragano.Abstract/Uragano.Abstractions.csproj b/src/Uragano.Abstract/Uragano.Abstractions.csproj index 6289db3..f2e55a9 100644 --- a/src/Uragano.Abstract/Uragano.Abstractions.csproj +++ b/src/Uragano.Abstract/Uragano.Abstractions.csproj @@ -4,7 +4,7 @@ netstandard2.0 latest false - 0.0.3 + 0.0.4 A simple, high performance RPC library. https://github.com/1100100/Uragano Uragano,RPC,DotNetty,Microservice,MessagePack,DynamicProxy,dotnetcore,service-discovery,polly,circuit-breaker,consul,zookeeper,dependency-injection diff --git a/src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj b/src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj index 3f20d6f..8b70a55 100644 --- a/src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj +++ b/src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj @@ -4,7 +4,7 @@ netstandard2.0 latest false - 0.0.3 + 0.0.4 Owen Owen A simple, high performance RPC library. diff --git a/src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj b/src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj index e268a32..c97f2b4 100644 --- a/src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj +++ b/src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj @@ -4,7 +4,7 @@ netstandard2.0 latest false - 0.0.3 + 0.0.4 Owen Owen A simple, high performance RPC library. diff --git a/src/Uragano.Codec.MessagePack/Uragano.Codec.MessagePack.csproj b/src/Uragano.Codec.MessagePack/Uragano.Codec.MessagePack.csproj index abacd8c..e23d97e 100644 --- a/src/Uragano.Codec.MessagePack/Uragano.Codec.MessagePack.csproj +++ b/src/Uragano.Codec.MessagePack/Uragano.Codec.MessagePack.csproj @@ -4,7 +4,7 @@ netstandard2.0 latest false - 0.0.3 + 0.0.4 A simple, high performance RPC library. https://github.com/1100100/Uragano https://raw.githubusercontent.com/1100100/Uragano/master/icon.png diff --git a/src/Uragano.Consul/Uragano.Consul.csproj b/src/Uragano.Consul/Uragano.Consul.csproj index ff7c831..8b4dbfd 100644 --- a/src/Uragano.Consul/Uragano.Consul.csproj +++ b/src/Uragano.Consul/Uragano.Consul.csproj @@ -8,7 +8,7 @@ Uragano,RPC,DotNetty,Microservice,MessagePack,DynamicProxy,dotnetcore,service-discovery,polly,circuit-breaker,consul,zookeeper,dependency-injection https://github.com/1100100/Uragano A simple, high performance RPC library. - 0.0.3 + 0.0.4 Owen Owen diff --git a/src/Uragano.Core/Uragano.Core.csproj b/src/Uragano.Core/Uragano.Core.csproj index 69caa13..309bf1e 100644 --- a/src/Uragano.Core/Uragano.Core.csproj +++ b/src/Uragano.Core/Uragano.Core.csproj @@ -7,7 +7,7 @@ https://raw.githubusercontent.com/1100100/Uragano/master/icon.png https://github.com/1100100/Uragano A simple, high performance RPC library. - 0.0.3 + 0.0.4 false Owen diff --git a/src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj b/src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj index 8f7a9b1..844d8f5 100644 --- a/src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj +++ b/src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj @@ -8,7 +8,7 @@ https://raw.githubusercontent.com/1100100/Uragano/master/icon.png https://github.com/1100100/Uragano A simple, high performance RPC library. - 0.0.3 + 0.0.4 Owen Owen diff --git a/src/Uragano.Logging.Exceptionless/Uragano.Logging.Exceptionless.csproj b/src/Uragano.Logging.Exceptionless/Uragano.Logging.Exceptionless.csproj index a8d480a..4944421 100644 --- a/src/Uragano.Logging.Exceptionless/Uragano.Logging.Exceptionless.csproj +++ b/src/Uragano.Logging.Exceptionless/Uragano.Logging.Exceptionless.csproj @@ -3,7 +3,7 @@ netstandard2.0 false - 0.0.3 + 0.0.4 Owen Owen A simple, high performance RPC library. diff --git a/src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj b/src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj index 45c2674..4f7d5b4 100644 --- a/src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj +++ b/src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj @@ -3,7 +3,7 @@ netcoreapp2.2 false - 0.0.3 + 0.0.4 Owen Owen A simple, high performance RPC library. diff --git a/src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj b/src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj index 875d21c..3c689c5 100644 --- a/src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj +++ b/src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj @@ -2,7 +2,7 @@ netcoreapp2.2 - 0.0.3 + 0.0.4 Owen Owen A simple, high performance RPC library. diff --git a/src/Uragano.Remoting/Uragano.Remoting.csproj b/src/Uragano.Remoting/Uragano.Remoting.csproj index cdc1463..1de49e3 100644 --- a/src/Uragano.Remoting/Uragano.Remoting.csproj +++ b/src/Uragano.Remoting/Uragano.Remoting.csproj @@ -8,7 +8,7 @@ https://raw.githubusercontent.com/1100100/Uragano/master/icon.png https://github.com/1100100/Uragano A simple, high performance RPC library. - 0.0.3 + 0.0.4 Owen Owen diff --git a/src/Uragano.ZooKeeper/Uragano.ZooKeeper.csproj b/src/Uragano.ZooKeeper/Uragano.ZooKeeper.csproj index 0a8a58f..592bb2c 100644 --- a/src/Uragano.ZooKeeper/Uragano.ZooKeeper.csproj +++ b/src/Uragano.ZooKeeper/Uragano.ZooKeeper.csproj @@ -3,7 +3,7 @@ netstandard2.0 latest - 0.0.3 + 0.0.4 Owen Uragano.ZooKeeper A simple, high performance RPC library.