自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 收藏
  • 关注

原创 Golang | 常见错误案例

可比较的类型:布尔、整型、浮点数、复数、字符串、指针值、通道值(如果是由同一个 make 创建的,或者两者都为 nil,则相等)、接口值、接口与非接口值。在 First 函数中,结果 channel 是无缓冲的,这意味着只有第一个 Goroutine 能返回,由于没有 receiver,其他的 Goroutine 会在发送上一直阻塞。但是可以通过提前定义迭代变量,使用临时变量接收 for 循环迭代变量的方式,来实现和修改前相近的效率,也能实现每轮循环使用一个单独变量的效果。比较的变量,比如使用。

2024-11-12 23:40:28 897

原创 Golang | 并发编程之 singleflight

singleflight 可以实现请求抑制,是预防缓存击穿的有力工具;singleflight 主要利用 mutex+waitGroup 实现请求阻塞,利用 map 缓存请求结果;注意使用 singleflight 的阻塞问题(添加超时控制)与错误问题(定期通过 Forget 刷新 key);

2024-11-12 23:39:00 777

原创 Golang | Gee 框架的设计和实现

Gin 默认使用模板 Go 语言标准库的模板 text/template 和 html/template,语法与标准库一致,支持各种复杂场景的渲染。Post 请求参数通常是以表单的形式提交的,所以对于这部分请求的处理,与 Query 不一样。针对 HTTP 请求中的 RequestParam 类型的参数,在 Gin 中的处理方式也十分简单。利用分组路由还可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中,简化权限控制。编写这样的程序,之后启动程序,查看控制台,发现只显示监听了 8080 端口。

2024-08-10 20:25:31 1110 4

原创 Golang | Gin 框架的使用

Gin 默认使用模板 Go 语言标准库的模板 text/template 和 html/template,语法与标准库一致,支持各种复杂场景的渲染。Post 请求参数通常是以表单的形式提交的,所以对于这部分请求的处理,与 Query 不一样。针对 HTTP 请求中的 RequestParam 类型的参数,在 Gin 中的处理方式也十分简单。利用分组路由还可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中,简化权限控制。编写这样的程序,之后启动程序,查看控制台,发现只显示监听了 8080 端口。

2024-07-21 12:21:34 854

原创 Golang | 包管理 Go Modules

Go 语言相比于其他语言来说,一个比较鲜明的特点就是自带了包管理工具。随着 Go 1.11 的发布,官方的包管理工具Go Modules变得流行起来。在 Go 1.12 版本中,增强了对Go Modules的支持。

2024-07-20 12:53:04 840

原创 Golang | 指针的使用

在面对 Java、C#、VB 这些高级程序设计语言的时候,很少有听到指针的概念。所以长期接触这类语言的开发者,在接触 Go 的时候,基础语法中最不能理解的应该就是指针了。

2024-02-29 21:42:41 902 2

原创 Golang | Go RPC & TLS 鉴权

RPC () 是一种远程通信协议,用于让不同服务之间进行通信。相比 HTTP,RPC 在传输信息时会减少一些额外的信息。HTTP 是实现 RPC 的一种手段,RPC 常见的实现有很多,比如 Dubbo、gRPC、Hessian 等。远程过程调用,实际上最终是一个调用。相比于本地调用,RPC 还需要知道对向的地址信息。本地调用就如同两个人面对面交流,RPC 则像是两个人打电话,需要知道对方的手机号码,但是并不关心语音怎么编码、传输、解码的过程。提供服务的一端,我们称为服务端,就好比是接听电话的一端。

2023-12-29 22:57:59 1165 1

原创 【分布式】高可用:限流、降级、熔断

另一种是独立降级系统,为了解决系统后门降级方式的缺点,将降级操作独立到一个单独的系统中,可以实现复杂的权限管理、批量操作等功能,但引入独立系统,运维集成等复杂度会相应提高,Hystrix、Sentinel 等都有相应功能实现。它的思想是将数据包看作是水滴,漏桶看作是一个固定容量的水桶,数据包像水滴一样从桶的顶部流入桶中,并通过桶底的一个小孔以一定的速度流出,从而限制了数据包的流量。如果漏桶中还有水,就以一定的速率从桶底输出数据包,保证输出的速率不超过预设的速率,从而达到限流的目的。这样会造成限流的不准确。

