基于 WebSocket 和 Redis 实现 Bilibili 弹幕效果 本文作者 Payne 介绍了使用 .NET Core 和 Vue 构建基于 WebSocket 的聊天室的进阶项目——一个弹幕系统。由于项目需要实时数据推送以完成图表展示,作者选择了 WebSocket 和 Redis 技术。文章首先展示了服务端消息推送的实现,通过中间件循环从消息队列中取消息并群发至客户端。接着,作者讨论了使用 Redis 作为消息队列的原因,解释了不使用 RabbitMQ 和发布-订阅模式的理由,并展示了简单消息队列的实现。在前端实现部分,作者使用了 Canvas API 来绘制弹幕,并提供了前后端分离设计和静态文件中间件使用的示例。文章最后总结了通过这个项目引出的技术话题,如部署和跨域等。
使用 .NET Core 和 Vue 搭建 WebSocket 聊天室 本文介绍了 WebSocket 的基本概念和应用。WebSocket 是建立在 HTTP 协议基础上的双向通信协议,弥补了 HTTP 协议请求-响应模型的不足,使客户端和服务器可以实现双向通信。文章以构建WebSocket 聊天室为例,展示了如何在 ASP.NET Core 中实现服务端 WebSocket 和使用原生 WebSocket API 和 Vue 实现客户端功能。另外,文章还介绍了 ASP.NET Core 中间件的概念和作用。通过实例展示了 WebSocket 握手请求和响应的过程,以及服务端如何响应 WebSocket 请求。文章深入浅出地解释了 WebSocket 的原理和应用,为读者提供了全面的了解和实践指导。
声明式 RESTful 客户端 WebApiClient 在项目中的应用 项目采用敏捷开发后出现“联调”任务,由于前后端分离导致团队分成前后端组,前端负责展示数据,后端提供服务接口,但存在沟通困难。讨论三方面原因:设计不当、进度不一、沟通不畅。介绍前后端分离思想,客户端产品采用Native+Web技术架构,通过JSBridge实现Native和Web通信。详述WebApiClient库在.NET平台下类似Retrofit的作用,通过声明式方式定义接口调用。讨论上传下载接口、过滤器与OAuth2,以及可配置与动态化。强调前后端职责分离重要性,提出通过代理类调用后端API的想法。最后介绍WebApiClient的应用,提倡契约式接口声明,以更快速应对后端变化。
一个由服务器时区引发的 Bug 本文讨论了时区对工作和数据库操作的影响,以及不同数据库中日期/时间类型的存储方式。介绍了UTC时间、GMT时间、本地时间和Unix时间的区别,以及Python和C#中处理时区问题的方法。文章深入探讨了日期格式化和时区处理的复杂性,提出了统一使用UTC或GMT时间,并在必要时进行时区转换的建议。文章以案例入手,逐步展开详细解释,涵盖了多个相关概念和技术细节。
罗马数字与阿拉伯数字的相互转换 文章首先通过一个富有想象力的交易场景,引发出对罗马数字与阿拉伯数字转换的算法问题的讨论。接着,回顾了罗马数字的起源和基本规则,指出罗马数字主要用于计数而非计算,并介绍了罗马数字的四个组合规则。文章详细阐述了如何实现阿拉伯数字到罗马数字的转换,以及如何将罗马数字转换回阿拉伯数字,并提供了相应的代码实现。讨论中提到了罗马数字在表示大数时的局限性,即 “4000” 问题,以及罗马人通过加横线来增值 1000 倍的解决方法。最后,文章探讨了为何历史最终选择了阿拉伯数字而非罗马数字,指出阿拉伯数字的统一和简洁性使其更适合计算和扩展,从而取代了罗马数字成为主流的数字系统。
邂逅 AOP:说说 JavaScript 中的修饰器 本文介绍了 JavaScript 中的修饰器(Decorator),它是 ES7 的一个提案,用于在编译时对类及其方法进行修改,以及实现不同类间共享方法。修饰器与 Python 中的装饰器类似,通过 @ 符号使用。文章通过实例讲解了修饰器如何修饰类和方法,并强调了其在 AOP(面向切面编程)中的应用,如日志记录、运行时间统计和登录检查等。尽管修饰器在 JavaScript 中的应用需要借助 Babel 等工具进行转译,但它为代码复用和模块解耦提供了优雅解决方案。作者表达了对 JavaScript 中修饰器功能的期待和对前端工具链的复杂性的无奈,同时提倡简洁编程,并推荐了一些相关参考文章。
漫谈应用程序重试策略及其实现
漫谈应用程序重试策略及其实现 最近在项目联调中面临稳定性、文档维护和部署效率等问题,引发对如何更好地处理事务的思考。文章探讨了在开发过程中保证Web服务稳定性、降低文档维护成本以及提高多环境服务部署效率的挑战。通过一个简单的业务场景和代码演进展示了在面对复杂代码和重试策略时的思考过程。提出了Try-Catch-Redo、Try-Catch-Redo-Retry、Retry-Builder和装饰器/AOP等重试策略,并强调了重试策略核心理念。最后,介绍了一个简单的Retry实现,旨在优雅处理重试问题。文章强调了设计模式的重要性以及对应用程序重试策略的综合考虑。
使用 Unity 框架简化应用程序异常处理及日志记录流程 最近在学习一个项目代码,发现项目整体难度中等,涉及完整的前后端流程,发现一些有趣的设计,如采用严谨的错误码、OAuth和JWT实现API资源访问控制以及在JavaScript中使用修饰器特性记录日志等。作者决定通过Unity框架简化应用程序的异常处理和日志记录流程,避免项目中滥用异常处理和重复代码的现象。讨论了Unity框架与AOP,介绍了Unity中的三种拦截器及其应用场景,展示了如何实现LogHandler和ExceptionHandler组件,以及如何使用这些组件。最后,强调了使用AOP机制对项目的影响和依赖注入的重要性。
基于 Python 实现 Windows 下壁纸切换功能 本文介绍了作者尝试改变博客写作风格的经历,强调了在写作中注重"为什么"而不只是"如何"的重要性。作者通过Python和Windows注册表实现了壁纸切换功能,涉及requests和pyinstaller模块的使用。初衷源于对壁纸的挑剔,通过从Pexels和Unsplash网站抓取图片来解决。详细介绍了代码实现和将功能整合到系统菜单中的过程。最终,通过修改注册表实现了右键菜单中的壁纸切换选项。提及了未来设计扩展的问题和计划。
深入浅出理解 Python 装饰器 本文介绍了Python中装饰器的重要性和使用方法。首先讨论了装饰器的概念,指出装饰器本质上是函数,进而探讨了函数对象和闭包的概念。随后展示了如何使用装饰器来对函数进行修饰,包括调试函数参数和统计函数执行时长等功能。然后对比了代理模式和装饰器模式,指出代理模式强调控制,而装饰器模式强调扩展。最后探讨了装饰器与面向切面编程的联系,提到了在不同语言中实现AOP的方式以及对AOP应用的多样性。文章全面阐述了Python装饰器的相关知识点和与设计模式、AOP等概念的联系,为读者深入理解Python装饰器提供了详尽的内容。
基于特性(Attribute)的实体属性验证方案设计 Payne在博客中探讨了数据校验的问题,介绍了对该话题的兴趣源自最近工作需求,并分享了关于Attribute和Property的区别。他讨论了.NET中的Attribute的概念和使用方式,展示了一个数据校验方案的设计思路和实现技术要点,以及如何通过示例对实体属性进行验证。最后,他总结了特性和属性的概念差异,Attribute在.NET中的应用以及验证方案的设计思路,鼓励大家努力提高业务代码质量。
基于过滤器实现异常处理的探索 本文讨论了异常处理的概念和实践,作者分享了自己对异常处理的理解和经验,以及在项目中引入 AOP 后,从 try-catch 转向 Interceptor 的处理方式。文章首先区分了异常和错误,强调了软件工程中测试和错误处理的重要性,并提出统一的异常处理入口,避免代码中到处都是 try-catch 和日志记录的混乱。接着,文章介绍了 CheckedException 的概念,讨论了 Java 和 C# 中对异常处理的不同策略,并提出了基于过滤器的异常处理方案,通过定义异常基类和过滤器,利用 Attribute 关联异常和过滤器,达到代码解耦和增强可维护性的效果。作者通过实际案例展示了如何将异常处理代码重构为更优雅的形式,并通过多态和过滤器的概念简化异常处理流程,最后强调了程序员应追求代码设计的优雅,以适应不断变化的需求。
异步 Lambda 表达式问题的探索 Payne在博客中讨论了.NET中异步Lambda表达式的问题,强调架构设计应由一线开发人员提炼和抽象,指出异步方法在ICommand接口中的历史遗留问题。他还探讨了异步编程中的异常处理机制,指出使用async void容易导致未处理异常终止程序。最后总结指出异步委托在IL层面无差别,建议使用Func而非Action来生成异步方法,对待async void应注意异常处理,强调处理各种异常的必要性。
使用 C#开发 HTTP 服务器之支持 HTTPS 本文介绍了作者在开发 HTTP 服务器系列中的第六篇文章,讨论了如何为Web服务器增加HTTPS支持。HTTPS是基于安全的HTTP协议,通过SSL加密和身份验证提供数据传输安全。讨论了苹果和Google推广HTTPS的原因,以及HTTPS协议的工作原理和区别。文章重点在于如何使用.NET中的SSL API创建和加载证书,并通过SSL对Socket通信消息进行加密。作者提到需要从CA机构购买证书,并给出了相关代码示例。文章列出了一些参考文章和配置HTTPS服务的指南。
基于 Mono 和 VSCode 打造轻量级跨平台 IDE 最近微软推出了 Visual Studio For Mac,展示了微软技术栈向开源和跨平台发展的努力。文章介绍了在Linux下使用Mono和VSCode构建轻量级IDE的过程,展示了在VSCode中编译和调试代码的步骤。由于Mono-Debug插件不支持Windows平台,作者转向Linux平台,并成功在VSCode中运行C#程序。文章强调了在不同平台的探索中不设限,展望了未来研究VSCode调试技巧和.NETCore相关内容的计划。