后端开发
文章平均质量分 89
深度学习
curd_boy
热爱编程,喜欢探索新技术
展开
-
【微服务架构】Protocol Buffer序列化原理解析
通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的功能序列化: 将 数据结构或对象 转换成 二进制串 的过程反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程。原创 2022-11-14 16:19:01 · 2499 阅读 · 0 评论 -
【Kubernetes】K8S下gRPC负载均衡问题
答案是 HTTP/1.1 的 复用是串行的,当请求到达的时候,如果没有空闲连接那么就新创建一个连接,如果有空闲连接那么就可以复用,同一个时间点,连接里最多只能承载一个请求,结果是 HTTP/1.1 可以连接多个 pod;而 HTTP/2 的复用是并行的,当请求到达的时候,如果没有连接那么就创建连接,如果有连接,那么不管其是否空闲都可以复用,同一个时间点,连接里可以承载多个请求,结果是 HTTP/2 仅仅连接了一个 pod。为什么 HTTP/1.1 的复用没问题,而 HTTP/2 的复用就有问题?原创 2022-10-14 20:35:48 · 1593 阅读 · 2 评论 -
【数据库篇】MySQL 事务篇
之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View(读视图) 来实现的。不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。原创 2022-09-20 23:13:26 · 1226 阅读 · 0 评论 -
《后端》开放平台API安全设计
在设计开放平台接口过程中,往往会涉及接口传输安全性相关的问题,加上之前面试中也被问到项目中开放平台的安全相关问题,因此有时间整理下思路,对于接口加密及签名的相关知识做了一个系统性的总结开放平台API接口加密,签名策略参考各大平台策略支付宝支付: appid+ PrivateKey私匙转账+退款:1.RSA2(非对称)公匙加密 2.根证书 3.应用公匙证书func (s *transferAccountService) newClient() *alipay.Client { client, e原创 2022-04-04 00:27:48 · 2753 阅读 · 0 评论 -
【微服务】微服务配置中心
为什么要配置中心?1.配置数据脱敏2.防止出错,微服务数量多起来后,配置多不好管理配置中心nacosconsul、etcd服务配置热更新想要使程序在不重启的前提下更新配置,探索了以下几种方式:信号量触发更新API 手动触发更新监听文件触发更新使用第三方包配置中心主动推送如nacos等信号量触发更新对系统进程调用监听,当接收到 syscal.SIGHUP 或者 syscal.SIGUSR1 信号时,调用 reload () 函数对 config 进行重新读取赋值。核心代码:h原创 2021-12-26 17:24:00 · 841 阅读 · 0 评论 -
【面试】系统架构设计(持续更新)
微博热搜数据设计设计一个限流器,满足100w QPS 的限流。令牌桶。100w的计数器,然后每次请求去获取令牌,拿到就请求,拿不到就丢弃或者等待,等待超时就丢弃。然后面试官问怎么实现?我回答了,然后不满足他的要求,让我继续优化。然后我说在代理层面做,他说不一定能抗住这么大的请求量,你的处理延时怎么处理。然后我说分发在每个服务器上面做,每个服务器限小流,然后如果负载均衡就可以实现整体限流满足要求。......原创 2021-10-29 18:15:05 · 3251 阅读 · 1 评论 -
【后端】设计模式总结
文章目录导读1. 设计模式2. 设计模式的分类3. 面向对象设计模式实现1.单例模式2.简单工厂3.抽象工厂导读1. 设计模式设计模式是对软件设计中普遍存在或反复出向的各种问题所提出的解决方案。每一个设计模式系统地被命名、解释和评价了面向对象系统中一个重要和重复出现的设计。2. 设计模式的分类创建型模式:工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式。隐藏底层模块的逻辑,关注怎么创建对象。结构型模式:适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式。类之间如何协同原创 2021-10-23 12:33:20 · 1167 阅读 · 0 评论 -
【数据库篇】NoSQL数据库
Cassandra高可用性和可扩展的分布式数据库, 它提供了跨云服务提供商、数据中心和地理位置的操作简便性和轻松的复制,并且可以在混合云环境中每秒处理PB级信息和数千个并发操作。高可用性和高可伸缩性是Cassandra最闪亮的特点。没有单点故障(2)数据模型Key Space(对应 SQL 数据库中的 database)一个Key Space中可包含若干个CF,如同SQL数据库中一个database可包含多个table。Key(对应 SQL 数据库中的主键)在Cassandra中,每一行数据记原创 2021-09-21 19:35:10 · 140 阅读 · 0 评论 -
【Go】标准库底层实现 ①
文章目录数据类型引用类型slicemapchannelchannel存在3种状态:context原理panic revover为什么defer才能recoverreflect什么是反射为什么要用反射,(需要反射的 2 个常见场景)defernew make数据类型引用类型slice扩容规则当需要的容量超过原切片容量的两倍时,会使用需要的容量作为新容量。(长度是奇数就+1为容量,是偶数就长度为容量)当原切片长度小于1024时,新切片的容量会直接翻倍。而当原切片的容量大于等于1024时,会反复地原创 2021-08-20 00:49:31 · 1237 阅读 · 1 评论 -
【微服务】分布式一致性算法-Paxos、Raft、ZAB、Gossip
RaftConsul如何通过Raft协议实现强一致性?首先,库存服务注册到Leader Server的时候,会采取Raft协议,要求必须让Leader Server把这条注册数据复制给大部分的Follower Server才算成功。这就保证了,如果你认为自己注册成功了,那么必然是多台Consul Server都有这条注册数据了。如果你刚发送给Leader Server他自己就宕机了,那么这次注册会认为失败。此时,Consul Server集群会重新选举一个Leader Server出来,你需要再次重新注原创 2021-08-07 14:37:13 · 665 阅读 · 0 评论 -
【微服务】RPC和HTTP
文章目录RPCRPC工作模式gRPCgRPC的特性与优缺点1.基于HTTP/22.IDL使用ProtoBuf3.多语言支持HTTP和RPC的优缺点Go语言中的RPC支持与处理grpcprotobuffer 为什么高效Protocol buffers 反序列化RPCRPC(Remote ProcedureCall,远程过程调用) 是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OS原创 2021-08-06 11:13:27 · 5162 阅读 · 0 评论 -
【运维篇】阿里云SLS日志服务
选择project,建立logstore建立了ps-pro配置logtail,接入pod数据日志格式非常多,我们选择docker标准输出配置如下{ "inputs": [ { "detail": { "Stderr": true, "IncludeLabel": { "io.kubernetes.container.name": "you_p原创 2021-07-19 16:02:56 · 4271 阅读 · 2 评论 -
【面试篇】牛客网面试总结
运维etcd 如何保持高可用性只有当集群中多数节点正常的情况下,才可以进行运行时的配置管理。如果集群多数节点损坏,集群就失去了写入数据的能力。官方推荐3,5,7为etcd cluster数目,其中7可以满足大部分情况通常情况下,如果是Follower节点宕机,如果剩余可用节点数量超过半数,集群可以几乎没有影响的正常工作。如果是Leader节点宕机,那么Follower就收不到心跳而超时,发起竞选获得投票,成为新一轮term的Leader,继续为集群提供服务。灾难恢复当集群超过半数的节点都失效时,就原创 2021-05-12 00:08:26 · 1641 阅读 · 2 评论 -
【微服务】Go进阶② 微服务可用性设计
微服务可用性设计隔离隔离,本质上是对系统或资源进行分割,从而实现当系统发生故障时能限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。服务隔离动静分离、读写分离轻重隔离核心、快慢、热点物理隔离线程、进程、集群、机房读写分离:主从、Replicaset、CQRS。核心隔离业务按照 Level 进行资源池划分(L0/L1/L2)。核心/非核心的故障域的差异隔离(机器资源、依赖资源)。多集群,通过冗余资源来提升吞吐和容灾能力。快慢隔离我们可以把原创 2021-04-16 00:20:53 · 1169 阅读 · 0 评论 -
【Go】微服务框架总结
Go-Mirco框架go-zero微服务框架1. zRPC使用参考go-zero 文档查看server注册ETCDCTL_API=3 etcdctl get hello.rpc --prefix显示服务已经注册2. 接口限流 periodlimit2.1 滑动窗口限流接口限流实现 redis + lua而在一个分布式系统中,存在多个微服务提供服务。所以当瞬间的流量同时访问同一个资源,如何让计数器在分布式系统中正常计数?同时在计算资源访问时,可能会涉及多个计算,如何保证计算的原子性?原创 2021-03-07 22:12:52 · 3385 阅读 · 1 评论 -
【Go】Golang runtime调度③
文章目录调度-GMP调度模型1. GMP支撑了 Go 的高并发2. GMP定义3.Goroutine vs OS thread 有什么区别?抢占1.go协程阻塞时如何进行调度?1. 只G阻塞,M,P可用的2. G,M都被阻塞,P可用系统调用(open file) system call2.GO的调度过程:2.5 PMG模型中状态汇总G状态P的状态M的状态如果Goroutine 一直占用资源怎么办,PMG模型怎 么解决的这个问题?1,如果某个M陷入阻塞呢?2,如果有的M较忙,有的M较闲呢?3,如果一个G运行时原创 2021-02-09 10:31:37 · 1131 阅读 · 1 评论 -
操作系统知识点
系统调用什么是系统调用?Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于内核态;而普通的函数调用由函数库或用户自己提供,运行于用户态。随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。为什么要用系统调用?实际上,很多已经被我原创 2021-01-30 00:20:48 · 829 阅读 · 0 评论 -
微服务相关
基于etcd做服务发现和注册开启服务注册开启服务注册只需配置Etcd即可,配置如下:Etcd: Hosts: - 127.0.0.1:2379 Key: hello.rpcHosts为etcd服务节点地址,Key为服务地址对应的key前缀,当服务启动的时候即可自动的进行服务注册...原创 2020-11-25 22:28:56 · 357 阅读 · 0 评论 -
分布式锁的总结(redis)
方法一:使用setnx + set参数,一步搞定://使用set 参数实现分布式锁func DoSet(conn redis.Conn,commandName string, args... interface{}){ lock.Lock() defer lock.Unlock() res,err := conn.Do("set","dirlock","true","EX",10,"NX") if err != nil{ fmt.Println("redi原创 2020-11-10 23:46:57 · 490 阅读 · 0 评论 -
【后端】消息队列--RocketMQ篇
rabbitmqpackage mainimport ( "fmt" "log" "strconv" "github.com/streadway/amqp")func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) }}func main() { conn, err := amqp.Dial("amqp://admin:admin@localhost:原创 2020-09-18 23:29:17 · 1985 阅读 · 1 评论 -
【后端】黑马头条v5.0(Python3-Flask)
12_雪花算法id生成与redis连接的配置import timeimport loggingclass InvalidSystemClock(Exception): """ 时钟回拨异常 """ pass# 64位ID的划分WORKER_ID_BITS = 5DATACENTER_ID_BITS = 5SEQUENCE_BITS = 12# 最大取值计算MAX_WORKER_ID = -1 ^ (-1 << WORKER_ID_BITS原创 2020-09-10 00:56:21 · 1788 阅读 · 8 评论 -
加密策略
PythonGogin_resaurant//用户登录func (ms *MemberService) Login(name string, password string) *model.Member { //1、使用用户名 + 密码 查询用户信息 如果存在用户 直接返回 md := dao.MemberDao{tool.DbEngine} member := md.Query(name, password) if member.Id != 0 { return member }原创 2020-08-14 15:03:36 · 746 阅读 · 0 评论 -
秒杀系统总结
文章目录一、问题二、解决思路1. 高并发Redis集群2. 超卖服务单一职责:一、问题高并发超卖二、解决思路1. 高并发分布式服务Nginx负载均衡、轮询(ip黑名单)分布式服务器(服务单一职责,)Redis 高可用 (集群,主从同步、读写分离,哨兵机制,开启持久化)Mysql高可用(集群、读写分离)静态页面消息队列(MQ,Redis等消息队列)限流 降级前端 : 按钮时间、链接等(后端、秒杀次数Redis缓存库存预热Redis集原创 2020-08-04 22:35:08 · 871 阅读 · 0 评论