2023-08-31 01:14:22 691

原创 【Java基础】day17

日志框架将日志写入到缓冲区中,等待适当的时候再将日志写入到持久化的存储中,这样日志信息就不会丢失,并且可以方便地进行查询和分析。【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。我们可以使用信号量或者 Latch 来控制任务提交的数量,可以一定程度上在业务层面避免 OOM 情况的发生,但是产生 OOM 的最根本原因在于 Fixed 类型线程池本身的设计与开发者的错误使用。

2023-04-22 00:25:05 562 1

原创 【Java基础】day16

这种方式是 Effective Java 作者 Josh Bloch 提倡的方式。它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。由于 JDK 1.5 之后才加入 enum 特性,这种方式在实际开发中用的比较少。不能通过反射攻击 reflection attack 来调用私有构造方法,所以能绝对防止多次实例化。枚举类型会在类加载阶段就进行初始化,类加载阶段是数据安全的,所以是线程安全的。这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。

2023-04-20 23:13:25 589

原创 【Java基础】day15

1、资源利用率提升,程序处理效率提高2、软件运行效率提升3、使用线程可以把占据时间长的程序中的任务放到后台去处理4、充分利用 CPU 资源,多核 CPU 的情况下会更高效。

2023-04-15 16:48:43 516

原创 【Java基础】day14

REST 全称是,中文意思是表征性状态转移。它首次出现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding 是 HTTP 规范的主要编写者之一。他在论文中提到:我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST 指的是一组架构约束条件和原则。如果一个架构符合 REST 的约束条件和原则,我们就称它为 RESTful 架构。

2023-04-13 20:26:02 617

原创 【Java基础】day13

用来决定 Bean 的生产方式。定义信息包括:Bean 的类别、父类名称、BeanClass 名称、Scope 、是否为懒加载、依赖对象、初始化/销毁方法名称;是否为单例、多例、抽象等。通常定义的 Bean 中,只有 singleton、非 abstract、非 lazy 的 Bean 才会在 IoC 容器被创建的时候加载。

2023-04-11 20:39:13 502

原创 【部署】Kubernates

kubernetes,简称 K8s,是用 8 代替名字中间的 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful)。Kubernetes 提供了应用部署,规划,更新,维护的一种机制。

2023-02-03 00:41:28 401

原创 【部署】Docker容器

在 Docker 中,有一些非常重要的概念。Dockerfile:用于创建容器,是一个自动化脚本。使用 Dockerfile 可以很方便地根据镜像创建容器。Image:镜像。提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。Container:容器。

2023-01-12 01:01:38 472

原创 【Java基础】day12

请求不存在【 DB 和 Redis 中都不存在】的数据,导致请求直接打到持久层数据库中,导致数据库负载过高,甚至导致宕机。这样的请求几乎可以导致请求次次到达 DB ,会导致 DB 的压力过高,相当于 Redis 没有起到任何请求缓冲的功能。Http 协议使用 TCP 协议进行连接,三次握手会产生比较大的延迟,每发送一次请求,都会有一次建立连接的过程,加上 Http 报文和 JSON 序列比较,会造成 Http 调用效率比较低,并不能像实现本地调用一般完成远程调用。对于相同的哈希值,使用链表进行连接。

2023-01-07 22:15:01 405

原创 【Java基础】day11

BIO (Blocking I/O)同步阻塞的 I/O 、NIO(New/Non-blocking I/O) 同步非阻塞的 I/O 、AIO(Asynchronous I/O) 异步非阻塞的 I/O。这三种 IO 模型是 Java 中提供的 API ,与系统 IO 是不相同的。、、、以及。采用 BIO 的服务端,通常由一个独立的 Acceptor 线程来监听客户端的连接。通常是使用循环与accept()方法来让线程监听请求。

2022-12-27 20:09:24 636

原创 【Redis】Redis使用规范

当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。

