熔断(hystrix-go)
一、服务熔断 介绍
1.1 有什么用
服务熔断是指调用方访问服务时,通过熔断器做代理来进行访问,熔断器会持续观察服务返回的成功、失败的状态,当失败次数超过设置的阙值时,熔断器断开,请求就不能访问到下游服务了。
作用:
当所依赖的服务不稳定时,能够起到快速失败的目的
快速失败后,能够用一定的算法动态探测所依赖对象是否恢复
具体场景
如一个微服务化的产品线上,每一个服务都专注于自己的业务,并对外提供相应的服务接口,或者依赖于外部服务的某个逻辑接口,就像下面这样。
假设我们当前是 服务A,有部分逻辑依赖于 服务C,服务C 又依赖于 服务E, 当前微服务之间进行 rpc 或者 http 通信,假设此时 服务C 调用 服务E 失败,比如由于网络波动导致超时或者服务E 由于过载,服务E 已经 down 掉了。
调用失败,一般会有失败重试等机制。但是再想想,假设服务E 已然不可用的情况下,此时新的调用不断产生,同时伴随着调用等待和失败重试,会导致 服务C 对服务E 的调用而产生大量的积压,慢慢会耗尽服务C 的资源,进而导致服务C 也 down 掉,这样恶性循环下,会影响到整个微 ...
golang并发模型
生产者消费者模型
源码
123456789101112131415161718192021222324252627282930313233package mainimport ( "fmt" "time")const ( consumerCount = 10)func producer(ch chan<- string, something string) { ch <- something}func consumers(ch <-chan string) { for i := 0; i < consumerCount; i++ { go func(i int) { for something := range ch { fmt.Println(i, something) } }(i) } ...
viper
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。
一、安装
1go get github.com/spf13/viper
二、介绍
2.1 什么是Viper?
Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:
设置默认值
从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
实时监控和重新读取配置文件(可选)
从环境变量中读取
从远程配置系统(etcd或Consul)读取并监控配置变化
从命令行参数读取配置
从buffer读取配置
显式配置值
2.2 为什么选择Viper?
在构建现代应用程序时,你无需担心配置文件格式;你想要专注于构建出色的软件。Viper的出现就是为了在这方面帮助你的。
Viper能够为你执行下列操作:
查找、加载和反序列化JSON、TOML、YAML、HCL、INI、envfile和Java ...
golang日志库 —— zap
摘抄自:https://www.cnblogs.com/jiujuan/p/17304844.html
一、介绍
zap的特性
高性能:zap 对日志输出进行了多项优化以提高它的性能
日志分级:有 Debug,Info,Warn,Error,DPanic,Panic,Fatal 等
日志记录结构化:日志内容记录是结构化的,比如 json 格式输出
自定义格式:用户可以自定义输出的日志格式
自定义公共字段:用户可以自定义公共字段,大家输出的日志内容就共同拥有了这些字段
调试:可以打印文件名、函数名、行号、日志时间等,便于调试程序
自定义调用栈级别:可以根据日志级别输出它的调用栈信息
Namespace:日志命名空间。定义命名空间后,所有日志内容就在这个命名空间下。命名空间相当于一个文件夹
支持 hook 操作
做了哪些优化
基于反射的序列化和字符串格式化,它们都是 CPU 密集型计算且分配很多小的内存。具体到 Go 语言中,使用 encoding/json 和 fmt.Fprintf 格式化 interface{} 会使程序性能降低。
Zap 咋解决呢?Zap 使用一个无反射、 ...
consul
摘抄:https://cloud.tencent.com/developer/article/1444664
一、什么是服务发现
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
图中,客户端的一个接口,需要调用服务A, B, …, N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:
需要配置N个服务的网络位置,加大配置的复杂性
服务的网络位置变化,都需要改变每个调用者的配置
集群的情况下,难以做负载(反向代理的方式除外)
总结起来一句话:服务多了,配置很麻烦,问题多多
既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图
与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A, B, …, N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定 ...
golang注意事项
channel
如果channel关闭后,再操作会怎么样?
查看解析 当一个 channel 被关闭后,再从中取值会有特定的行为。下面是关闭 channel 后的行为总结:
1、关闭后的读取行为
从已关闭的 channel 读取数据:
如果 channel 中还有未取出的数据,可以继续读取这些数据。
一旦 channel 中的数据被取完,再次读取时,将返回该类型的零值,并且读取操作不会阻塞。
例如,如果 channel 类型是 int,则会返回 0;如果是 string,则返回 ""(空字符串)。
检测 channel 是否已关闭:
在接收值时,可以通过第二个返回值来判断 channel 是否已关闭。当 channel 被关闭并且所有数据已经取完时,第二个返回值为 false。
1v, ok := <-ch
v 是接收到的值。
ok 是一个布尔值,当 ok == false 时,表示 channel 已经关闭且没有更多的数据可接收。
2、关闭后的发送行为
向已关闭的 channel 发送数据:
如果你尝试向一个已关闭的 c ...
golang密码学
文档链接
文档链接2
视频链接
一、密码
1.1 发送者、接收者和窃听者
请想象一个Alice向Bob发送电子邮件的场景。在这个场景中,发出邮件的Alice称为 发送者(sender) ,而收到邮件的Bob则称为 接收者(receiver) 。
在讲解发送者、接收者的概念时,用邮件这个例子会比较便于理解,但实际上发送者和接收者这两个术语的使用范围并不仅仅局限于邮件。当某个人向另一个人发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者。另外,被发送的信息有时也统称为 消息(message) 。
Alice向Bob发送邮件:
邮件是通过互联网从Alice的计算机发送到Bob的计算机的。在发送邮件时,邮件会经过许多台计算机和通信设备进行中转,在这个过程中,就存在被恶意窃听者(eavesdropper)偷看到的可能性。
Eve(窃听者)看到邮件的内容
窃听者Eve并不一定是人类,有可能是安装在通信设备上的某种窃听器,也可能是安装在邮件软件和邮件服务器上的某些程序。
尽管邮件内容原本应该只有发送者和接收者两个人知道,但如果不采取相应的对策,就存在被第三方知道的风险。
...
Go‘s 数据结构
教程
Go实现栈与队列
一、链表
单链表:
1234type LinkNode struct { val int next *LinkNode }
循环链表:
1234type Ring struct { next, prev *Ring // 前驱和后驱节点 Value interface{} // 数据}
初始化循环链表:
123456// 初始化空的循环链表,前驱和后驱都指向自己,因为是循环的func (r *Ring) init() *Ring { r.next = r r.prev = r return r}
数组实现链表:【静态链表】
12345678910111213141516171819type Value struct { Data string NextIndex int64}var array [5]Value // 五个节点的数组array[0] = Va ...
mysql
学习资源:
黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili 29:57:49
高频 SQL 50 题(基础版) - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
基础篇
1. 概述
相关概念
名称
全称
简称
数据库
存储数据的仓库,数据是有组织的进行存储
DataBase(DB)
数据库管理系统
操纵和管理数据库的大型软件
DataBase Management System (DBMS)
SQL
操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
Structured Query Language (SQL)
而目前主流的关系型数据库管理系统的市场占有率排名如下(2022):
Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。
MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。目前Oracle推出了收费版本的MySQL,也提供了免费的社区版本。
SQL Server:Mic ...
C++笔记
万能头:
1#include<bits/stdc++.h>
C++基础知识
1. 常量
在C++中,常量是使用关键字const声明的,意味着一旦被赋值后,它的值就不能被改变。常量提供了一种保护变量不被无意或有意修改的方式,有助于提高程序的可读性和维护性。以下是一些关于C++常量的关键点:
基本常量
使用const关键字创建常量。
必须在声明时初始化。
1const int MAX_USERS = 100;
枚举常量
枚举(Enumeration)是一种用户定义的类型,它包含一组命名的整型常量。
使用enum关键字声明。
1enum Color { RED, GREEN, BLUE };
宏常量
使用预处理器指令#define来定义。
宏在编译之前被处理,替换文本中所有的宏名称。
1#define PI 3.14159
字面量常量
直接出现在代码中的值,如整数10,浮点数3.14,字符'A',字符串"Hello"。
为什么字面量常量是常量? 字面量常量是常量,因为它们表示固定的值,不能被修改 ...