Skip to content

Commit 9377856

Browse files
committed
feat(DaprStarter): Support to obtain the value of HttpPort and GRPCPort from environment variables
1 parent a381ff2 commit 9377856

File tree

15 files changed

+258
-75
lines changed

15 files changed

+258
-75
lines changed

src/BuildingBlocks/Development/Masa.BuildingBlocks.Development.DaprStarter/Options/DaprOptions.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,14 @@ public ushort? AppPort
127127
/// The gRPC port for Dapr to listen on
128128
/// Must be greater than 0
129129
/// </summary>
130-
public ushort? DaprGrpcPort
130+
// ReSharper disable once InconsistentNaming
131+
public ushort? DaprGRPCPort
131132
{
132133
get => _daprGrpcPort;
133134
set
134135
{
135136
if (value != null)
136-
MasaArgumentException.ThrowIfLessThanOrEqual(value.Value, (ushort)0, nameof(DaprGrpcPort));
137+
MasaArgumentException.ThrowIfLessThanOrEqual(value.Value, (ushort)0, nameof(DaprGRPCPort));
137138

138139
_daprGrpcPort = value;
139140
}

src/Contrib/Development/Masa.Contrib.Development.DaprStarter.AspNetCore/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ builder.Services.AddDaprStarter(opt =>
3131
opt.AppPort = 5001;
3232
opt.AppIdSuffix = "";
3333
opt.DaprHttpPort = 8080;
34-
opt.DaprGrpcPort = 8081;
34+
opt.DaprGRPCPort = 8081;
3535
});
3636
```
3737

@@ -46,7 +46,7 @@ Step 1: Add a `DaprOptions` node to store the DaprStarter startup configuration,
4646
"AppPort": 5001,
4747
"AppIdSuffix": "",
4848
"DaprHttpPort": 8080,
49-
"DaprGrpcPort": 8081
49+
"DaprGRPCPort": 8081
5050
}
5151
}
5252
```

src/Contrib/Development/Masa.Contrib.Development.DaprStarter.AspNetCore/README.zh-CN.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ builder.Services.AddDaprStarter(opt =>
3131
opt.AppPort = 5001;
3232
opt.AppIdSuffix = "";
3333
opt.DaprHttpPort = 8080;
34-
opt.DaprGrpcPort = 8081;
34+
opt.DaprGRPCPort = 8081;
3535
});
3636
```
3737

@@ -46,7 +46,7 @@ builder.Services.AddDaprStarter(opt =>
4646
"AppPort": 5001,
4747
"AppIdSuffix": "",
4848
"DaprHttpPort": 8080,
49-
"DaprGrpcPort": 8081
49+
"DaprGRPCPort": 8081
5050
}
5151
}
5252
```

src/Contrib/Development/Masa.Contrib.Development.DaprStarter.AspNetCore/ServiceCollectionExtensions.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,21 @@ private static IServiceCollection AddDaprStarter(this IServiceCollection service
5050

5151
services.TryAddSingleton<IAppPortProvider, DefaultAppPortProvider>();
5252
action.Invoke();
53-
if (isDelay) return services.AddHostedService<DaprBackgroundService>();
5453

5554
var serviceProvider = services.BuildServiceProvider();
5655
var options = serviceProvider.GetRequiredService<IOptionsMonitor<DaprOptions>>();
56+
var daprEnvironmentProvider = serviceProvider.GetRequiredService<IDaprEnvironmentProvider>();
57+
daprEnvironmentProvider.CompleteDaprEnvironment(options.CurrentValue.DaprHttpPort, options.CurrentValue.DaprGRPCPort);
58+
59+
if (isDelay) return services.AddHostedService<DaprBackgroundService>();
5760

5861
ArgumentNullException.ThrowIfNull(options.CurrentValue.AppPort);
5962
var daprProcess = serviceProvider.GetRequiredService<IDaprProcess>();
6063
daprProcess.Start();
6164
return services;
6265
}
6366

