Просмотр исходного кода

😁优化redis哨兵模式相关代码

zuohuaijun 2 лет назад
Родитель
Сommit
42ca043100

+ 3 - 3
Admin.NET/Admin.NET.Application/Configuration/Cache.json

@@ -18,11 +18,11 @@
       "ChannelPrefix": "signalrPrefix_"
     },
     "DataProtecteKey": "AdminNet:DataProtection-Keys",
-    "IsSentinel": false,
+    "IsSentinel": false, // 是否哨兵模式
     "SentinelConfig": {
       "DefaultDb": "4",
-      "EndPoints": [
-        // "10.10.0.124:26380", // 哨兵端口
+      "EndPoints": [ // 哨兵端口
+        // "10.10.0.124:26380"
       ],
       "MainPrefix": "adminNet:",
       "Password": "123456",

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>

+ 2 - 1
Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserOutput.cs

@@ -13,11 +13,12 @@ namespace Admin.NET.Core.Service;
 /// 用户登录信息
 /// </summary>
 public class LoginUserOutput
-{    
+{
     /// <summary>
     /// 用户id
     /// </summary>
     public long Id { get; set; }
+
     /// <summary>
     /// 账号名称
     /// </summary>

+ 56 - 61
Admin.NET/Admin.NET.Core/SignalR/SignalRSetup.cs

@@ -7,7 +7,6 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
-using Elasticsearch.Net;
 using Furion.Logging.Extensions;
 using Microsoft.AspNetCore.DataProtection;
 using StackExchange.Redis;
@@ -37,74 +36,70 @@ public static class SignalRSetup
 
         // 若已开启集群配置,则把SignalR配置为支持集群模式
         var clusterOpt = App.GetOptions<ClusterOptions>();
-        if (clusterOpt.Enabled)
+        if (!clusterOpt.Enabled)        
+            return;
+        
+        var redisOptions = clusterOpt.SentinelConfig;
+        ConnectionMultiplexer connection1;
+        if (clusterOpt.IsSentinel) // 哨兵模式
         {
-            var redisOptions = clusterOpt.SentinelConfig;
-            ConnectionMultiplexer connection1;
-            if (clusterOpt.IsSentinel)
-            {
-                var redisConfig = new ConfigurationOptions
-                {
-                    AbortOnConnectFail = false,
-                    ServiceName = redisOptions.ServiceName,
-                    AllowAdmin = true,
-                    DefaultDatabase = redisOptions.DefaultDb,
-                    Password = redisOptions.Password
-                };
-
-                redisOptions.EndPoints.ForEach(o =>
-                {
-                    redisConfig.EndPoints.Add(o);
-                });
-                connection1 = ConnectionMultiplexer.Connect(redisConfig);
-            }
-            else
+            var redisConfig = new ConfigurationOptions
             {
-                connection1 = ConnectionMultiplexer.Connect(clusterOpt.SignalR.RedisConfiguration);
-            }
-            // 密钥存储(数据保护)
-            services.AddDataProtection().PersistKeysToStackExchangeRedis(connection1, clusterOpt.DataProtecteKey);
+                AbortOnConnectFail = false,
+                ServiceName = redisOptions.ServiceName,
+                AllowAdmin = true,
+                DefaultDatabase = redisOptions.DefaultDb,
+                Password = redisOptions.Password
+            };
+            redisOptions.EndPoints.ForEach(u => redisConfig.EndPoints.Add(u));
+            connection1 = ConnectionMultiplexer.Connect(redisConfig);
+        }
+        else
+        {
+            connection1 = ConnectionMultiplexer.Connect(clusterOpt.SignalR.RedisConfiguration);
+        }
+        // 密钥存储(数据保护)
+        services.AddDataProtection().PersistKeysToStackExchangeRedis(connection1, clusterOpt.DataProtecteKey);
 
-            signalRBuilder.AddStackExchangeRedis(options =>
+        signalRBuilder.AddStackExchangeRedis(options =>
+        {
+            // 此处设置的ChannelPrefix并不会生效,如果两个不同的项目,且[程序集名+类名]一样,使用同一个redis服务,请注意修改 Hub/OnlineUserHub 的类名。
+            // 原因请参考下边链接:
+            // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs#L74
+            // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs#L33
+            options.Configuration.ChannelPrefix = clusterOpt.SignalR.ChannelPrefix;
+            options.ConnectionFactory = async writer =>
             {
-                // 此处设置的ChannelPrefix并不会生效,如果两个不同的项目,且[程序集名+类名]一样,使用同一个redis服务,请注意修改 Hub/OnlineUserHub 的类名。
-                // 原因请参考下边链接:
-                // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs#L74
-                // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs#L33
-                options.Configuration.ChannelPrefix = clusterOpt.SignalR.ChannelPrefix;
-                options.ConnectionFactory = async writer =>
+                ConnectionMultiplexer connection;
+                if (clusterOpt.IsSentinel)
                 {
-                    ConnectionMultiplexer connection;
-                    if (clusterOpt.IsSentinel)
+                    var config = new ConfigurationOptions
                     {
-                        var config = new ConfigurationOptions
-                        {
-                            AbortOnConnectFail = false,
-                            ServiceName = redisOptions.ServiceName,
-                            AllowAdmin = true,
-                            DefaultDatabase = redisOptions.DefaultDb,
-                            Password = redisOptions.Password
-                        };
-                        redisOptions.EndPoints.ForEach(o => config.EndPoints.Add(o));
-                        connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
-                    }
-                    else
-                    {
-                        connection = await ConnectionMultiplexer.ConnectAsync(clusterOpt.SignalR.RedisConfiguration);
-                    }
-
-                    connection.ConnectionFailed += (_, e) =>
-                    {
-                        "连接 Redis 失败".LogError();
+                        AbortOnConnectFail = false,
+                        ServiceName = redisOptions.ServiceName,
+                        AllowAdmin = true,
+                        DefaultDatabase = redisOptions.DefaultDb,
+                        Password = redisOptions.Password
                     };
+                    redisOptions.EndPoints.ForEach(u => config.EndPoints.Add(u));
+                    connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
+                }
+                else
+                {
+                    connection = await ConnectionMultiplexer.ConnectAsync(clusterOpt.SignalR.RedisConfiguration);
+                }
 
-                    if (!connection.IsConnected)
-                    {
-                        "无法连接 Redis".LogError();
-                    }
-                    return connection;
+                connection.ConnectionFailed += (_, e) =>
+                {
+                    "连接 Redis 失败".LogError();
                 };
-            });
-        }
+
+                if (!connection.IsConnected)
+                {
+                    "无法连接 Redis".LogError();
+                }
+                return connection;
+            };
+        });
     }
 }

+ 2 - 2
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -38,7 +38,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<EmailOptions>();
         services.AddConfigurableOptions<OAuthOptions>();
         services.AddConfigurableOptions<CryptogramOptions>();
-        services.AddConfigurableOptions<SMSOptions>();        
+        services.AddConfigurableOptions<SMSOptions>();
         //services.AddConfigurableOptions<IpRateLimitingOptions>();
         //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
         //services.AddConfigurableOptions<ClientRateLimitingOptions>();
@@ -47,7 +47,7 @@ public static class ProjectOptions
         services.Configure<IpRateLimitPolicies>(App.Configuration.GetSection("IpRateLimitPolicies"));
         services.Configure<ClientRateLimitOptions>(App.Configuration.GetSection("ClientRateLimiting"));
         services.Configure<ClientRateLimitPolicies>(App.Configuration.GetSection("ClientRateLimitPolicies"));
-     
+
         return services;
     }
 }