HotReload的试用
.net v6.0.0-preview.3的HotReload我是极喜欢的,因为之前有这样的需求——状态不丢,上下文不丢。
为了验证,安装完.net 6 preview 3后,新建一个webapi项目,写了如下简单代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace HotRealoadDemo.Controllers
{
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
private readonly ILogger<HomeController> _logger;
private static string _dateTimeStr;
public HomeController(ILogger<HomeController> logger)
{
if (HomeController._dateTimeStr== null)
{
_dateTimeStr=DateTime.Now.ToString();
}
_logger = logger;
}
[HttpGet("/status")]
public string GetStastus()
{
_logger.LogInformation("获取时间列表");
return "时间是:"+_dateTimeStr;
}
[HttpGet("/sleep")]
public string Sleep(int i)
{
_logger.LogInformation("延时");
if (i == 1)
{
System.Threading.Thread.Sleep(10000);
}
return "延时结果";
}
}
}
在项目目录,用dotnet watch运行项目。
状态不丢:
这里的状态我是全局的,放了一个静态的字段_dateTimeStr,当第一次调用/state时,该字段初赋值,之后每次调用都不变,用swagger可以验证。这时,我们修改HomeController的29行代码,把 “时间是”变成“输出时间是”,保存,再次调用swagger的/state,会发现,原来的时间没有变,但输出文本已变成“输出时间是”了,这说明代码起作用了,但_dateTimeStr这个内部状态值没有丢,进程好像没有重启一样。
上下文不丢:
这里用/sleep进行试验,当i=1里,要sleep10s,我会先请求一个/sleep?i=1,这里浏览器在等行,这里把HoemController的40行代码改成“延时结果GSW”,这时可以在swagger上调用/sleep,i传非1值 ,结果会是改变后的“延时结果GSW”,如果上一次的浏览器等待后返回了,你会看到是“延时结果”,并没有GSW,这是因为在这个请求调起时,还没有加上GSW,这个是可以理解的。其实这个功能我在k8s上试过,虽然pod可以优雅停止,但它是固定时间后停止,即使请求没有完成,也会停止的,相对来说没有HotReload更准确。
验证完成,还是相对满意的,因为HotReload是最近才加入的功能,还很不完善,比如这个只能在项目源码文件夹里用dotnet watch启动才行,publish后是不可以的,相信不远的将来,.net团队会更加完善这个功能,给出一个让大家满意的结果。
还有另一方面,不要希望这个功能能处理所有功能变化的HotReload,比如你把状态变量名改了,原来的状态肯定是不会存在的,所以良好的设计,加上HotRealod的功能,才能让我们的对客户提供的api服务无微不至,无时无刻。
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524