- 博客(125)
- 收藏
- 关注
原创 API 工程化分享
本文是学习B站毛剑老师的《API 工程化分享》的学习笔记,分享了 gRPC 中的 Proto 管理方式,Proto 分仓源码方式,Proto 独立同步方式,Proto git submodules 方式,Proto 项目布局,Proto Errors,服务端和客户端的 Proto Errors,Proto 文档等等
2022-05-15 15:34:23 409
原创 【译】.NET 6 网络改进
原文 | Máňa Píchová翻译 | 郑子铭对于 .NET 的每个新版本,我们都希望发布一篇博客文章,重点介绍网络的一些变化和改进。在这篇文章中,我很高兴谈论 .NET 6 中的变化。这篇文章的上一个版本是.NET 5 网络改进。HTTPHTTP/2 窗口缩放随着 HTTP/2 和 gRPC 的兴起,我们的客户发现 SocketsHttpHandler 的 HTTP/2 下载速度在连接到具有显着网络延迟的地理位置较远的服务器时无法与其他实现相提并论。在具有高带宽延迟产品的链路.
2022-03-16 21:57:09 1017
原创 【译】ASP.NET Core 6 中的性能改进
原文 | Brennan Conroy翻译 | 郑子铭受到 Stephen Toub 关于.NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做的性能改进。基准设置我们将在整个示例中使用BenchmarkDotNet。在https://github.com/BrennanConroy/BlogPost60Bench上提供了一个 repo,其中包括本文中使用的大部分基准。这篇文章中的大多数基准测试结果都是使用以下命令行生成的:...
2022-03-10 23:14:40 1261
原创 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
原文 | Daniel Roth翻译 | 郑子铭.NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一波创新。在 .NET 7 中,我们计划对 ASP.NET Core 进行广泛投资。以下是我们计划重点关注的一些领域:性能:.NET 6 包含对 ASP.NET Core 的许多性能改进,我们将努力使 ASP.NET Core 在 .NET 7 中更快、更高效。 HTTP/3:HTTP/3 支持作为
2022-03-08 21:11:02 1136
原创 【译】C# 11 特性的早期预览
原文 | Kathleen翻译 | 郑子铭Visual Studio 17.1(Visual Studio 2022 Update 1)和 .NET SDK 6.0.200 包含 C# 11 的预览功能!您可以更新Visual Studio或下载最新的 .NET SDK来获得这些功能。查看帖子Visual Studio 2022 17.1 现已推出!了解 Visual Studio 中的新增功能和发布 .NET 7 Preview 1的帖子以了解更多 .NET 7 预览功能。设计 ...
2022-03-06 12:05:05 355
原创 【译】在 ASP.NET 和 ASP.NET Core 之间共享代码
原文 | Ken翻译 | 郑子铭随着 .NET 6 的发布,使用 ASP.NET Core 可以获得更多好处。但是将现有代码迁移到 ASP.NET Core 通常听起来像是一项巨大的投资。今天我们将分享如何加速向 ASP.NET Core 的迁移。您今天可以进行一些细微的更改,以便明天更轻松地迁移到 ASP.NET Core。在我们开始之前,让我们先谈谈一个真实的场景。让我们谈谈如何修改一个有 10 年历史的应用程序中的代码,以便它可以与 ASP.NET Core 共享。在接下来的部分中,我们将
2022-03-04 21:12:58 229
原创 .NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记
目录模块拆分 EntityAccess模块拆分EntityAccess实体权限 属性权限实体权限创建 studenthttps://localhost:7018/Student/dotnetnb2获取 studenthttps://localhost:7018/Student对 student 的 permission 做一个保护,创建一个 entitiy 的 permission,create 为 true,delete 和 update 为 f
2022-02-23 23:41:51 329
原创 .NET 云原生架构师训练营(权限系统 系统演示 ActionAccess)--学习笔记
目录模块拆分 环境配置 默认用户 ActionAccess模块拆分环境配置mysql migrationmysqldocker pull mysqldocker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root@dotnetnb666 -d mysqlname:容器名,此处命名为mysql e:配置信息,此处配置mysql的root用户的登陆密码 p:端口映射,此处映射 主机3306端口 到 容器
2022-02-22 21:27:33 336
原创 .NET 云原生架构师训练营(权限系统 代码重构)--学习笔记
目录模块拆分 代码重构模块拆分代码重构AuthenticationController PermissionController IAuthorizationMiddlewareResultHandler ISaveChangesInterceptorAuthenticationController新增 AuthenticationController 用于登录和注册;登录会颁发 jwt token,包含用户的 claims 和 role 的 claims登录[Ht
2022-02-21 22:14:46 433
原创 .NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
目录开发任务 代码实现开发任务DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store DotNetNB.WebApplication:创建 ResourceController 和 PermissionController 进行验证代码实现ResourceController PermissionControllerResourceController创建 ResourceController,
2022-02-20 18:27:13 427
原创 .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记
目录开发任务 代码实现开发任务DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store DotNetNB.Security.Identity:将权限赋予角色或用户;在用户登录时将 Permissions 写入用户身份 claims代码实现添加一个 Identity 的扩展,将 role 和 Permission 结合到一起定义 IRolePermissionManager 接口,提供一个 AddRol
2022-02-18 23:58:12 356
原创 .NET 云原生架构师训练营(权限系统 代码实现 Store.EntityFramework)--学习笔记
目录开发任务 代码实现开发任务DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store DotNetNB.Security.Store.EntityFramework:基于 mysql 创建 PermissionStore 和 ResourceStore代码实现我们需要在 ResourceProviderHostedService 中读取所有的 Resource,将 Resource 转换为 Permis
2022-02-17 22:56:48 322
原创 .NET 云原生架构师训练营(权限系统 代码实现 EntityAccess)--学习笔记
目录开发任务 代码实现开发任务DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store DotNetNB.Security.EntityAccess:扫描 entities;添加 ef savechanges interceptor代码实现我们现在已经通过 ActionResourceProvider 完成了 action 的扫描,生成了 ResourceModel,需要持久化到 IResourceSto
2022-02-16 22:22:42 452
原创 .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记
目录开发任务 代码实现开发任务DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store DotNetNB.Security.ActionAccess:扫描 action;添加 action authorize filter;添加集成方式代码实现对于一个 web 项目,Filter 是在构建构建 builder 的时候添加的builder.Services.AddControllers(options
2022-02-15 22:55:06 364
原创 .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记
目录目标 模块拆分 OPM 开发任务目标基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能模块拆分模块划分已经完成了边界的划分,边界内外职责清晰OPM根据模块拆分画出 OPM(Object Process Methodology)ActionAccess 模块中的 ActionResourceProvider 会为 RegisterActions 提供支持Core 模块会对资源进行扫描,扫描之后会得到大量 ResourceModel,将它们持久化到 I.
2022-02-10 23:20:14 407
原创 .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录项目核心内容 实战目标 RGCA 四步架构法项目核心内容无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增、删除、字段级读写控制管理 与 Identity 进行融合集成实战目标RGCA 四步架构法的应用 加深对 OPM 和 OPD 的运用 为毕业设计打下基础RGCA 四步架构法Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概
2022-01-19 23:46:11 2307
原创 .NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记
目录目标 源码目标理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别)源码https://github.com/dotnet/aspnetcore/在目录 aspnetcore\src\Servers\Kestrel\Core\src\Internal 下有一个 KestrelServerImplinternal class KestrelServerImpl : IServer在 host 启动
2022-01-17 23:05:01 479
原创 .NET 云原生架构师训练营(模板方法 && 建造者)--学习笔记
目录模板方法 源码 建造者模板方法定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤源码GitHub - dotnet/aspnetcore: ASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.在目录 aspnetcore\
2022-01-07 22:52:04 581
原创 .NET 云原生架构师训练营(组合模式)--学习笔记
目录引入 组合模式 源码引入在上一篇执行 _connectionDelegate 之后,HttpConnectionMiddleware 处理请求return connection.ProcessRequestsAsync(_application);在 HttpConnection 中调用 IRequestProcessor 的 ProcessRequestsAsync 方法await requestProcessor.ProcessRequestsAsync(httpAp
2022-01-06 23:16:18 591
原创 .NET 云原生架构师训练营(责任链模式)--学习笔记
目录责任链模式 源码责任链模式职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了何时使用:在处理消息的时候以过滤很多道使用场景:有多个对象可以处理同一个请求,具体到哪个对象处理该请求由运行时刻自动确定 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求 可动态指定一组对象处理请求源码GitHub - dotnet/aspnetcore: ASP.NET Core
2022-01-05 20:03:28 446
原创 .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记
目录设计原则 设计模式设计原则DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You Aren't Gonna Need It 你不会需要它的) CCP 共同闭包 CRP 共同复用 高内聚、低耦合 惯例优先配置 SCO 关注点分离 ADP 无依赖环 SOLID 面向对象设计原则SOLIDS - Single-responsiblity Principle 单一职责
2022-01-04 21:42:42 548 1
原创 .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记
演化与完善整体概念ASP .NET Core 整体概念推演 整体概念推演到具体的形式ASP .NET Core 整体概念推演ASP .NET Core 其实就是通过 web framework 处理 HTTP 请求并提供 HTTP 响应web framework 由程序员使用,它包括 ASP .NET Core,Express,spring 等等组成这样我们就完成了对 ASP .NET Core 的底层建模,接下来对 HTTP 请求和 HTTP 响应进行细化对于原始 HTTP
2021-12-30 23:40:14 453
原创 .NET 云原生架构师训练营(RGCA 四步架构法)--学习笔记
RGCARequirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构目录从利益相关者获取需求 将需求转化为目标 将目标扩展为完整概念从利益相关者获取需求有哪些类型的利益相关者 利益相关者需求 需求分类与排序 需求的特征有哪些类型的利益相关者利益相关方 关注系统的事物和对象 - 投资方 有助于解决问题的利益相关者 投资人微软、微软股东等
2021-12-29 22:59:09 375
原创 Go语言核心36讲(新年彩蛋)--学习笔记
新年彩蛋 | 完整版思考题答案基础概念篇Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?答:你设置的环境变量GOPATH的值决定了这个顺序。如果你在GOPATH中设置了多个工作区,那么这种查找会以从左到右的顺序在这些工作区中进行。你可以通过试验来确定这个问题的答案。例如:先在一个源码文件中导入一个在你的机器上并不存在的代码包,然后编译这个代码文件。最后,将输出的编译错误信息与GOPATH的值进行对比。如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?答:不会产生冲突
2021-12-27 22:20:46 259
原创 .NET 云原生架构师训练营(对象过程建模)--学习笔记
目录UML OPM OPM优化UML1997年发布UML标准主要域 视图 图 主要概念 结构 静态视图 类图 类、关联、泛化、依赖关系、实现、接口 用例视图 用例图 用例、参与者、关联、扩展、包括、用例泛化 实现视图 构件图 构件、接口、依赖关系、实现 部署视图 部署图 节点、构件、依赖关系、位置 动态 状态机视图 状态机图 状态、事件、转换、动作 活动视图 活动图
2021-12-23 23:26:57 630
原创 Go语言核心36讲(Go语言实战与应用二十七)--学习笔记
49 | 程序性能分析基础(下)在上一篇文章中,我们围绕着“怎样让程序对 CPU 概要信息进行采样”这一问题进行了探讨,今天,我们再来一起看看它的拓展问题。知识扩展问题 1:怎样设定内存概要信息的采样频率?针对内存概要信息的采样会按照一定比例收集 Go 程序在运行期间的堆内存使用情况。设定内存概要信息采样频率的方法很简单,只要为runtime.MemProfileRate变量赋值即可。这个变量的含义是,平均每分配多少个字节,就对堆内存的使用情况进行一次采样。如果把该变量的值设为0,那么,
2021-12-22 23:31:44 661
原创 .NET 云原生架构师训练营(系统架构)--学习笔记
目录对外展现的功能 内部功能 功能交互与价值通路 系统架构目标认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构受益原则好的架构必须使人受益,要想把架构做好,就要专注于功能的涌现,使得系统把它的主要功能通过跨越系统边界的接口对外展示出来对外展现的功能ASP .NET Core 的使用者是程序员,最终的受益是老板上一讲对 ASP .NET Core 的描述是文字性描述,是一种非结构性描述,不是很准确,因为每个人对文字的理解都不一样ASP .
2021-12-21 23:52:19 1009 1
原创 .NET 云原生架构师训练营(建立系统观)--学习笔记
目录目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业目标通过整体定义去认识系统 通过分解去简化对系统的认识ASP .NET CoreASP .NET Core 是什么 ASP .NET Core 是干什么的 Host、Server、HostApplication 与 ASP .NET Core 是什么关系 ASP .NET Core 和 .NET Core 是什么关系ASP .NET Core 是什么WEB FRAMEWO
2021-12-20 22:27:52 299
原创 Go语言核心36讲(Go语言实战与应用二十六)--学习笔记
48 | 程序性能分析基础(上)作为拾遗的部分,今天我们来讲讲与 Go 程序性能分析有关的基础知识。Go 语言为程序开发者们提供了丰富的性能分析 API,和非常好用的标准工具。这些 API 主要存在于:1、runtime/pprof;2、net/http/pprof;3、runtime/trace;这三个代码包中。另外,runtime代码包中还包含了一些更底层的 API。它们可以被用来收集或输出 Go 程序运行过程中的一些关键指标,并帮助我们生成相应的概要文件以供后续分析时使用。
2021-12-19 22:08:07 345
原创 Go语言核心36讲(Go语言实战与应用二十五)--学习笔记
47 | 基于HTTP协议的网络服务我们在上一篇文章中简单地讨论了网络编程和 socket,并由此提及了 Go 语言标准库中的syscall代码包和net代码包。我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义。前者间接地调用了后者,所以正确理解后者,会对用好前者有很大裨益。之后,我们把视线转移到了net.DialTimeout函数以及它对操作超时的处理上,这又涉及了net.Dialer类型。实际上,这个类型正是net包中这两个“拨号”函数的底层实现。我们像上一
2021-12-10 23:35:55 707
原创 Go语言核心36讲(Go语言实战与应用二十四)--学习笔记
46 | 访问网络服务前导内容:socket 与 IPC人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情)。说到网络编程,我们就不得不提及 socket。socket,常被翻译为套接字,它应该算是网络编程世界中最为核心的知识之一了。关于 socket,我们可以讨论的东西太多了,因此,我在这里只围绕着 Go 语言向你介绍一些关于它的基础知识。所谓 socket,是一种 IPC 方法。IPC 是 Inter-Process Communication 的缩写
2021-12-09 23:03:52 807
原创 Go语言核心36讲(Go语言实战与应用二十三)--学习笔记
45 | 使用os包中的API (下)我们在上一篇文章中。从“os.File类型都实现了哪些io包中的接口”这一问题出发,介绍了一系列的相关内容。今天我们继续围绕这一知识点进行扩展。知识扩展问题 1:可应用于File值的操作模式都有哪些?针对File值的操作模式主要有只读模式、只写模式和读写模式。这些模式分别由常量os.O_RDONLY、os.O_WRONLY和os.O_RDWR代表。在我们新建或打开一个文件的时候,必须把这三个模式中的一个设定为此文件的操作模式。除此之外,我们还可以
2021-12-09 00:18:01 362
原创 Go语言核心36讲(Go语言实战与应用二十二)--学习笔记
44 | 使用os包中的API (上)我们今天要讲的是os代码包中的 API。这个代码包可以让我们拥有操控计算机操作系统的能力。前导内容:os 包中的 API这个代码包提供的都是平台不相关的 API。那么说,什么叫平台不相关的 API 呢?它的意思是:这些 API 基于(或者说抽象自)操作系统,为我们使用操作系统的功能提供高层次的支持,但是,它们并不依赖于具体的操作系统。不论是 Linux、macOS、Windows,还是 FreeBSD、OpenBSD、Plan9,os代码包都可以为之
2021-12-06 23:10:21 952
原创 Go语言核心36讲(Go语言实战与应用二十一)--学习笔记
43 | bufio包中的数据类型(下)在上一篇文章中,我提到了bufio包中的数据类型主要有Reader、Scanner、Writer和ReadWriter。并着重讲到了bufio.Reader类型与bufio.Writer类型,今天,我们继续专注bufio.Reader的内容来进行学习。知识扩展问题 :bufio.Reader类型读取方法有哪些不同?bufio.Reader类型拥有很多用于读取数据的指针方法,这里面有 4 个方法可以作为不同读取流程的代表,它们是:Peek、Read、Re
2021-12-05 22:08:27 522
原创 Go语言核心36讲(Go语言实战与应用二十)--学习笔记
42 | bufio包中的数据类型 (上)今天,我们来讲另一个与 I/O 操作强相关的代码包bufio。bufio是“buffered I/O”的缩写。顾名思义,这个代码包中的程序实体实现的 I/O 操作都内置了缓冲区。bufio包中的数据类型主要有:1、Reader;2、Scanner;3、Writer和ReadWriter。与io包中的数据类型类似,这些类型的值也都需要在初始化的时候,包装一个或多个简单 I/O 接口类型的值。(这里的简单 I/O 接口类型指的就是io包中的那些简
2021-12-02 22:28:58 396
原创 Go语言核心36讲(Go语言实战与应用十九)--学习笔记
41 | io包中的接口和工具 (下)上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型。当然,io代码包中的核心接口不止io.Reader一个。我们基于它引出的一条主线,只是io包类型体系中的一部分。我们很有必要再从另一个角度去探索一下,以求对io包有更加全面的了解。下面的一个问题就与此有关。知识扩展问题:io包中的接口都有哪些?它们之间都有着怎样的关系?我们可以把没有嵌入其他接口并且只定义了一个方法的接口叫做简单接口。在io包中,这样的接口一共有 11 个。在它
2021-12-01 19:39:39 419
原创 Go语言核心36讲(Go语言实战与应用十八)--学习笔记
40 | io包中的接口和工具 (上)我们在前几篇文章中,主要讨论了strings.Builder、strings.Reader和bytes.Buffer这三个数据类型。知识回顾还记得吗?当时我还问过你“它们都实现了哪些接口”。在我们继续讲解io包中的接口和工具之前,我先来解答一下这个问题。strings.Builder类型主要用于构建字符串,它的指针类型实现的接口有io.Writer、io.ByteWriter和fmt.Stringer。另外,它其实还实现了一个io包的包级私有接口io.s
2021-11-30 21:13:54 306
原创 Go语言核心36讲(Go语言实战与应用十七)--学习笔记
39 | bytes包与字节串操作(下)在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展。知识扩展问题 1:bytes.Buffer的扩容策略是怎样的?Buffer值既可以被手动扩容,也可以进行自动扩容。并且,这两种扩容方式的策略是基本一致的。所以,除非我们完全确定后续内容所需的字节数,否则让Buffer值自动去扩容就好了。在扩容的时候,Buffer值中相应的代码(以下简称扩容代码)会先判断内容容器的剩余容量,
2021-11-29 22:31:00 542
原创 Go语言核心36讲(Go语言实战与应用十六)--学习笔记
38 | bytes包与字节串操作(上)前导内容: bytes.Buffer基础知识strings包和bytes包可以说是一对孪生兄弟,它们在 API 方面非常的相似。单从它们提供的函数的数量和功能上讲,差别可以说是微乎其微。只不过,strings包主要面向的是 Unicode 字符和经过 UTF-8 编码的字符串,而bytes包面对的则主要是字节和字节切片。我今天会主要讲bytes包中最有特色的类型Buffer。顾名思义,bytes.Buffer类型的用途主要是作为字节序列的缓冲区。与
2021-11-28 22:43:21 366
原创 Go语言核心36讲(Go语言实战与应用十五)--学习笔记
37 | strings包与字符串操作Go 语言不但拥有可以独立代表 Unicode 字符的类型rune,而且还有可以对字符串值进行 Unicode 字符拆分的for语句。除此之外,标准库中的unicode包及其子包还提供了很多的函数和数据类型,可以帮助我们解析各种内容中的 Unicode 字符。这些程序实体都很好用,也都很简单明了,而且有效地隐藏了 Unicode 编码规范中的一些复杂的细节。我就不在这里对它们进行专门的讲解了。我们今天主要来说一说标准库中的strings代码包。这个代码包
2021-11-27 21:45:37 228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人