zoukankan      html  css  js  c++  java
  • Asp.net Core 学习笔记 Azure Storage

    更新: 2021-07-22

    使用 Azure storage 以后, 还要解决一个 url 的问题. 文件自然是通过我们的 domain 来访问才合理丫. 

    这个是 azure 的 url : https://baccus.blob.core.windows.net/folder/file.txt 

    这个是我们希望的 url : https://www.baccus.com.my/folder/file.txt 

    所以我们还需要 custom domain, 而 custom domain 要配上 https 就需要 Azure DNS 

    DNS 是个好东西, 但是我项目太小所以作用不大, 这里就不说了. 

    具体怎么弄, 看这里

    https://docs.microsoft.com/en-us/azure/storage/blobs/storage-custom-domain-name?tabs=azure-portal

    做 web app 我目前都是把图片放在 VM disk 里, 这不是一个好的方案. 

    Azure 推荐的方式是用 Azure Storage 来存放和读取这些 static file.

    这里就来试一试

    refer : 

    https://www.cnblogs.com/sparkdev/p/6441421.html

    https://ithelp.ithome.com.tw/articles/10227271 (铁人系列视频讲解) 推荐

    https://www.cnblogs.com/AllenMaster/p/13589170.html (系列) 有 coding 

    https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet#get-the-connection-string (c# CRUD)

    1. 去 azure 创建 storage account

    需要注意的有几个 

    名字只可以小写或者号码....奇葩

    Performance: Standard or Premium, Premium 是 SSD 所以比较快.但一般上使用 Standard

    Account kind: StorageV2, Storage, BlobStorage (绝大部分情况下选择 v2 就可以了)

    Replication: Locally-redundant storage (LRS) 等等 一般上就是选 LRS 而已, 它们主要的区别就是备份存哪里, 比如在同一个区, 或者同一个 data center, 或者外国. 

    分布的地方越远就越保险咯. 也就越贵咯. 备份的数据如果要支持可读也是可以的, 有点像当 cdn 来用来. 

    Blob access tier : Cool or Hot 一般上就是选 Hot, 除非你 storage 的目的是放历史记入, 有一种是读取的时候要提前解冻的, 适合做历史记入. 

    Storage 的结构是 

    Account > Container > Blob

    Container 可以算是用来分类的吧, Blob 可以是 file or folder

    做好了 account 现在做 container

    主要是设置权限, 是否允许匿名访问. 一般上会选第 2 个, 意思就是只要你有 url 就可以访问了. 如果是遇到模式敏感资料的话, 那么就应该选第一个咯.

    如果是授权访问的话, 就需要用到 SAS 了, 这个和 one drive 里面那种授权是一样的, 可以设置 read, delete, edit, create token 几时 expiry 等等. 也可以通过 access policy 来做一个统一的权限来管理. 不然一个一个 blob set SAS 要换的时候就蛮累的了.

    然后就是创建 blob 了咯 

    blob type 分 3 种

    Block Blob 图片, 视频, 文件等等

    Page Blob 随机读写 hardisk 用的

    Append Blob 给 log 用的

    Access tier 就是 Hot, Cool, Archive (archive 就是那种要解冻才可以读的)

    最后是可以选 folder. 所以 container 并不是当 folder 用的. 

    通过 portal 来管理 ui 体验不是很好. 用 command 当然就更差, 所以建议是安装软件 Azure Storage Explorer 微软出的安心用. 

    登入的话可以选择用 connection string 这样就不需要依赖 azure account 比较安全, connection string 藏在 access key 里面 

    有 2 个, 一个是备用. 所以用第一个, 第一个被偷了的话, 可以暂时换成 第 2 个, 然后 reset 第一个. 再换回来. 这样就不会有 down time. 

    它就像 windows 做 folder file 那样的体验. 

    有一个东西叫 Azure Storage Emulator, 

    打开 windows start 然后 search Azure Storage Emulator 点击打开. 如果没有找到的话就去 visual studio 安装 

    好像是只有 windows pro 版本才可以用, 因为它需要 Hyper-V

    启动之后我们回到 Azure Storage Explorer 就可以操作了. 这样就不需要真的有 Azure account 了. 毕竟 Azure account 要钱丫. 

    这样就表示有了

    一些 c# 的基本操作

    安装 : 

    dotnet add package Azure.Storage.Blobs

    dotnet add package Microsoft.Extensions.Azure (如果没有要用依赖注入的方式的话,这个可以不需要装)

    startup.cs 搞注入, connection string 要放在 secret 哦

    services.AddAzureClients(builder =>
    {
      builder.AddBlobServiceClient(Configuration["AzureStorageConnectionString"]);
    });

    注入 service 

    private readonly BlobServiceClient _blobServiceClient;
    
    public IndexModel(
        BlobServiceClient blobServiceClient
    )
    {
        _blobServiceClient = blobServiceClient;
    }

    基本的 CRUD

    // create container
    await _blobServiceClient.CreateBlobContainerAsync("container5", PublicAccessType.Blob);
    
    //get container
    var containerClient = _blobServiceClient.GetBlobContainerClient("container5");
    
    using var memoryStream = new MemoryStream();
    var buffer = Encoding.UTF8.GetBytes("hello world");
    await memoryStream.WriteAsync(buffer, 0, buffer.Length);
    memoryStream.Seek(0, SeekOrigin.Begin);
    
    // create blob
    var blobClient = containerClient.GetBlobClient("./folder1/upload.txt");
    await blobClient.UploadAsync(memoryStream, overwrite: true); // 一定要 upload 先, 有了 blob 才可以 set access tier 哦
    await blobClient.SetAccessTierAsync(AccessTier.Hot);
    
    memoryStream.SetLength(0); // clear stream
    // download blob
    await blobClient.DownloadToAsync(memoryStream);
    memoryStream.Seek(0, SeekOrigin.Begin);
    var value = Encoding.UTF8.GetString(memoryStream.ToArray());
    
    // delete blob
    await blobClient.DeleteAsync();
    // delete container
    await containerClient.DeleteAsync();
  • 相关阅读:
    整合Druid数据源
    SpringBoot与数据访问
    IDEA spirng boot @Autowired注解 mapper出现红色下划线解决方法
    IntelliJ Idea 常用快捷键列表
    docker 安装mysql示例
    设计模式都没用过,好意思出去面试?
    为什么 Java 线程没有 Running 状态?
    厉害了,淘宝千万并发,14 次架构演进…
    Redis 内存满了怎么办……
    Java 线程池 8 大拒绝策略,面试必问!
  • 原文地址:https://www.cnblogs.com/keatkeat/p/14397874.html
Copyright © 2011-2022 走看看