- 博客(111)
- 资源 (5)
- 收藏
- 关注
原创 Redis集群部署
创建集群,选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。简单来说,命令的意思就是让redis-cli帮我们创建三个主节点和三个从节点的集群。重要:集群的IP直接影响了client在接受到moved to时跳转的节点IP,所以不要使用127.0.01,使用内网IP:10.38.70.13 代替。接着,会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-cli就会将这份配置应用到集群当中。如果还遇到下面错误,则需要按照下面步骤处理。
2024-03-07 20:50:28
995
转载 go-zero微服务实战系列(六、缓存一致性保证)
只要我们使用缓存,就必然会面对缓存和数据库间的一致性问题。如果缓存中的数据和数据库的数据不一致,那么业务应用从缓存中读取的数据就不是最新的数据,对业务的影响可想而知。比如我们把商品的库存数据存在缓存中,如果缓存中库存数据不对,那么可能就会影响下单操作,这是业务上很难接受的。本篇文章我们来一起聊一聊缓存的一致性问题。
2023-11-08 17:02:59
189
转载 go-zero微服务实战系列(十一、大结局)
本篇是整个系列的最后一篇了,本来打算在系列的最后一两篇写一下关于k8s部署相关的内容,在构思的过程中觉得自己对k8s知识的掌握还很不足,在自己没有理解掌握的前提下我觉得也很难写出自己满意的文章,大家看了可能也会觉得内容没有干货。我最近也在学习k8s的一些最佳实践以及阅读k8s的源码,等待时机成熟的时候可能会考虑单独写一个k8s实战系列文章。
2023-11-08 17:01:36
193
转载 go-zero微服务实战系列(十、分布式事务如何实现)
在分布式应用场景中,分布式事务问题是不可回避的,在目前流行的微服务场景下更是如此。比如在我们的商城系统中,下单操作涉及创建订单和库存扣减操作两个操作,而订单服务和商品服务是两个独立的微服务,因为每个微服务独占一个数据库实例,所以下单操作就涉及到分布式事务问题,即要把整个下单操作看成一个整体,要么都成功要么都不成功。本篇文章我们就一起来学习下分布式事务的相关知识。
2023-11-08 17:00:19
317
转载 go-zero微服务实战系列(九、极致优化秒杀性能)
上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不优化处理掉,那么秒杀抢购活动开始后可能会出现消息堆积、消费延迟、数据不一致、甚至服务崩溃等问题,那么后果可想而知。本篇文章我们就一起来把这些隐患解决掉。
2023-11-08 16:59:29
214
转载 go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
在前几篇的文章中,我们花了很大的篇幅介绍如何利用缓存优化系统的读性能,究其原因在于我们的产品大多是一个读多写少的场景,尤其是在产品的初期,可能多数的用户只是过来查看商品,真正下单的用户非常少。但随着业务的发展,我们就会遇到一些高并发写请求的场景,秒杀抢购就是最典型的高并发写场景。在秒杀抢购开始后用户就会疯狂的刷新页面让自己尽早的看到商品,所以秒杀场景同时也是高并发读场景。那么应对高并发读写场景我们怎么进行优化呢?
2023-11-08 16:58:44
174
转载 go-zero微服务实战系列(七、请求量这么高该如何优化)
前两篇文章我们介绍了缓存使用的各种最佳实践,首先介绍了缓存使用的基本姿势,分别是如何利用go-zero自动生成的缓存和逻辑代码中缓存代码如何写,接着讲解了在面对缓存的穿透、击穿、雪崩等常见问题时的解决方案,最后还重点讲解了如何保证缓存的一致性。因为缓存对于高并发服务来说实在是太重要了,所以这篇文章我们还会继续一起学习下缓存相关的知识。
2023-11-08 16:57:57
82
转载 go-zero微服务实战系列(五、缓存代码怎么写)
缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起。本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数组、双向链表、哈希表、压缩列表和跳表五种数据结构。由于底层依赖的数据结构的高效性以及基于多路复用的高性能I/O模型,所以Redis也提供了非常强悍的性能。下图展示了Redis数据类型对应的底层数据结构。
2023-11-08 16:56:19
309
转载 go-zero微服务实战系列(四、CRUD热热身)
go-zero的logx包提供了日志功能,默认不需要做任何配置就可以在stdout中输出日志。当我们请求/v1/order/list接口的时候输出日志如下,默认是json格式输出,包括时间戳,http请求的基本信息,接口耗时,以及链路追踪的span和trace信息。我们还可以扩展其他第三方日志库,通过来进行设置})同时logx还提供了丰富的配置,可以配置日志输出模式,时间格式,输出路径,是否压缩,日志保存时间等可以看到logx提供的日志功能还是非常丰富的,同时支持了各种自定义的方式。
2023-11-08 16:55:31
209
转载 go-zero微服务实战系列(三、API定义和表结构设计)
可能大家在工作中都遇到过这样的场景,就是代码更新了但是文档没有更新,从而产生一些问题导致一些扯皮事情的发生。这个问题的本质是服务和文档是割裂的。我们期望的是文档即协议,协议即服务,这个理念与go-zero的api定义不谋而合。我们定义了BFF层,BFF是对外提供HTTP接口的统一出口,所以我们这里API的定义主要是针对BFF服务的API的定义。首页功能主要分为四个部分,搜索、Banner图、限时抢购和推荐商品列表,点击搜索框会跳转到搜索页,推荐部分是分页展示的,用户通过不断地往上滑动可以加载下一页。
2023-11-08 16:54:28
189
转载 go-zero 微服务实战系列(二、服务拆分)
高度可维护和可测试松散的耦合可独立部署围绕业务功能进行构建由不同的小团队进行维护微服务架构能够快速、频繁、可靠地交付大型、复杂的应用程序,通过业务拆分实现服务组件化,使用组件进行组合从而快速开发系统。
2023-11-08 16:53:20
131
转载 go-zero 微服务实战系列(一、开篇)
在社区中经常看到有人问有没有基于 go-zero 的比较完整的项目参考,该类问题本质上是想知道基于 go-zero 的项目的最佳实践。完整的项目应该是一个完整的产品功能,包含产品需求、架构设计、关键流程的编码、表设计以及各种性能优化和数据一致性等,是一个真正贴近生产级的项目,是可以直接拿来在自己的生产项目中进行参考的,而目前社区并没有类似的比较完整的开源项目参考,因此决定和大家一起从零开始基于 go-zero 构建一个完整的贴近生产的项目。
2023-11-08 16:51:47
279
原创 Redis布隆过滤亿级大数据
布隆过滤器(Bloom Filter)是一种数据结构,其主要功能是判断某个元素是否出现在集合中。它通过使用多个哈希函数将元素映射到一个位数组中,并将对应位标记为1,来实现对元素的判重。如果一个元素在位数组中对应的位置上有一位为0,那么该元素一定不存在于集合中,如果所有对应位都为1,那么该元素可能存在于集合中。具体来说:当要加入一个元素时,使用多个不同的哈希函数对该元素进行哈希,得到多个哈希值,然后将这些哈希值对应的位数组上的位置置为1。
2023-09-11 14:26:46
519
原创 利用redis实现令牌桶限流
这是因为在Redis中time命令是一个随机命令(时间是变化的),出于主从数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,写入Redis的数据也必须是相同的,对于随机性的写入Redis是拒绝的,所以在Lua脚本中调用了随机命令之后禁止再调用写命令。命令格式:EVAL script numkeys key [key …] arg [arg …为什么now需要通过参数传递进去,而不是在脚本内部自己获取?redis 的eval命令是用来执行lua脚本的。
2023-04-24 13:56:50
525
原创 解决SSH能连上,但是无法scp的问题
今天发现已经配置好免登的2台服务器之间使用SSH是可以登录的,但是scp就会持续阻塞无法传文件,也没找出是什么原因。既然SSH能通,那么就变相换了一种方式来替代scp// 复制本地文件到远程服务器tar czf - ./* | ssh user@otherserver.com tar xzf - -C ~/saved_tree// 反向获取远程服务器文件到本地ssh user@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C
2022-03-04 11:14:43
5791
原创 用自增ID生成另一个长串数字的方法
实际应用场景中经常会遇到用什么方式来生成userId,常用的方式是直接使用Mysql的自增主键作为userId,优点是简单方便,插入时无须考虑userId重复的问题,缺点是位数不一致,如果userId还需要暴露给用户或者第三方,容易让他人估计出用户总数量,同时伪造userId也变得更方便。所以需要一个更好的方式来产生userId来代替自增主键。以下算法可以通过一个数字产生另一个位数相对固定的数字,同时还是可逆的。$seeds = [ '7893401256'...
2022-02-09 11:43:35
762
转载 Uber Go 语言编码规范
uber-go/guide 的中文翻译EnglishUber Go 语言编码规范Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub,经过一年的积累和更新,该规范已经初具规模,并受到广大 Gopher 的关注。本文是该规范的中文版本。本版本会根据原版实时更新。版本当前更新版本:2021-11-23 版本地..
2022-01-19 10:26:50
463
转载 从bitmap到bloom filter的应用
1. BitMapBit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点节省存储空间)假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存在Java中,int占4字节,1字节=8位(1 byte = 8 bit)如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/102...
2022-01-13 20:24:36
229
原创 .git目录过大解决方法
说明:一般仓库文件不大时,我们都可以用这个方法git clone仓库,但问题是有时候,在仓库历史的某次commit时,有人不小心提交了1G的文件,虽然后面的commit中他把这个文件删除了,但是在.git文件夹中仍然存储着这个文件,所以如果我们克隆仓库这个仓库,会把所有的历史协作记录都clone下来,这样整个文件会非常大,其实对于我们直接使用仓库,而不是参与仓库工作的人来说,只要把最近的一次commit给clone下来就好了。这就好比一个产品有很多个版本,我们只要clone最近的一个版本来使用就行了。实现这
2021-11-12 11:54:26
710
转载 PHP从已有安装包(vendor)恢复 composer.json
拿到的一个项目没有 composer.json,不过 /vendor 目录下是完整存在的。对此我们进行恢复。提供两个方式,都需要通过/vendor/composer/installed.json进行恢复。如果不存在则只能手动将所存在的项目逐个取出及对应版本号收集整理。事实上,项目还不是使用默认的vendor目录,而是pkgs,所以可以通过环境变量来指定替代的vendor目录 COMPOSER_VENDOR_DIR=pkgs其一,将上述文件内容所有的包名称及版本号提取出来标准规范写到 compos..
2021-08-26 10:54:46
1299
1
转载 一款好用的Windows端快捷启动工具——Wox Launcher
软件介绍在Windwos下打开程序或文件平常的操作是在菜单或桌面上找到图标,然后点击打开,这无疑很麻烦、很慢,还会使桌面凌乱如果你也不喜欢桌面上满是程序的快捷方式,如果你也不喜欢翻找又臭又长的程序菜单和层层叠叠的文件目录,如果你也喜欢简单干净的桌面,那么你真的需要一款好用的快速启动器软件Wox是一款非常优秀的开源的快速启动工具,作者说灵感源自 Alfred 和 Launchy,用户可以通过高效的键盘操作,使用搜索框快速启动程序、打开文件、搜索网页等,通过插件还可以实现更多功能,如翻译单词、弹出
2021-08-23 10:52:07
1513
原创 Git分支差异文件打包
# 打包前先 git fetch; git pull 本地仓库最新git diff <分支|tag名> --name-only | xargs zip patch.zip
2021-08-16 10:36:33
456
原创 Elasticsearch 初探
单机部署# 下载最新的ES,https://www.elastic.co/cn/downloads/elasticsearchwget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.0-linux-x86_64.tar.gztar zxvf elasticsearch-7.14.0-linux-x86_64.tar.gz -C /opt由于ES是不允许root用户身份启动的,所以还需要单独创建一.
2021-08-06 17:27:10
104
原创 Graylog初探
Graylog架构Graylog组要组成部分有:Graylog nodes:用户操作界面,展示收集的日志数据;同时也是Graylog服务主体,开放不同的端口和inputs,来接受外界传入的的日志数据,本身提供了GELF(graylog extension log format)协议格式的日志数据,同时也支持很多其他的格式,具体可以参考inputs里的内容。更关注CPU能力 Elasticsearch:索引日志数据用户存储和搜索,更关注的是I/O以及内存能力...
2021-08-02 20:06:23
463
转载 Golang 的 协程调度机制
前序正确地认识 G , M , P 三者的关系,能够对协程的调度机制有更深入的理解! 本文将会完整介绍完 go 协程的调度机制,包含:调度对象的主要组成 各对象的关系 与 分工 gorutine 协程是如何被执行的 内核线程 sysmon 对 gorutine 的管理 gorutine 协程中断挂起 与 恢复 GOMAXPROCS 如何影响 go 的并发性能调度器的三个基本对象:Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其
2021-06-09 17:50:21
677
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人