2022-12-10 22:42:58 663

原创 【设计】OOA、OOD、OOP

OOA,OOD,OOP 是针对现实的需求最终输出产品过程。在现实中 OOA,OOD 并没有显著的区分。OOA,OOD,OOP 有时是不断的交替进行。对于现在的软件开发中,大部分迅速敏捷至极的项目,基本上是不会输出相关的开发设计图资源的,而是直接进入到 OOP 的阶段。直接进入 OOP 阶段,缺乏足够的 OOA 以及 OOD 过程,那么就会对 OOP 阶段的代码质量造成影响。这里也并不是说有了 OOA 和 OOD,系统的质量就一定好;

2022-11-28 20:35:19 2037

原创 【Java】JVM内存回收

一般这么理解 SafePoint,就是线程只有运行到了 SafePoint 的位置,他的一切状态信息,才是确定的,也只有这个时候,才知道这个线程用了哪些内存,没有用哪些内存;并且,只有线程处于 SafePoint 位置,这时候对 JVM 的堆栈信息进行修改,例如回收某一部分不用的内存,线程才会感知到,之后继续运行,每个线程都有一份自己的内存使用快照,这时候其他线程对于内存使用的修改,线程就不知道了,只有再进行到 SafePoint 的时候,才会感知。要保证用户线程能继续执行,前提的它运行的资源不受影响嘛。

2022-11-20 14:48:21 1592

原创 【中间件】Redis如何解决BigKey

此外 debug object 属于调试命令,运行代价较大,并且在其运行时,进入 Redis 的其余请求将会被阻塞直到其执行完毕,且每次只能查找单个 key 的信息,官方不推荐使用。在现在流行的云服务厂商,也会提供有高级的配套监控服务。对于相同元素的 Key 值,我们可以将多个非常小的 Key 进行整合,使用适当的数据结构进行存储,可以减少相同的 Key 前缀的空间占用。因为大 Key 的存在,所以在产生对应的 Socket 时,就会占用非常大的内存,影响网络 I/O 的效率,降低整个处理链路的效率。

2022-11-06 23:43:48 890

原创 【Web】ES6新特性

ECMAScript6.0 ,简称 ES6。ECMAScript 是一种由 ECMA 国际通过 ECMA-262 标准化的脚本,为 JavaScript 语言的下一代标准, 在 2015 年 6 月正式发布。类比于 Java ,经典程度堪比 JDK 1.8 版本。但是两者之间的区别, JDK 是具体实现,而 ES 就相当于 JSR 规范。

2022-11-01 21:47:38 365 1

原创 【中间件】RPC 的序列化方式

网络传输的数据必须是**二进制数据**,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程我们称之为“反序列化”。

2022-10-30 23:57:41 1543 1

原创 【项目】分布式唯一ID解决方案

分布式环境下的唯一ID生成的解决方案,主要涉及数据库方案、Redis 缓存方案、雪花ID 方案、UUID 方案,Leaf 方案

2022-10-25 19:44:34 1239 2

原创 【测试】基于JMeter的性能测试

