使用Nebula开发独立应用程序

虽然Nebula开发框架的设计目标是支持 SaaS + 微服务架构,但它也可以开发一些独立的应用程序,例如:

  • 独立的小网站
  • 独立的WebApi服务

这些独立的应用程序通常有以下特点:

  • 只需要 一个应用程序进程 就能满足业务需求,就像小工具一样,运行起来就可以做活了!
  • 不依赖配置服务之类的基础服务
  • 也不需要多租户的支持

本文将介绍这种应用程序的开发过程。




开发过程

在这个过程,主要是设置一个启动参数(EnableConfigService = false),例如:

public class Program
{
    public static void Main(string[] args)
    {
        AppStartOption startOption = new AppStartOption {

            // 独立运行,不使用配置服务
            EnableConfigService = false,
        };
        
        AppStartup.RunAsWebsite("MyTest.WebSiteApp", args, startOption);
    }        
}

此时,这个项目就可以独立运行了!




参数配置

应用程序的配置参数有以下类别:

  • 本地配置参数
    • 环境变量(系统级/用户级/进程级)
    • AppConfig(ClownFish.App.config)
  • 远程配置参数
    • 全局配置参数
      • 连接类参数:RabbbitMQ/Redis/es/oss/...
      • 帐号类参数:邮箱帐号,IM应用帐号
      • 密码密钥类:登录密码,JWT密钥
      • URL地址:内部服务,外部服务
    • 数据库连接参数
    • 独立配置文件
    • 远程配置文件(xxx.App.config, xxx.Log.config)

经过前面的步骤,程序是可以独立运行了,但是由于不依赖配置服务,那么"远程配置参数"在哪里配置和读取呢?

答案是:

  • 全局配置参数:从 ClownFish.App.config 中获取
  • 数据库连接参数:从 ClownFish.App.config 中获取
  • 独立配置文件:放在 {app}/_config/ 目录下
  • 远程配置文件:此场景下不适用!

例如:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>       
        <add key="MySqlClientProviderSupport" value="2" />
        
        <!-- 必要的3个配置参数 -->
        <add key="CLUSTER_ENVIRONMENT" value="BPM-OP"/>
        <add key="Nebula_Environment_Key" value="4fa5e8a12eb04a0b9d8f4330874cfc5a"/>
        <add key="Nebula_Authentication_SecretKey" value="892091a889304639bd42c7ebf61cbf17"/>

        <!-- 一些普通的配置参数 -->
        <add key="key1" value="abcd"/>
        <add key="key2" value="123"/>

        <!-- 连接类参数 -->
        <add key="my_Rabbit" value="server=RabbitHost;username=fishli;password=1qaz7410;vhost=nbtest" />
        <add key="Redis_Connection" value="RedisHost,password=1qazxsw2"/>

        <!-- 非关系型数据库连接(ADO.NET不支持) -->
        <add key="my_Elasticsearch" value="Server=ElasticHost:9200;"/>

        <!-- 帐号类参数 -->
        <add key="mail_config" value="Host=smtp.xxx.com;Port=587;UserName=xxxxx@abc.com;Password=xxx;IsSSL=1"/>
        <add key="WxWork_AppAuth_Config" value="ImType=WxWork;AgentId=999;AppId=xxxxx;AppSecret=xxxx"/>
        <add key="DingDing_AppAuth_Config" value="ImType=DingDing;AgentId=999;AppId=xxxxx;AppSecret=xxxx"/>
        <add key="FeiShu_AppAuth_Config" value="ImType=FeiShu;AgentId=0;AppId=xxxxx;AppSecret=xxxx"/>

        <!-- URL地址 -->
        <add key="UserService_Url" value="http://LinuxTest:8220"/>
     </appSettings>


    <!-- 数据库连接配置 -->
    <connectionStrings>
        <add name="db1" providerName="System.Data.SqlClient"
			 connectionString="server=MsSqlHost;database=MyNorthwind;uid=user1;pwd=xxxx"/>

        <add name="db2" providerName="MySql.Data.MySqlClient"
			 connectionString="server=MySqlHost;database=MyNorthwind;uid=user1;pwd=xxxx"/>

        <add name="db3" providerName="Npgsql"
            connectionString="Host=PgSqlHost;database=mynorthwind;Username=postgres;Password=xxxx"/>
    </connectionStrings>

    <!-- 或者把数据库连接配置在这里 -->
    <dbConfigs>
        <add name="s1" dbType="SQLSERVER" server="MsSqlHost" database="MyNorthwind" uid="user1" pwd="xxxxxx" args="" />
        <add name="s2" dbType="SQLSERVER" server="MsSqlHost" database="MyNorthwind" uid="user1" pwd="xxxxxx" args="" />
        <add name="m1" dbType="MySQL" server="MySqlHost" database="MyNorthwind" uid="user1" pwd="xxxxxx" args="" />
        <add name="m2" dbType="MySQL" server="MySqlHost" database="MyNorthwind" uid="user1" pwd="xxxxxx" args="Allow Zero Datetime=True;Convert Zero Datetime=True;" />
        <add name="pg1" dbType="PostgreSQL" server="PgSqlHost" database="mynorthwind" uid="postgres" pwd="xxxxxx" args="" />
        <add name="dm1" dbType="DaMeng" server="DamengHost" port="5237" database="MyNorthwind" uid="SYSDBA" pwd="xxxxxx" args="" />
    </dbConfigs>
</configuration>

读取参数的示例代码:

string value1 = LocalSettings.GetSetting("key1");

using RabbitClient rabbit = new RabbitClient("my_Rabbit", "default_conn");

IDatabase db = Redis.GetDatabase(2);  // 使用的默认参数名称:Redis.Connection

static readonly NbEsClient esclient = new NbEsClient("my_Elasticsearch");

MailClient client = new MailClient("mail_config");

ImAppMsgClient client = new ImAppMsgClient("WxWork_AppAuth_Config");
ImAppMsgClient client = new ImAppMsgClient("DingDing_AppAuth_Config");
ImAppMsgClient client = new ImAppMsgClient("FeiShu_AppAuth_Config");


using DbContext db1 = DbContext.Create("db1");
using DbContext db2 = DbContext.Create("db2");
using DbContext db3 = DbContext.Create("db3");

using DbContext s1 = DbContext.Create("s1");
using DbContext m1 = DbContext.Create("m1");




不启用配置服务的影响

当设置 EnableConfigService = false 之后,会带来以下影响: