有時會思考一個問題,因為系統的複雜度上升,往往變更後更版上線也跟著複雜起來。那如果是微服務呢? 中斷了系統使用外,也要更新好幾個POD。
有沒有一條路是可以擴充需求或模組,但不重啟HOST? 如果微服務中不需重新 dock build image,直接替換或擴充模組?
可以先由讀取 DLL 到 .Net Core 並 IOC 到專案中來試試(搭配 Autofac)。
首先準備好共同介面專案,其介面為:
namespace CommonInterface
{
public interface ITostring
{
string toString();
}
}
接著準備好外部要替換的專案(MyDLL4),其中的類別:
namespace MyDLL4
{
public class DemoFinal : CommonInterface.ITostring
{
public string toString()
{
return "this is MyDLL4-Final toString Method!";
}
}
}
於 .NET Core 專案,註冊方式使用 Autofac.Module ,可參考"Autofac 如何替代 Dot Net Core 的原生DI機制"。 程式碼如下:
var json = LoadJson();
dynamic jsonObj = JsonConvert.DeserializeObject(json);
Type newType = ReflectTool.GetTypeByLoadDLL(jsonObj.DLLPath.ToString() , jsonObj.DLLModule.ToString() );
builder.RegisterType(newType).As<CommonInterface.ITostring>();
接著讀取 json 設定檔案,設定檔案內容為:
{
"DLLPath": "D:\\MyDLL4\\MyDLL4\\bin\\Debug\\MyDLL4.dll",
"DLLModule": "MyDLL4.DemoFinal"
}
以 "DLLPath" 指定好路徑, 以 "DLLModule" 指定模組名稱。
var json = LoadJson(); 則是將此當案內容讀入,並指定到 變數 jsonObj。 讀取到指定路徑的DLL後,將模組的 Type 資訊擷取出來,
再利用 Autofac 的 ContainerBuilder.RegisterType 來註冊此 Type 。
執行結果如下:
可抽換類別內容不重啟,另外思考一下,能否擴充 API method 或 Controller Method 而不重啟 host? 研究以下範例:
首先準備好共同 BaseController :
namespace CommonBaseController
{
public abstract class BaseController : Controller
{
abstract public JsonResult GetJson();
}
}
接著準備好要替換的外部 Controller :
namespace ExtendControllerDLL
{
public partial class ExtendController : CommonBaseController.BaseController
{
public override JsonResult GetJson()
{
return Json(new { id = "999", name = "czxdas" });
}
}
}
於 .NET Core 專案,註冊方式使用 Autofac.Module :
Type myTypeController =
ReflectTool.GetTypeByLoadDLL(
@"D:\ExtendControllerDLL\ExtendControllerDLL\bin\Debug\ExtendControllerDLL.dll",
"ExtendControllerDLL.ExtendController"
);
builder.RegisterType(myTypeController).As<CommonBaseController.BaseController>();
執行結果如下:
似乎可以達成不重啟而替換模組,供未來一種替換方式參考。