Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(DaprStarter): Support to obtain the value of HttpPort and GrpcPort from environment variables #341

Merged
merged 2 commits into from
Nov 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,21 @@ private static IServiceCollection AddDaprStarter(this IServiceCollection service

services.TryAddSingleton<IAppPortProvider, DefaultAppPortProvider>();
action.Invoke();
if (isDelay) return services.AddHostedService<DaprBackgroundService>();

var serviceProvider = services.BuildServiceProvider();
var options = serviceProvider.GetRequiredService<IOptionsMonitor<DaprOptions>>();
var daprEnvironmentProvider = serviceProvider.GetRequiredService<IDaprEnvironmentProvider>();
daprEnvironmentProvider.CompleteDaprEnvironment(options.CurrentValue.DaprHttpPort, options.CurrentValue.DaprGrpcPort);

if (isDelay) return services.AddHostedService<DaprBackgroundService>();

ArgumentNullException.ThrowIfNull(options.CurrentValue.AppPort);
var daprProcess = serviceProvider.GetRequiredService<IDaprProcess>();
daprProcess.Start();
return services;
}


private sealed class DaprService
{

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.

global using Masa.BuildingBlocks.Development.DaprStarter;
global using Masa.Contrib.Development.DaprStarter;
global using Masa.Contrib.Development.DaprStarter.AspNetCore;
global using Microsoft.AspNetCore.Hosting.Server;
global using Microsoft.AspNetCore.Hosting.Server.Features;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.

namespace Masa.Contrib.Development.DaprStarter;

public class DaprEnvironmentProvider : IDaprEnvironmentProvider
{
private const string GRPC_PORT = "DAPR_GRPC_PORT";

private const string HTTP_PORT = "DAPR_HTTP_PORT";

public ushort? GetHttpPort() => GetEnvironmentVariable(HTTP_PORT);

public ushort? GetGrpcPort() => GetEnvironmentVariable(GRPC_PORT);

private static ushort? GetEnvironmentVariable(string environment)
{
if (ushort.TryParse(Environment.GetEnvironmentVariable(environment), out ushort port))
return port;

return null;
}

public bool TrySetHttpPort(ushort? httpPort)
{
if (httpPort is > 0)
{
SetHttpPort(httpPort.Value);
return true;
}
return false;
}

// ReSharper disable once InconsistentNaming
public bool TrySetGrpcPort(ushort? grpcPort)
{
if (grpcPort is > 0)
{
SetGrpcPort(grpcPort.Value);
return true;
}
return false;
}

public void SetHttpPort(ushort httpPort) => Environment.SetEnvironmentVariable(HTTP_PORT, httpPort.ToString());

// ReSharper disable once InconsistentNaming
public void SetGrpcPort(ushort grpcPort) => Environment.SetEnvironmentVariable(GRPC_PORT, grpcPort.ToString());

// ReSharper disable once InconsistentNaming
public void CompleteDaprEnvironment(ushort? httpPort, ushort? grpcPort)
{
if (grpcPort is > 0) SetGrpcPort(grpcPort.Value);

if (httpPort is > 0) SetHttpPort(httpPort.Value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ public DaprProcess(
IDaprProvider daprProvider,
IProcessProvider processProvider,
IOptionsMonitor<DaprOptions> daprOptions,
IDaprEnvironmentProvider daprEnvironmentProvider,
ILogger<DaprProcess>? logger = null,
IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions = null) : base(masaAppConfigureOptions)
IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions = null) : base(daprEnvironmentProvider, masaAppConfigureOptions)
{
_daprProvider = daprProvider;
_processProvider = processProvider;
Expand All @@ -40,7 +41,7 @@ public void Start()
{
lock (_lock)
{
var options = ConvertTo(_daprOptions.CurrentValue);
var options = ConvertToDaprCoreOptions(_daprOptions.CurrentValue);

StartCore(options);
}
Expand Down Expand Up @@ -80,17 +81,21 @@ private void StartCore(DaprCoreOptions options)

public void CompleteDaprEnvironment(ushort? httpPort, ushort? grpcPort)
{
if (grpcPort is > 0)
CompleteDaprGrpcPortEnvironment(grpcPort.Value);

if (httpPort is > 0)
CompleteDaprHttpPortEnvironment(httpPort.Value);
var setHttpPortResult = DaprEnvironmentProvider.TrySetHttpPort(httpPort);
if (setHttpPortResult)
{
SuccessDaprOptions!.TrySetHttpPort(httpPort);
_logger?.LogInformation("Update Dapr environment variables, DaprHttpPort: {HttpPort}", httpPort);
}

if (httpPort is > 0 && grpcPort is > 0)
var setGrpcPortResult = DaprEnvironmentProvider.TrySetGrpcPort(grpcPort);
if (setGrpcPortResult)
{
SuccessDaprOptions!.SetPort(httpPort.Value, grpcPort.Value);
CompleteDaprEnvironment(httpPort.Value, grpcPort.Value, () => _isFirst = false);
SuccessDaprOptions!.TrySetGrpcPort(grpcPort);
_logger?.LogInformation("Update Dapr environment variables, DAPR_GRPC_PORT: {grpcPort}", grpcPort);
}

if (setHttpPortResult && setGrpcPortResult) _isFirst = false;
}

public void CheckAndCompleteDaprEnvironment(string? data)
Expand All @@ -99,27 +104,11 @@ public void CheckAndCompleteDaprEnvironment(string? data)
return;

var httpPort = GetHttpPort(data);
var grpcPort = GetGrpcPort(data);
var grpcPort = GetgRPCPort(data);

CompleteDaprEnvironment(httpPort, grpcPort);
}

/// <summary>
/// Improve the information of HttpPort and GrpcPort successfully configured.
/// 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.
/// </summary>
private void CompleteDaprEnvironment(ushort httpPort, ushort grpcPort, Action action)
{
if (CompleteDaprHttpPortEnvironment(httpPort) && CompleteDaprGrpcPortEnvironment(grpcPort))
{
action.Invoke();
_logger?.LogInformation(
"Update Dapr environment variables, DaprHttpPort: {HttpPort}, DAPR_GRPC_PORT: {GrpcPort}",
httpPort,
grpcPort);
}
}

public void Stop()
{
lock (_lock)
Expand Down Expand Up @@ -176,7 +165,7 @@ public void Refresh(DaprOptions options)
_isFirst = true;
SuccessDaprOptions = null;
_logger?.LogDebug("Dapr configuration refresh, Dapr AppId is {AppId}, restarting dapr, please wait...", options.AppId);
StartCore(ConvertTo(options));
StartCore(ConvertToDaprCoreOptions(options));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ public abstract class DaprProcessBase
{
private readonly IOptions<MasaAppConfigureOptions>? _masaAppConfigureOptions;

protected IDaprEnvironmentProvider DaprEnvironmentProvider { get; }

/// <summary>
/// Use after getting dapr AppId and global AppId fails
/// </summary>
private static readonly string _defaultAppId = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName().Name!.Replace(
private static readonly string DefaultAppId = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName().Name!.Replace(
".",
Constant.DEFAULT_APPID_DELIMITER);

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

internal DaprCoreOptions? SuccessDaprOptions;

protected DaprProcessBase(IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions)
protected DaprProcessBase(IDaprEnvironmentProvider daprEnvironmentProvider, IOptions<MasaAppConfigureOptions>? masaAppConfigureOptions)
{
DaprEnvironmentProvider = daprEnvironmentProvider;
_masaAppConfigureOptions = masaAppConfigureOptions;
}

internal DaprCoreOptions ConvertTo(DaprOptions options)
internal DaprCoreOptions ConvertToDaprCoreOptions(DaprOptions options)
{
var appId = options.AppId;
if (appId.IsNullOrWhiteSpace())
appId = _masaAppConfigureOptions?.Value.AppId;
if (appId.IsNullOrWhiteSpace())
appId = _defaultAppId;
appId = DefaultAppId;
if (options.IsIncompleteAppId())
appId = $"{appId}{options.AppIdDelimiter}{options.AppIdSuffix ?? NetworkUtils.GetPhysicalAddress()}";
DaprCoreOptions
Expand All @@ -40,8 +43,8 @@ internal DaprCoreOptions ConvertTo(DaprOptions options)
options.AppPort ?? throw new ArgumentNullException(nameof(options), $"{options.AppPort} must be greater than 0"),
options.AppProtocol,
options.EnableSsl,
options.DaprGrpcPort,
options.DaprHttpPort,
options.DaprGrpcPort ?? DaprEnvironmentProvider.GetGrpcPort(),
options.DaprHttpPort ?? DaprEnvironmentProvider.GetHttpPort(),
options.EnableHeartBeat)
{
HeartBeatInterval = options.HeartBeatInterval,
Expand Down Expand Up @@ -89,12 +92,6 @@ internal CommandLineBuilder CreateCommandLineBuilder(DaprCoreOptions options)
return commandLineBuilder;
}

protected static bool CompleteDaprGrpcPortEnvironment(ushort daprGrpcPort)
=> EnvironmentUtils.TrySetEnvironmentVariable("DAPR_GRPC_PORT", daprGrpcPort.ToString());

protected static bool CompleteDaprHttpPortEnvironment(ushort httpPort)
=> EnvironmentUtils.TrySetEnvironmentVariable("DAPR_HTTP_PORT", httpPort.ToString());

protected static ushort GetHttpPort(string data)
{
ushort httpPort = 0;
Expand All @@ -106,13 +103,13 @@ protected static ushort GetHttpPort(string data)
return httpPort;
}

protected static ushort GetGrpcPort(string data)
protected static ushort GetgRPCPort(string data)
{
ushort grpcPort = 0;
var grpcPortMatch = Regex.Matches(data, GRPC_PORT_PATTERN);
if (grpcPortMatch.Count > 0)
var gRPCPortMatch = Regex.Matches(data, GRPC_PORT_PATTERN);
if (gRPCPortMatch.Count > 0)
{
grpcPort = ushort.Parse(grpcPortMatch[0].Groups[1].ToString());
grpcPort = ushort.Parse(gRPCPortMatch[0].Groups[1].ToString());
}
return grpcPort;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.

namespace Masa.Contrib.Development.DaprStarter;

public interface IDaprEnvironmentProvider
{
ushort? GetHttpPort();

ushort? GetGrpcPort();

/// <summary>
/// Set the HttpPort environment variable
/// When httpPort is greater than 0, return true
/// </summary>
/// <param name="httpPort"></param>
/// <returns></returns>
bool TrySetHttpPort(ushort? httpPort);

/// <summary>
/// Set the grpcPort environment variable
/// When grpcPort is greater than 0, return true
/// </summary>
/// <param name="grpcPort"></param>
/// <returns></returns>
// ReSharper disable once InconsistentNaming
bool TrySetGrpcPort(ushort? grpcPort);

void SetHttpPort(ushort httpPort);

// ReSharper disable once InconsistentNaming
void SetGrpcPort(ushort grpcPort);

// ReSharper disable once InconsistentNaming
void CompleteDaprEnvironment(ushort? httpPort, ushort? grpcPort);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ internal class DaprCoreOptions
/// <summary>
/// The gRPC port for Dapr to listen on
/// </summary>
// ReSharper disable once InconsistentNaming
public ushort? DaprGrpcPort { get; private set; }

/// <summary>
Expand Down Expand Up @@ -114,27 +115,43 @@ internal class DaprCoreOptions
/// </summary>
public int? DaprMaxRequestSize { get; set; }

// ReSharper disable once InconsistentNaming
public DaprCoreOptions(
string appId,
ushort appPort,
Protocol? appProtocol,
bool? enableSsl,
ushort? daprGrpcPort,
ushort? daprGRPCPort,
ushort? daprHttpPort,
bool enableHeartBeat)
{
AppId = appId;
AppPort = appPort;
AppProtocol = appProtocol;
EnableSsl = enableSsl;
DaprGrpcPort = daprGrpcPort;
DaprGrpcPort = daprGRPCPort;
DaprHttpPort = daprHttpPort;
EnableHeartBeat = enableHeartBeat;
}

public void SetPort(ushort httpPort, ushort rpcPort)
public bool TrySetHttpPort(ushort? httpPort)
{
DaprHttpPort ??= httpPort;
DaprGrpcPort ??= rpcPort;
if (DaprHttpPort == null && httpPort is > 0)
{
DaprHttpPort = httpPort;
return true;
}
return false;
}

// ReSharper disable once InconsistentNaming
public bool TrySetGrpcPort(ushort? grpcPort)
{
if (DaprGrpcPort == null && grpcPort is > 0)
{
DaprGrpcPort = grpcPort;
return true;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ private static IServiceCollection AddDaprStarter(this IServiceCollection service
services.TryAddSingleton<IDaprProcess, DaprProcess>();
services.TryAddSingleton<IDaprProvider, DaprProvider>();
services.TryAddSingleton<IProcessProvider, ProcessProvider>();
services.TryAddSingleton<IDaprEnvironmentProvider, DaprEnvironmentProvider>();
return services;
}

Expand Down
Loading