67+
6468
private sealed class DaprService
6569
{
6670

src/Contrib/Development/Masa.Contrib.Development.DaprStarter.AspNetCore/_Imports.cs

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@
1111
global using Microsoft.Extensions.Logging;
1212
global using Microsoft.Extensions.Options;
1313
global using System.Diagnostics.CodeAnalysis;
14+
global using Masa.Contrib.Development.DaprStarter;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.Development.DaprStarter;
5+
6+
public class DaprEnvironmentProvider : IDaprEnvironmentProvider
7+
{
8+
private const string GRPC_PORT = "DAPR_GRPC_PORT";
9+
10+
private const string HTTP_PORT = "DAPR_HTTP_PORT";
11+
12+
public ushort? GetHttpPort() => GetEnvironmentVariable(HTTP_PORT);
13+
14+
public ushort? GetGrpcPort() => GetEnvironmentVariable(GRPC_PORT);
15+
16+
private static ushort? GetEnvironmentVariable(string environment)
17+
{
18+
if (ushort.TryParse(Environment.GetEnvironmentVariable(environment), out ushort port))
19+
return port;
20+
21+
return null;
22+
}
23+
24+
public bool TrySetHttpPort(ushort? httpPort)
25+
{
26+
if (httpPort is > 0)
27+
{
28+
SetHttpPort(httpPort.Value);
29+
return true;
30+
}
31+
return false;
32+
}
33+
34+
// ReSharper disable once InconsistentNaming
35+
public bool TrySetGrpcPort(ushort? gRPCPort)
36+
{
37+
if (gRPCPort is > 0)
38+
{
39+
SetGrpcPort(gRPCPort.Value);
40+
return true;
41+
}
42+
return false;
43+
}
44+
45+
public void SetHttpPort(ushort httpPort) => Environment.SetEnvironmentVariable(HTTP_PORT, httpPort.ToString());
46+
47+
// ReSharper disable once InconsistentNaming
48+
public void SetGrpcPort(ushort gRPCPort) => Environment.SetEnvironmentVariable(GRPC_PORT, gRPCPort.ToString());
49+
50+
// ReSharper disable once InconsistentNaming
51+
public void CompleteDaprEnvironment(ushort? httpPort, ushort? gRPCPort)
52+
{
53+
if (gRPCPort is > 0) SetGrpcPort(gRPCPort.Value);
54+
55+
if (httpPort is > 0) SetHttpPort(httpPort.Value);
56+
}
57+
}

src/Contrib/Development/Masa.Contrib.Development.DaprStarter/DaprProcess.cs

+23-34
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ public DaprProcess(
2626
IDaprProvider daprProvider,
2727
IProcessProvider processProvider,
2828
IOptionsMonitor<DaprOptions> daprOptions,
29+
IDaprEnvironmentProvider daprEnvironmentProvider,
2930
ILogger<DaprProcess>? logger = null,
30-
IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions = null) : base(masaAppConfigureOptions)
31+
IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions = null) : base(daprEnvironmentProvider, masaAppConfigureOptions)
3132
{
3233
_daprProvider = daprProvider;
3334
_processProvider = processProvider;
@@ -40,7 +41,7 @@ public void Start()
4041
{
4142
lock (_lock)
4243
{
43-
var options = ConvertTo(_daprOptions.CurrentValue);
44+
var options = ConvertToDaprCoreOptions(_daprOptions.CurrentValue);
4445

4546
StartCore(options);
4647
}
@@ -54,7 +55,7 @@ private void StartCore(DaprCoreOptions options)
5455

5556
if (_isFirst)
5657
{
57-
CompleteDaprEnvironment(options.DaprHttpPort, options.DaprGrpcPort);
58+
CompleteDaprEnvironment(options.DaprHttpPort, options.DaprGRPCPort);
5859
}
5960

6061
_process = _daprProvider.DaprStart(
@@ -78,19 +79,23 @@ private void StartCore(DaprCoreOptions options)
7879
}
7980
}
8081

81-
public void CompleteDaprEnvironment(ushort? httpPort, ushort? grpcPort)
82+
public void CompleteDaprEnvironment(ushort? httpPort, ushort? gRPCPort)
8283
{
83-
if (grpcPort is > 0)
84-
CompleteDaprGrpcPortEnvironment(grpcPort.Value);
85-
86-
if (httpPort is > 0)
87-
CompleteDaprHttpPortEnvironment(httpPort.Value);
84+
var setHttpPortResult = DaprEnvironmentProvider.TrySetHttpPort(httpPort);
85+
if (setHttpPortResult)
86+
{
87+
SuccessDaprOptions!.TrySetHttpPort(httpPort);
88+
_logger?.LogInformation("Update Dapr environment variables, DaprHttpPort: {HttpPort}", httpPort);
89+
}
8890

89-
if (httpPort is > 0 && grpcPort is > 0)
91+
var setGrpcPortResult = DaprEnvironmentProvider.TrySetGrpcPort(gRPCPort);
92+
if (setGrpcPortResult)
9093
{
91-
SuccessDaprOptions!.SetPort(httpPort.Value, grpcPort.Value);
92-
CompleteDaprEnvironment(httpPort.Value, grpcPort.Value, () => _isFirst = false);
94+
SuccessDaprOptions!.TrySetGrpcPort(gRPCPort);
95+
_logger?.LogInformation("Update Dapr environment variables, DAPR_GRPC_PORT: {GrpcPort}", gRPCPort);
9396
}
97+
98+
if (setHttpPortResult && setGrpcPortResult) _isFirst = false;
9499
}
95100

96101
public void CheckAndCompleteDaprEnvironment(string? data)
@@ -99,25 +104,9 @@ public void CheckAndCompleteDaprEnvironment(string? data)
99104
return;
100105

101106
var httpPort = GetHttpPort(data);
102-
var grpcPort = GetGrpcPort(data);
103-
104-
CompleteDaprEnvironment(httpPort, grpcPort);
105-
}
107+
var gRPCPort = GetgRPCPort(data);
106108

