使用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 之后,会带来以下影响: