开发 – HikariLan's Blog https://blog.hikarilan.life 贺兰星辰的个人博客 Tue, 08 Aug 2023 11:21:09 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 实战!用 Spring Gateway 配合 Sa-Token 实现微服务无感鉴权 https://blog.hikarilan.life/tech/1239/%e5%ae%9e%e6%88%98%ef%bc%81%e7%94%a8-spring-gatway-%e9%85%8d%e5%90%88-sa-token-%e5%ae%9e%e7%8e%b0%e5%be%ae%e6%9c%8d%e5%8a%a1%e6%97%a0%e6%84%9f%e9%89%b4%e6%9d%83/ https://blog.hikarilan.life/tech/1239/%e5%ae%9e%e6%88%98%ef%bc%81%e7%94%a8-spring-gatway-%e9%85%8d%e5%90%88-sa-token-%e5%ae%9e%e7%8e%b0%e5%be%ae%e6%9c%8d%e5%8a%a1%e6%97%a0%e6%84%9f%e9%89%b4%e6%9d%83/#comments Tue, 08 Aug 2023 08:58:13 +0000 https://my.minecraft.kim/?p=1239 众所周知,Spring Cloud Gateway 是一个基于 Spring WebFlux 技术构建的高性能微服务网关,通过 Spring Cloud Gateway,我们可以实现对微服务的负载均衡,服务治理等功能;Sa-Token 则是一款轻量级的 Java 权限认证框架,通过 Sa-Token 我们可以非常简便的实现服务的鉴权功能。 在业务实践中,我们可以直接在网关对需要鉴权的路由进行访问鉴权,阻止未登录或无权限用户访问指定 API/页面。Sa-Token 的文档也描述了这种网关统一鉴权的解决方案,但这依然不能解决一些问题: 因此,本文提供了一种无感鉴权的方案,通过直接向下游微服务请求注入用户 ID 的方式,做到了无感鉴权,使鉴权服务对下游微服务保持透明。 本文全程使用 Java 17 + Spring Boot 3 作为示例,对于传统 Java 8 +…

来源

]]>
https://blog.hikarilan.life/tech/1239/%e5%ae%9e%e6%88%98%ef%bc%81%e7%94%a8-spring-gatway-%e9%85%8d%e5%90%88-sa-token-%e5%ae%9e%e7%8e%b0%e5%be%ae%e6%9c%8d%e5%8a%a1%e6%97%a0%e6%84%9f%e9%89%b4%e6%9d%83/feed/ 5
Tailwind CSS 导论 https://blog.hikarilan.life/thinking/1220/tailwind-css-%e5%af%bc%e8%ae%ba/ https://blog.hikarilan.life/thinking/1220/tailwind-css-%e5%af%bc%e8%ae%ba/#respond Thu, 13 Jul 2023 15:43:16 +0000 https://my.minecraft.kim/?p=1220 作为前端开发,您是否曾经为在 HTML 和 CSS 之间不断切换而感到困扰?是否正在寻找一个可以帮助快速开发网页的 CSS 框架?如果是这样,那么 Tailwind CSS 一定是你的不二之选。 Tailwind CSS 是一款效用优先的 CSS 框架,其包含了 , , 和 这样的 class 来帮助你通过组合这些类来直接在标记中构建任何设计。(A utility-first CSS framework packed with classes like , , and that can be composed to build any design, directly in your markup.) 直接看概念似乎有些难以理解,因此我们以官网上的一个例子来解释: 在我们没有使用 Tailwind CSS 之前,如果想要构建一个卡片 UI,可能需要这么写:

来源

]]>
https://blog.hikarilan.life/thinking/1220/tailwind-css-%e5%af%bc%e8%ae%ba/feed/ 0
让博客支持使用 ChatGPT 生成文章摘要是一种什么样的体验? https://blog.hikarilan.life/tech/1125/%e8%ae%a9%e5%8d%9a%e5%ae%a2%e6%94%af%e6%8c%81%e4%bd%bf%e7%94%a8-chatgpt-%e7%94%9f%e6%88%90%e6%96%87%e7%ab%a0%e6%91%98%e8%a6%81%e6%98%af%e4%b8%80%e7%a7%8d%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e4%bd%93/ https://blog.hikarilan.life/tech/1125/%e8%ae%a9%e5%8d%9a%e5%ae%a2%e6%94%af%e6%8c%81%e4%bd%bf%e7%94%a8-chatgpt-%e7%94%9f%e6%88%90%e6%96%87%e7%ab%a0%e6%91%98%e8%a6%81%e6%98%af%e4%b8%80%e7%a7%8d%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e4%bd%93/#comments Tue, 25 Apr 2023 15:41:08 +0000 https://my.minecraft.kim/?p=1125 Sakurairo 主题支持了基于 ChatGPT 的 AI 摘要功能,我有点眼红,但是因为那是个主题限定功能,而我用的又是 Argon,遂想着让 Argon 也支持 AI 摘要功能。 截至目前,此功能已经合并到了 argon-theme 主仓库的 分支,pr 现场可参见:#607 和 Sakurairo 相同,我采用了 库以对接 OpenAI 接口(顺便给 Argon 添加了 Compose 支持) 。 接下来,在 和 添加了全局和文章单独设置,以允许用户配置 OpenAI 地址,密钥,以及是否需要使用 AI 摘要功能。 最后,在 和 添加页面样式,就完成了开发。 有关 ChatGPT 部分的核心代码如下: 总体来说,是非常满足我的需求的,用起来也很方便。

来源

]]>
https://blog.hikarilan.life/tech/1125/%e8%ae%a9%e5%8d%9a%e5%ae%a2%e6%94%af%e6%8c%81%e4%bd%bf%e7%94%a8-chatgpt-%e7%94%9f%e6%88%90%e6%96%87%e7%ab%a0%e6%91%98%e8%a6%81%e6%98%af%e4%b8%80%e7%a7%8d%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e4%bd%93/feed/ 15
微信小程序开发大坑盘点 https://blog.hikarilan.life/tech/1103/%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8f%e5%bc%80%e5%8f%91%e5%a4%a7%e5%9d%91%e7%9b%98%e7%82%b9/ https://blog.hikarilan.life/tech/1103/%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8f%e5%bc%80%e5%8f%91%e5%a4%a7%e5%9d%91%e7%9b%98%e7%82%b9/#respond Thu, 20 Apr 2023 16:12:50 +0000 https://my.minecraft.kim/?p=1103 前几天心血来潮,想给学校设计个一站式校园小程序,可以查询成绩,考试信息,课表之类的(本来想法里是还想包括一些社交功能的,但这个因为资质问题暂且搁置了)。其实很久以前就有大概了解过微信小程序的一些概念,那个时候试图用 做,但是这玩意太难用所以不了了之了。 于是这次打算正经的用微信自己的那套东西做,结果不出意外的是入了深坑…… 微信小程序提供 发起 HTTP 请求,由于微信不是浏览器,没有跨域限制,这方便了很多事,但是由于 函数只能对 协议的地址发起请求,而我们学校的教务系统又是清一色的 HTTP,因此我需要一个可以用来帮助我发起 HTTP 请求的转发接口。 对于这种简单需求,云函数显然是最好的解决方案,进而我发现微信小程序自带云函数的支持,于是便兴冲冲地写了一段 NodeJS 代码,放上去跑。 结果我发现不知道为什么,请求其他网站都没问题,

来源

]]>
https://blog.hikarilan.life/tech/1103/%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8f%e5%bc%80%e5%8f%91%e5%a4%a7%e5%9d%91%e7%9b%98%e7%82%b9/feed/ 0
极简版抖音项目的实现(2) —— Mock 和单元测试 | 青训营笔记 https://blog.hikarilan.life/tech/957/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b02-mock-%e5%92%8c%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95-%e9%9d%92%e8%ae%ad%e8%90%a5/ https://blog.hikarilan.life/tech/957/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b02-mock-%e5%92%8c%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95-%e9%9d%92%e8%ae%ad%e8%90%a5/#respond Sun, 12 Feb 2023 14:54:50 +0000 https://my.minecraft.kim/?p=957 这是我参与「第五届青训营」伴学笔记创作活动的第 15 天 完结撒花!小小庆祝一下。 本文上接 极简版抖音项目的实现 | 青训营笔记,介绍了该项目视频流服务的单元测试代码。 Go 原生支持单元测试(Unit Test),为了对我们的视频流服务进行单元测试,创建 文件。 首先,在 函数中初始化数据,这包括我们一些预先设定好的来自上游服务的测试数据和我们预期的结果数据: 上述代码创建了 50 个预设的视频数据,如果服务正常工作,那么应当返回 值。 接下来,在 函数中编写正式的开发流程: 上述代码首先初始化了一些请求数据,然后对 和数据库进行了 Mock(Mock 可以理解为,将原有的函数和方法实现替换成仅在测试可用的特殊实现),以期其返回我们的期望数据,最后,对这些数据进行比对。 该文章部分内容来自于以下课程或网页:

来源

]]>
https://blog.hikarilan.life/tech/957/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b02-mock-%e5%92%8c%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95-%e9%9d%92%e8%ae%ad%e8%90%a5/feed/ 0
部署 Casdoor 身份认证管理系统并实现透过 OAuth2.0 登录到 WordPress https://blog.hikarilan.life/tech/948/%e9%83%a8%e7%bd%b2-casdoor-%e8%ba%ab%e4%bb%bd%e8%ae%a4%e8%af%81%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b9%b6%e5%ae%9e%e7%8e%b0%e9%80%8f%e8%bf%87-oauth2-0-%e7%99%bb%e5%bd%95%e5%88%b0-wordpress/ https://blog.hikarilan.life/tech/948/%e9%83%a8%e7%bd%b2-casdoor-%e8%ba%ab%e4%bb%bd%e8%ae%a4%e8%af%81%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b9%b6%e5%ae%9e%e7%8e%b0%e9%80%8f%e8%bf%87-oauth2-0-%e7%99%bb%e5%bd%95%e5%88%b0-wordpress/#respond Wed, 08 Feb 2023 11:26:42 +0000 https://my.minecraft.kim/?p=948 由于考虑到 XCTRA 未来可能会有非常多的子服务,如果全部采用单一认证可能会非常复杂,于是这几天一直在研究 IAM(Identity and Access Management)系统,在尝试了 Apache keycloak,JustAuthPlus 等开源项目后,最终选择了 Casdoor。 Casdoor 是一个支持 OAuth 2.0、OIDC 和 SAML 的 UI 优先集中式身份验证/单点登录 (SSO) 平台,使用 Go 开发,前后端分离,内置第三方应用登录服务。 让我选择 Casdoor 而不是其他项目的原因是因为首先 Casdoor 是由国内开发的,对大陆网络环境支持较好,其次是 Casdoor 奉行“UI 优先”的理念,这对于我这种颜值党来说非常友好,最后,Casdoor 的安装十分简单,仅需 Go 和 NodeJS(Yarn) 环境即可运行,

来源

]]>
https://blog.hikarilan.life/tech/948/%e9%83%a8%e7%bd%b2-casdoor-%e8%ba%ab%e4%bb%bd%e8%ae%a4%e8%af%81%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b9%b6%e5%ae%9e%e7%8e%b0%e9%80%8f%e8%bf%87-oauth2-0-%e7%99%bb%e5%bd%95%e5%88%b0-wordpress/feed/ 0
极简版抖音项目的实现 | 青训营笔记 https://blog.hikarilan.life/tech/938/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b0-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/ https://blog.hikarilan.life/tech/938/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b0-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/#respond Mon, 06 Feb 2023 12:49:10 +0000 https://my.minecraft.kim/?p=938 这是我参与「第五届青训营」伴学笔记创作活动的第 11 天 本文大致介绍了本人及本人所在小组为第五届字节跳动青训营后端专场大项目需求 —— 「实现一个极简版抖音」的部分实现细节。 本届后端青训营大项目要求实现一个极简版抖音的后端服务,该后端服务通过 HTTP 协议向已被设计好的前端 App 传递数据,并通过 URL Query 获得请求参数。 该服务大致有如下类别的接口: TokTik 项目基于 Go 开发,采用微服务架构,由网关(Gateway)服务接受 HTTP 请求,将其转换为 RPC 调用后传入路由对应的其他服务。服务内部统一使用 RPC 调用进行数据交换。 TokTik 使用 protobuf 作为 IDL 语言,使用 gorm 作为 ORM 框架,使用 Kitex 作为 RPC 框架,使用 Hertz 作为 HTTP 框架,

来源

]]>
https://blog.hikarilan.life/tech/938/%e6%9e%81%e7%ae%80%e7%89%88%e6%8a%96%e9%9f%b3%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%ae%9e%e7%8e%b0-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/feed/ 0
微服务中的服务治理 | 青训营笔记 https://blog.hikarilan.life/tech/932/%e5%be%ae%e6%9c%8d%e5%8a%a1%e4%b8%ad%e7%9a%84%e6%9c%8d%e5%8a%a1%e6%b2%bb%e7%90%86-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/ https://blog.hikarilan.life/tech/932/%e5%be%ae%e6%9c%8d%e5%8a%a1%e4%b8%ad%e7%9a%84%e6%9c%8d%e5%8a%a1%e6%b2%bb%e7%90%86-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/#respond Sat, 04 Feb 2023 04:13:18 +0000 https://my.minecraft.kim/?p=932 这是我参与「第五届青训营」伴学笔记创作活动的第 9 天 本文介绍了微服务架构中的服务治理方式,包括服务注册与发现,服务发布和稳定治理。 对于微服务,有以下基本概念: 微服务架构的出现和应用大幅度的提升了大型程序的开发效率,降低了程序故障率,但其复杂的架构设计也引来了治理、运维难度飙升,观测难度大,安全性较低等劣势。 我们通过引入许多的服务治理模式来解决这些问题。 服务注册与发现是为了解决微服务中服务间通信地址难以确定的问题。 想象一个服务 A 试图通过网络请求调用服务 B 的某个接口,他应该如何确定服务 B 的网络地址? 如果我们通过硬编码的方式在服务 A 指定网络地址,灵活性低暂且不说,对于具有多个实例的服务 B,一个网络地址只能指定到同一个服务实例中,这会导致服务 A 的所有实例全部向服务 B 的单一实例进行网络请求,

来源

]]>
https://blog.hikarilan.life/tech/932/%e5%be%ae%e6%9c%8d%e5%8a%a1%e4%b8%ad%e7%9a%84%e6%9c%8d%e5%8a%a1%e6%b2%bb%e7%90%86-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/feed/ 0
分布式系统中的数据库事务 | 青训营笔记 https://blog.hikarilan.life/tech/930/%e5%88%86%e5%b8%83%e5%bc%8f%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/ https://blog.hikarilan.life/tech/930/%e5%88%86%e5%b8%83%e5%bc%8f%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/#respond Thu, 02 Feb 2023 05:20:25 +0000 https://my.minecraft.kim/?p=930 这是我参与「第五届青训营」伴学笔记创作活动的第 8 天 本文简述了在分布式系统中使用的分布式数据库事务方案。 分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算,分布式存储,分布式数据库等。 在分布式系统中,由于不同节点可能维护各自的数据库,但这些数据库有需要保持同步,这就可能引发同步问题。 为了解决这些问题,我们引入分布式事务的解决方案。 在分布式事务中,有多种处理方案可以在不同程度上解决我们的问题: 二阶段提交(Two-phase Commit)是为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。 在二阶段提交算法中,我们需要引入三个假设: 在以上三个假设中,二阶段提交算法以如下方式工作: 此时,可能出现以下异常情况:

来源

]]>
https://blog.hikarilan.life/tech/930/%e5%88%86%e5%b8%83%e5%bc%8f%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/feed/ 0
浅谈软件工程架构及其演进 | 青训营笔记 https://blog.hikarilan.life/tech/926/%e6%b5%85%e8%b0%88%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e6%9e%b6%e6%9e%84%e5%8f%8a%e5%85%b6%e6%bc%94%e8%bf%9b-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/ https://blog.hikarilan.life/tech/926/%e6%b5%85%e8%b0%88%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e6%9e%b6%e6%9e%84%e5%8f%8a%e5%85%b6%e6%bc%94%e8%bf%9b-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/#respond Wed, 01 Feb 2023 11:10:38 +0000 https://my.minecraft.kim/?p=926 这是我参与「第五届青训营」伴学笔记创作活动的第 7 天 本文介绍了软件工程架构及其演进史,并包含了企业级后端架构刨析等内容。 简单来讲,软件架构就像建筑的地基一样,为指导软件实现的方法起到重要作用。只有地基坚实了,大厦才能盖的高。 我们以蛋糕店为例,假设有人想要开一家蛋糕店,那么作为蛋糕店的老板,一开始他可能会这样布置他的蛋糕店… 所谓单机架构,就是把所有功能都实现在一个进程里,并部署在一台机器上。对于蛋糕店来讲,就是一家蛋糕店里只有一个人工作,且这个人要负责所有制作,售卖蛋糕的工作。 这种架构的好处是,开发和部署起来十分简单,对于小型应用来说足矣。但对于大型应用来说,他的并发性不足,存在性能瓶颈(如著名的 The C10K problem),并且无法保证高可用性。对于蛋糕店来讲,就是这个人一个人不能服务成千上万的人,且这个人必须24小时不停的干,

来源

]]>
https://blog.hikarilan.life/tech/926/%e6%b5%85%e8%b0%88%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e6%9e%b6%e6%9e%84%e5%8f%8a%e5%85%b6%e6%bc%94%e8%bf%9b-%e9%9d%92%e8%ae%ad%e8%90%a5%e7%ac%94%e8%ae%b0/feed/ 0