107-
/// <summary>
108-
/// Improve the information of HttpPort and GrpcPort successfully configured.
109-
/// When Port is specified or Dapr is closed for other reasons after startup, the HttpPort and GrpcPort are the same as the Port assigned at the first startup.
110-
/// </summary>
111-
private void CompleteDaprEnvironment(ushort httpPort, ushort grpcPort, Action action)
112-
{
113-
if (CompleteDaprHttpPortEnvironment(httpPort) && CompleteDaprGrpcPortEnvironment(grpcPort))
114-
{
115-
action.Invoke();
116-
_logger?.LogInformation(
117-
"Update Dapr environment variables, DaprHttpPort: {HttpPort}, DAPR_GRPC_PORT: {GrpcPort}",
118-
httpPort,
119-
grpcPort);
120-
}
109+
CompleteDaprEnvironment(httpPort, gRPCPort);
121110
}
122111

123112
public void Stop()
@@ -144,8 +133,8 @@ private void StopCore(DaprCoreOptions? options)
144133

145134
if (options.DaprHttpPort != null)
146135
CheckPortAndKill(options.DaprHttpPort.Value);
147-
if (options.DaprGrpcPort != null)
148-
CheckPortAndKill(options.DaprGrpcPort.Value);
136+
if (options.DaprGRPCPort != null)
137+
CheckPortAndKill(options.DaprGRPCPort.Value);
149138
}
150139
}
151140

@@ -164,7 +153,7 @@ public void Refresh(DaprOptions options)
164153
options.AppPort = SuccessDaprOptions.AppPort;
165154
options.EnableSsl = SuccessDaprOptions.EnableSsl;
166155
options.DaprHttpPort = SuccessDaprOptions.DaprHttpPort;
167-
options.DaprGrpcPort = SuccessDaprOptions.DaprGrpcPort;
156+
options.DaprGRPCPort = SuccessDaprOptions.DaprGRPCPort;
168157

169158
UpdateStatus(DaprProcessStatus.Restarting);
170159
_logger?.LogDebug(
@@ -176,7 +165,7 @@ public void Refresh(DaprOptions options)
176165
_isFirst = true;
177166
SuccessDaprOptions = null;
178167
_logger?.LogDebug("Dapr configuration refresh, Dapr AppId is {AppId}, restarting dapr, please wait...", options.AppId);
179-
StartCore(ConvertTo(options));
168+
StartCore(ConvertToDaprCoreOptions(options));
180169
}
181170
}
182171

src/Contrib/Development/Masa.Contrib.Development.DaprStarter/DaprProcessBase.cs

