什么是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

注册服务到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)
}

客户端:

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)
}

服务的注销:

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")
}

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