05.consul
# 01.consul安装
# 1.1 consul 安装说明
- 下载 consul: https://releases.hashicorp.com/consul/ 从中选择版本下载,得到 zip 压缩包
root@dev:opt# cd /opt
root@dev:opt# wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip
root@dev:opt# unzip consul_1.5.2_linux_amd64.zip
root@dev:opt# mv consul /usr/local/bin/
root@dev:opt# consul -h
1
2
3
4
5
2
3
4
5
# 1.2 consul 常用命令
root@dev:opt# consul agent dev # 开发dev模式启动consul
1
consul agent
-bind=0.0.0.0 指定 consul所在机器的 IP地址。 默认值:0.0.0.0
-http-port=8500 consul 自带一个web访问的默认端口:8500
-client=127.0.0.1 表明哪些机器可以访问consul 。 默认本机。0.0.0.0 所有机器均可访问。
-config-dir=foo 所有主动注册服务的 描述信息
-data-dir=path 储存所有注册过来的srv机器的详细信息。
-dev 开发者模式,直接以默认配置启动 consul
-node=hostname 服务发现的名字。
-rejoin consul 启动的时候,加入到的 consul集群
-server 以服务方式开启consul, 允许其他的consul 连接到开启的 consul上 (形成集群)。如果不加 -server, 表示以 “客户端” 的方式开启。不能被连接。
-ui 可以使用 web 页面 来查看服务发现的详情
# 1.3 测试上述 命令
# 在终端中,键入
root@dev:~# mkdir /etc/consul.d/
root@dev:opt# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=n1 -bind=192.168.56.100 -ui -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0
1
2
3
2
3
启动 Google 浏览器, 测试:
http://192.168.56.100:8500/ui/dc1/services
- 其他常用命令
root@dev:demo# consul members # 查看集群有哪些成员
root@dev:demo# consul info # 查看当前 consul 的 IP 信息
root@dev:demo# consul leave # 优雅的关闭 consul 。—— 不优雅!Ctrl -c
1
2
3
2
3
# 1.4 注册服务到 consul 并查看
- 服务注册web.json文件
root@dev:demo# vim /etc/consul.d/web.json
{
"service": {
"name": "bj38",
"tags": ["it","test"],
"port": 8800,
"check": {
"id": "api",
"name": "xnq test",
"http": "http://192.168.56.100:8800",
"interval": "5s",
"timeout": "1s"
}
}
}
root@dev:consul.d# consul reload # 关闭consul 再重启
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看是否注册成功
root@dev:consul.d# curl -s http://127.0.0.1:8500/v1/catalog/service/bj38 # 使用命令查看是否注册成功
1
# 02.consul使用
# 2.0 启动consul
root@dev:consul.d# consul agent -dev
1
# 2.1 pb/person.proto
root@dev:pb# protoc --go_out=plugins=grpc:./ *.proto
1
syntax = "proto3";
option go_package = "./person";
package pb;
message Person {
string name = 1;
int32 age = 2;
}
// 添加 rpc服务
service hello {
rpc sayHello (Person) returns (Person);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2.2 consul_server.go
package main
import (
"context"
"demo/pb/person"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"net"
)
// 定义类
type Children struct {
}
// 绑定类方法, 实现借口
func (this *Children)SayHello(ctx context.Context, p *person.Person) (*person.Person, error) {
p.Name = "hello " + p.Name
return p, nil
}
func main() {
// 把grpc服务,注册到consul上.
// 1. 初始化consul 配置
consulConfig := api.DefaultConfig()
// 2. 创建 consul 对象
consulClient, err := api.NewClient(consulConfig)
if err != nil {
fmt.Println("api.NewClient err:", err)
return
}
// 3. 告诉consul, 即将注册的服务的配置信息
reg := api.AgentServiceRegistration {
ID:"bj38",
Tags:[]string{"grcp", "consul"},
Name:"grpc And Consul",
Address:"127.0.0.1",
Port:8800,
Check:&api.AgentServiceCheck{
CheckID:"consul grpc test",
TCP:"127.0.0.1:8800",
Timeout:"1s",
Interval:"5s",
},
}
// 4. 注册 grpc 服务到 consul 上
consulClient.Agent().ServiceRegister(®)
//////////////////////以下为 grpc 服务远程调用//////////////////////////////
// 1.初始化 grpc 对象,
grpcServer := grpc.NewServer()
// 2.注册服务
person.RegisterHelloServer(grpcServer, new(Children))
// 3.设置监听, 指定 IP/port
listener, err := net.Listen("tcp", "127.0.0.1:8800")
if err != nil {
fmt.Println("Listen err:", err)
return
}
defer listener.Close()
fmt.Println("服务启动... ")
// 4. 启动服务
grpcServer.Serve(listener)
}
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
64
65
66
67
68
69
70
71
72
73
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
64
65
66
67
68
69
70
71
72
73
# 2.3 consul_client.go
package main
import (
"context"
"demo/pb/person"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"strconv"
)
func main() {
// 初始化 consul 配置
consulConfig := api.DefaultConfig()
// 创建consul对象 -- (可以重新指定 consul 属性: IP/Port , 也可以使用默认)
consulClient, err := api.NewClient(consulConfig)
// 服务发现. 从consuL上, 获取健康的服务
services, _, err := consulClient.Health().Service("grpc And Consul", "grcp", true, nil)
// 简单的负载均衡.
addr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port)
//////////////////////以下为 grpc 服务远程调用//////////////////////////////
// 1. 链接服务
//grpcConn, _ := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure())
// 使用 服务发现consul 上的 IP/port 来与服务建立链接
grpcConn, _ := grpc.Dial(addr, grpc.WithInsecure())
// 2. 初始化 grpc 客户端
grpcClient := person.NewHelloClient(grpcConn)
var person person.Person
person.Name = "Andy"
person.Age = 18
// 3. 调用远程函数
p, err := grpcClient.SayHello(context.TODO(), &person)
fmt.Println(p, err)
}
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
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
# 2.4 consul_deregister.go
package main
import "github.com/hashicorp/consul/api"
func main() {
// 1. 初始化 consul 配置
consuConfig := api.DefaultConfig()
// 2. 创建 consul 对象
consulClient, _ := api.NewClient(consuConfig)
// 3. 注销服务
consulClient.Agent().ServiceDeregister("bj38")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.5 页面查看注册结果
- 查看注册成功
上次更新: 2024/3/13 15:35:10