+16-19
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ public abstract class DaprProcessBase
88
{
99
private readonly IOptions<MasaAppConfigureOptions>? _masaAppConfigureOptions;
1010

11+
protected IDaprEnvironmentProvider DaprEnvironmentProvider { get; }
12+
1113
/// <summary>
1214
/// Use after getting dapr AppId and global AppId fails
1315
/// </summary>
14-
private static readonly string _defaultAppId = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName().Name!.Replace(
16+
private static readonly string DefaultAppId = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName().Name!.Replace(
1517
".",
1618
Constant.DEFAULT_APPID_DELIMITER);
1719

@@ -20,18 +22,19 @@ public abstract class DaprProcessBase
2022

2123
internal DaprCoreOptions? SuccessDaprOptions;
2224

23-
protected DaprProcessBase(IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions)
25+
protected DaprProcessBase(IDaprEnvironmentProvider daprEnvironmentProvider, IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions)
2426
{
27+
DaprEnvironmentProvider = daprEnvironmentProvider;
2528
_masaAppConfigureOptions = masaAppConfigureOptions;
2629
}
2730

28-
internal DaprCoreOptions ConvertTo(DaprOptions options)
31+
internal DaprCoreOptions ConvertToDaprCoreOptions(DaprOptions options)
2932
{
3033
var appId = options.AppId;
3134
if (appId.IsNullOrWhiteSpace())
3235
appId = _masaAppConfigureOptions?.Value.AppId;
3336
if (appId.IsNullOrWhiteSpace())
34-
appId = _defaultAppId;
37+
appId = DefaultAppId;
3538
if (options.IsIncompleteAppId())
3639
appId = $"{appId}{options.AppIdDelimiter}{options.AppIdSuffix ?? NetworkUtils.GetPhysicalAddress()}";
3740
DaprCoreOptions
@@ -40,8 +43,8 @@ internal DaprCoreOptions ConvertTo(DaprOptions options)
4043
options.AppPort ?? throw new ArgumentNullException(nameof(options), $"{options.AppPort} must be greater than 0"),
4144
options.AppProtocol,
4245
options.EnableSsl,
43-
options.DaprGrpcPort,
44-
options.DaprHttpPort,
46+
options.DaprGRPCPort ?? DaprEnvironmentProvider.GetGrpcPort(),
47+
options.DaprHttpPort ?? DaprEnvironmentProvider.GetHttpPort(),
4548
options.EnableHeartBeat)
4649
{
4750
HeartBeatInterval = options.HeartBeatInterval,
@@ -73,7 +76,7 @@ internal CommandLineBuilder CreateCommandLineBuilder(DaprCoreOptions options)
7376
.Add("components-path", options.ComponentPath ?? string.Empty, options.ComponentPath == null)
7477
.Add("app-max-concurrency", options.MaxConcurrency?.ToString() ?? string.Empty, options.MaxConcurrency == null)
7578
.Add("config", options.Config ?? string.Empty, options.Config == null)
76-
.Add("dapr-grpc-port", options.DaprGrpcPort?.ToString() ?? string.Empty, !(options.DaprGrpcPort > 0))
79+
.Add("dapr-grpc-port", options.DaprGRPCPort?.ToString() ?? string.Empty, !(options.DaprGRPCPort > 0))
7780
.Add("dapr-http-port", options.DaprHttpPort?.ToString() ?? string.Empty, !(options.DaprHttpPort > 0))
7881
.Add("enable-profiling", options.EnableProfiling?.ToString().ToLower() ?? string.Empty, options.EnableProfiling == null)
7982
.Add("image", options.Image ?? string.Empty, options.Image == null)
@@ -89,12 +92,6 @@ internal CommandLineBuilder CreateCommandLineBuilder(DaprCoreOptions options)
8992
return commandLineBuilder;
9093
}
9194

92-
protected static bool CompleteDaprGrpcPortEnvironment(ushort daprGrpcPort)
93-
=> EnvironmentUtils.TrySetEnvironmentVariable("DAPR_GRPC_PORT", daprGrpcPort.ToString());
94-
95-
protected static bool CompleteDaprHttpPortEnvironment(ushort httpPort)
96-
=> EnvironmentUtils.TrySetEnvironmentVariable("DAPR_HTTP_PORT", httpPort.ToString());
97-
9895
protected static ushort GetHttpPort(string data)
9996
{
10097
ushort httpPort = 0;
@@ -106,14 +103,14 @@ protected static ushort GetHttpPort(string data)
106103
return httpPort;
107104
}
108105

109-
protected static ushort GetGrpcPort(string data)
106+
protected static ushort GetgRPCPort(string data)
110107
{
111-
ushort grpcPort = 0;
112-
var grpcPortMatch = Regex.Matches(data, GRPC_PORT_PATTERN);
113-
if (grpcPortMatch.Count > 0)
108+
ushort gRPCPort = 0;
109+
var gRPCPortMatch = Regex.Matches(data, GRPC_PORT_PATTERN);
110+
if (gRPCPortMatch.Count > 0)
114111
{
115-
grpcPort = ushort.Parse(grpcPortMatch[0].Groups[1].ToString());
112+
gRPCPort = ushort.Parse(gRPCPortMatch[0].Groups[1].ToString());
116113
}
117-
return grpcPort;
114+
return gRPCPort;
118115
}
119116
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.Development.DaprStarter;
5+
6+
public interface IDaprEnvironmentProvider
7+
{
8+
ushort? GetHttpPort();
9+
10+
ushort? GetGrpcPort();
11+
12+
/// <summary>
13+
/// Set the HttpPort environment variable
14+
/// When httpPort is greater than 0, return true
15+
/// </summary>
16+
/// <param name="httpPort"></param>
17+
/// <returns></returns>
18+
bool TrySetHttpPort(ushort? httpPort);
19+
20+
/// <summary>
21+
/// Set the GrpcPort environment variable
22+
/// When gRPCPort is greater than 0, return true
23+
/// </summary>
24+
/// <param name="gRPCPort"></param>
25+
/// <returns></returns>
26+
// ReSharper disable once InconsistentNaming
27+
bool TrySetGrpcPort(ushort? gRPCPort);
28+
29+
void SetHttpPort(ushort httpPort);
30+
31+
// ReSharper disable once InconsistentNaming
32+
void SetGrpcPort(ushort gRPCPort);
33+
34+
// ReSharper disable once InconsistentNaming
35+
void CompleteDaprEnvironment(ushort? httpPort, ushort? gRPCPort);
36+
}

0 commit comments

Comments
 (0)