它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。Apache JMeter 可以用于对静态的和动态的资源(文件,Servlet,Perl 脚本,Java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。常用的性能测试方法有:基准测试、压力测试、负载测试、并发测试、疲劳测试、数据量测试、配置测试。五、选择线程组,创建统一随机定时器。

2022-10-18 23:10:37 797

原创 【Java】JDK 1.8新特性

缺陷是当需要修改接口时候,需要修改全部实现该接口的类,目前的 Java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在 JDK 里给相关的接口添加新的方法及实现。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。Java 8 中新的时间和日期管理 API 深受 Joda-Time 影响,并吸收了很多 Joda-Time 的精华,新的java.time 包包含了所有关于日期、时间、时区、Instant (跟日期类似但是精确到纳秒)、duration(持续时间)和时钟操作的类。

2022-10-12 01:15:57 371

原创 【Code】RESTful规范

Restful API 是目前比较成熟的一套互联网应用程序的 API 设计理念。REST 是一组架构约束条件和原则,代表表征性状态转移。对于使用 REST 约束条件和原则的架构,我们就称为 RESTful 架构,RESTful 架构具有结构清晰、符合标准、易于理解以及扩展方便等特点,受到越来越多网站的采用。

2022-10-12 01:11:36 739

原创 【规范】代码编写规范

*用业务语言写代码。**这里业务语言,指的是描述的语言,应该更倾向于业务而不是技术维度。**编写可维护的代码要使用业务语言。**如何判断是否使用的是业务语言呢?将语言给业务成员看,如果能看懂,则表示使用的业务语言已经符合标准了。**建立团队词汇表。**使团队业务对于业务有共同理解,不至于出现一个变量含义多种命名方式。如果命名不确定,可以在业务层面进行更深的讨论。好的命名,是体现业务含义的命名。**制定代码规范。**比如,类名要用名词,函数名要用动词或动宾短语;

2022-10-12 01:07:09 3171

原创 【项目】API接口的加签和验签

接口的安全性,和网络是分不开的。所以大多数情况下,还是需要考虑网络环境的安全性。提到的解决方案,也有很多思想借鉴于网络协议。API接口入门(二):API接口的签名验签和加解密原理API 接口签名验签_新猿一马的博客-CSDN博客_接口签名。

2022-09-10 17:31:36 4201

原创 【Spring】@Cacheable 注解的使用及原理

每次调用需要缓存功能的方法时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。在第二次使用到缓存的时候,在 Mapper 调用的方法上打断点,并不会触发 SqlSession 对象的创建和调用。在很多时候,需要对数据库中查询出来的数据进行缓存操作,避免频繁的查库给数据库带来不必要的压力,所以诞生了缓存。此外,还可以设置使用缓存的条件,不符合条件的将不会使用缓存。三、在需要使用缓存的地方使用对应的注解。

2022-09-07 21:14:49 4888 2

原创 【项目】微信接口定时推送天气信息

此处可以做一些优化,比如授权用户的地址信息,根据用户的经纬度信息,计算得出区号 ID,然后请求对应的区号 ID 的天气信息即可。要查询的城市ID配置到 application.yml 的 district_id。的服务文档的请求参数的 district_id一栏下载 “行政区划编码” 查看。中申请对应的接口,配置到application.yml 的 txKey 中即可。备注:需要开启对应的接口服务,此处需要开启的有彩虹屁以及天气诗句接口。项目的整体运行,需要依赖于微信的公众号推送接口。

2022-09-04 19:35:18 618

原创 【Java】switch-case 和 if-else 的运行效率差异

同理来说,如果是 String 类型,则同样换算数字来进行计算,只不过使用的是 String 的 Hashcode 方法来获取 String 的对应数值。那么在这种情况下,switch-case 的效率是比较低的。在 switch 的情况稀疏的情况下,tableswitch 的 table 表示在空间方面变得低效,也可以使用lookupswitch 指令。在 switch-case 中,case 的值是连续的话,会生成一个 TableSwitch 来进行优化,这样的情况下,只需要在表中进行判断即可。

2022-09-04 18:58:43 2800 4

原创 系统设计 | 数据库事务与 MQ 发送一致性

实际上在 producer.sendMessage 执行的时候,消息并没有通过网络发送出去,而仅仅是往业务 DB 同一个实例上的消息库插入一条记录,然后注册事务的回调。在这些场景中,如果发生某种事件后,会触发进一步的操作,那么这个事件很可能就是领域事件。在 DDD 架构中,要实现领域事件驱动优化,需要将不同的领域消息进行抽象,使用 MQ 消息来进行事件驱动,完成事件的最终一致性。以 MySQL 为例,在同一实例中的不同 db ,如果共享同一个 Connection 的话,是可以在同一个事务中的。

2022-09-02 19:48:28 2483 5

原创 【项目】多种方式统一登录入口的设计方案

在编写项目的时候,通常会遇到很多情况下,需要实现统一登录入口。统一登录入口通常指的是:能够实现手机号、邮箱、用户名等信息登录,且共用一个登录入口。这种登录方式现在属于一种主流的登录方式,除此之外,移动端通常还有本机号码一键登录。鉴于各种登录账号(指的是手机号、邮箱、用户名等可以唯一鉴别用户的信息,以下统称登陆账号)的组成不一样,我们可以在后端对数据进行区分。我们在后台对用户的数据进行记录,一般要使用一个数据表来进行存储。表结构类似这种 。那么我们在规划登录的时候,设置了手机号和邮件均可登录,且要求统一登录入

2022-06-02 02:07:37 1893 2

原创 【项目】基于TRTC的实时多人会议实现

一、需求分析最近项目中需要实现一个多人会议的功能。由于考虑到功能的复杂性,选择接入第三方平台实现。为了功能的稳定性,选取当前比较流行的 TRTC (Tencent Real-Time Communication,腾讯实时音视频)。完成技术选型之后,我们需要了解该技术是如何实现和使用的。这一部分参考腾讯云对于 TRTC 的官方文档说明可以得知:实时音视频 新手指引-文档中心-腾讯云-腾讯云 (tencent.com)二、TRTC 的实现TRTC 在使用的时候,主要是作为一个转发云平台,负责处理多端的

2022-05-30 22:10:17 2070

原创 【Git】Conventional Commit 约定式提交规范

定义在 git 代码提交的时候,我们需要对 git 的提交信息做出一定的约定或者规范。为什么会有这样的需求?因为 git 提交时的描述信息,需要在你的合作开发者之间共享,所以大多数情况下 git 提交信息并不只能被你一个人明白。于是就诞生了约定式提交这样的规范。业内普遍认可的的约定式提交规范,为 约定式提交 (Conventional Commits)。约定式提交规范 Conventional Commits 是一种用于给提交信息增加人机可读含义的规范,是基于提交信息的轻量级约定,提供了一组用于创建清

2022-05-21 02:30:49 2013

原创 【Git】分布式版本控制系统

一、概述分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需联网,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改。版本控制的原因:从个人开发过渡到团队协作,不可避免地需要将多人的修改进行合并。集中版本控制常用的集中版本控制工具:CVS、SVN、VSS集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交

2022-04-09 10:07:06 1435

原创 【项目】实现登录鉴权管理的方式(自定义注解、Security)

最近的项目中涉及到了登录用户的鉴权管理。对于权限管理,一共采用过两种方式:自定义注解拦截标注方法、 Spring Security 权限管理。根据可扩展性以及复用性考量,更推荐使用 Spring Security 方式。但是对于要求不是特别高的用户来说,更推荐使用第一种方式; Spring Security 中涉及的要素过多,更容易出现错误。自定义注解标注拦截方法项目中有一些路径是需要在用户登录之后才能访问的,所以需要对登录才能访问的路径映射方法进行自定义注解标注。标注了的方法,表示需要进行登录才能访问

2022-01-08 16:50:30 976

原创 【Java项目】社区论坛项目

仿照牛客网的社区论坛,包括页面以及后端开发、数据库搭建。使用技术整体框架:Spring Boot 2.4.10、Spring 5.3.9 、jdk 11.0版本控制:Git 2.33.1数据库:MySQL 8.0.23 、Redis 3.2.100模板引擎:Thymeleaf应用服务器:Apache Tomcat 9.0.52消息队列:Kafka 2.12-2.8.1分布式搜索:Elasticsearch 6.4.3使用Spring Initializr工具初始化项目,名称的处理相关如下:需要事

2021-12-23 14:31:55 6942 3

原创 【面试】计算机操作系统

进程和线程的区别**进程是资源分配的基本单位。**所有与该进程有关的资源,如外部设备、缓冲区队列等,都被记录在PCB中,以表示该进程拥有这些资源。同一进程的所有线程共享该进程的所有资源。**线程是分配处理机的基本单位。**它与资源分配无关,即真正在处理机上运行的是线程。**线程是进程的子集。**一个线程只能属于一个进程,而一个进程可以有多个线程。**线程的执行过程中需要协作同步。**不同进程的线程间要利用消息通信的方法实现同步。Linux下的线程Linux的内核级线程也称为系统级线程。Lin

2021-10-28 20:00:27 888

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除