• golang入门笔记——consul


    什么是micro

    在这里插入图片描述
    github相关包:
    在这里插入图片描述

    服务发现

    在这里插入图片描述
    服务发现也是一个服务

    有服务发现后,client、server工作流程:
    1.每个server启动时,都将自己的IP、port和服务名 注册给“服务发现”
    2.当client向服务发现发起服务请求时,“服务发现”会自动找一个可用的服务,将其IP/port/服务名返回给client
    3.client借助服务发现发现服务,访问server

    服务发现的种类:

    consul:常应用于go-micro中
    mdns:go-micro中默认自带的服务发现
    etcd:k8s内嵌的服务发现
    zookeeker:java中较常用
    在这里插入图片描述

    consul

    在这里插入图片描述
    consul的下载:链接

    consul的启动:consul agent -dev 查看localhost:8500

    consul常用命令
    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页面来查看服务发现的详情

    consul:
    	 members:查看集群中有多少个成员
    	info:查看当前consul的IP信息
    	consul leave:优雅的关闭consul
    
    • 1
    • 2
    • 3
    • 4

    注册服务到consul
    步骤:1.进入配置文件cd /etc/consul.d/
    2.创建json文件。sudo vim web.json
    3.按json的语法,填写服务信息
    在这里插入图片描述
    4.重新启动consul

    添加健康检查:
    在这里插入图片描述

    go语言使用consul

    在这里插入图片描述
    服务端:

    package main
    
    import (
    	"context"
    	"fmt"
    	"github.com/hashicorp/consul/api"
    	"google.golang.org/grpc"
    	"leetcode/pb"
    	"net"
    )
    
    type Children struct {
    }
    
    func (this *Children) SayHello(ctx context.Context, p *pb.Person) (*pb.Person, error) {
    	p.Name = "hello" + p.Name
    
    	return p, nil
    }
    
    func main() {
    	//1.初始化consul配置
    	consulConfig := api.DefaultConfig()
    
    	//2.创建consul对象
    	consulClient, err := api.NewClient(consulConfig)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	//3.在consul上注册服务的配置信息
    	registerService := api.AgentServiceRegistration{
    		ID:      "test",
    		Tags:    []string{"grpc", "consul"},
    		Name:    "Grpc And Consul",
    		Port:    8800,
    		Address: "127.0.0.1",
    		Check: &api.AgentServiceCheck{
    			CheckID:  "consul grpc test",
    			TCP:      "127.0.0.1:8800",
    			Timeout:  "5s",
    			Interval: "5s",
    		},
    	}
    	//4.注册grpc服务到consul上
    	consulClient.Agent().ServiceRegister(&registerService)
    	RPCserver := grpc.NewServer()
    	pb.RegisterHelloServer(RPCserver, new(Children))
    	listener, err := net.Listen("tcp", "127.0.0.1:8800")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer listener.Close()
    	RPCserver.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

    客户端:

    package main
    
    import (
    	"context"
    	"fmt"
    	"github.com/hashicorp/consul/api"
    	"google.golang.org/grpc"
    	"leetcode/pb"
    	"strconv"
    )
    
    func main() {
    	//初始化consul配置
    	consulConfig := api.DefaultConfig()
    	consulClient, err := api.NewClient(consulConfig)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	//服务发现
    	service, _, err := consulClient.Health().Service("Grpc And Consul", "consul", true, nil)
    	//参数:服务名,别名,是否通过健康检查,查询参数
    	//返回值:存储服务的切片,额外查询返回的值,错误信息
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	//获取服务的地址和端口号
    	target := service[0].Service.Address + ":" + strconv.Itoa(service[0].Service.Port)
    	grpcConn, _ := grpc.Dial(target, grpc.WithInsecure())
    	grpcClient := pb.NewHelloClient(grpcConn)
    	var child pb.Person
    	child.Name = "Yogen"
    	child.Age = 18
    	p, _ := grpcClient.SayHello(context.TODO(), &child)
    	fmt.Println(p)
    }
    
    
    • 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

    服务的注销:

    package main
    
    import (
    	"fmt"
    	"github.com/hashicorp/consul/api"
    )
    
    func main() {
    	//初始化consul配置
    	consulConfig := api.DefaultConfig()
    	consulClient, err := api.NewClient(consulConfig)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	consulClient.Agent().ServiceDeregister("test")
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    AI绘画Stable Diffusion XL 可商用模型!写实艺术时尚摄影级真实感大模型推荐(附模型下载)
    ESP8266-Arduino编程实例-LPS22HB绝压传感器驱动
    delete、drop、truncate三兄弟
    Numpy和Pandas简介
    Netty入门——Handler & Pipeline
    微信小程序使用github协作
    pdf转换工具有哪些?试一试这几个方法!
    【区块链实战】如何创建一个带参数的智能合约
    ChatGPT-4o体验demo
    HashMap:Java中的高性能键值对存储
  • 原文地址:https://blog.csdn.net/qq_43716830/article/details/126698340