【RPC】熔断机制
当客户端发来的请求连续多次失败后,为了减轻服务端的压力,引入了熔断器
熔断器有三种状态
- 打开——没有请求能通过
- 关闭——所有请求都能通过
- 半开——请求可以通过,但要跟踪响应状态来判断服务器此时的状态用以作为是否变更熔断器状态的依据
执行逻辑:
当有连续到来的请求响应失败后,熔断器打开
经过一段时间冷却后,熔断器恢复到半开状态
半开状态下的熔断器依据请求处理的结果来决定变更为哪种状态
放行通过的请求要继续跟踪执行结果,根据执行结果对熔断器中的计数器进行修改
【JUnit】异常测试
测试是否有异常抛出
测试_有异常
1 | package JUnit; |
测试结果
测试_无异常
1 | package JUnit; |
测试结果
【JUnit】单元测试
- Before注解
:在标有@Test注解的方法执行前先执行,每一个测试方法的执行都会执行一遍Before注解所在的方法
- After注解
: 在标有@Test注解的方法执行后再执行,每一个测试方法执行完都会执行一遍After注解所在的方法
- Test注解
: 表明该方法为测试方法,可以直接启动,不用通过main()函数入口启动
- BeforeClass注解
: 在测试类加载完,所有方法执行前执行,由于该注解只能存在于静态方法上,所以只执行一次
- AfterClass注解
: 在所有方法执行完毕后执行,由于该注解只能存在于静态方法上,所以只执行一次
测试代码
1 | package JUnit; |
测试结果:
【Go】new和make
- new是返回一个指向新分配了内存空间并初始化为零值的对象的指针
- make是返回一个新分配了内存并初始化的对象
1 | package main |
【Go】Modules
先通过go env命令查看相关变量的值
1
go env
设置GO111MODULE
1
go env -w GO111MODULE=on // 启用gomodule
设置GOPROXY
1
go env -w GOPROXY=https://goproxy.cn,direct // 使用国内代理
在GOPRIVATE中设置私有库地址
1
go env -w GOPRIVATE=XXX
【Go】json
注意点:变量命名时大小写问题!
- 编码:struct ==》json
- 解码:json ==》 struct
1 | package main |
测试结果
【Go】interface
golang中的interface类型本质上是指针
实现多态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64package main
import "fmt"
// interface本质是一个指针
type Animal interface {
Sleep()
GetType() string
GetColor() string
}
// Cat、Dog 子类实现接口中的全部方法
type Cat struct {
Type string
Color string
}
type Dog struct {
Type string
Color string
}
func (this *Cat) Sleep() {
fmt.Println("Cat is sleeping")
}
func (this *Dog) Sleep() {
fmt.Println("Dog is sleeping")
}
func (this *Cat) GetType() string {
return this.Type
}
func (this *Dog) GetType() string {
return this.Type
}
func (this *Cat) GetColor() string {
return this.Color
}
func (this *Dog) GetColor() string {
return this.Color
}
// 多态-》父类变量(指针)指向子类变量(引用)
func ShowAnimal(animal Animal) {
animal.Sleep()
fmt.Println("Type: ", animal.GetType())
fmt.Println("Color: ", animal.GetColor())
}
func main() {
// 子类对象
cat := Cat{
Type: "Cat",
Color: "White",
}
dog := Dog{
Type: "Dog",
Color: "Yellow",
}
//
ShowAnimal(&cat)
ShowAnimal(&dog)
}测试结果
万能接口interface{},所有基本数据类型包括struct都实现了它(类似Java中的Object),因此可以用来接参并实现反射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package main
import "fmt"
// 空接口也称为万能接口,基本数据类型如int、string、float、struct等都实现了它
func myFunc(arg interface{}) {
fmt.Println("myFunc is used...")
fmt.Println("arg is ", arg)
// 断言机制
value, ok := arg.(int) // 判断接到的参数类型是否为int
if ok {
fmt.Println("arg type is int and", "value is ", value)
} else {
fmt.Println("arg is not int and", "value is ", value)
}
}
type Man struct {
name string
}
func main() {
// 引用任意数据类型
myFunc(1)
myFunc("111")
myFunc("1.11")
myFunc(Man{"cx"})
}测试结果