Go 使用consul服务治理 rpc通讯

本篇使用到了RPC通讯 可以看这里
搭建consul集群可以使用这个 docker-compose 一键生成

服务端代码

package main

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	"log"
	"net"
	"net/rpc"
	"strconv"
)

// curl http://127.0.0.1:8501/v1/agent/services
const (
	ConsulAddr   = "127.0.0.1:8501"
	ServerPort   = "1234"
	ServerHost   = "127.0.0.1"
	ServerName   = "arithmetic_server"
	ServerNameID = "arithmetic_server"
)

type Arithmetic int

type Args struct {
	A, B int
}

func (a *Arithmetic) Add(args *Args, reply *int) error {
	fmt.Println("接收到请求信息 :", args)
	*reply = args.A + args.B
	return nil
}

func main() {
	consulRegister()
	defer ConsulDeRegister()

	l, e := net.Listen("tcp", ":"+ServerPort)
	if e != nil {
		log.Fatal("listen error:", e)
	}
	defer l.Close()
	_ = rpc.Register(new(Arithmetic))
	conn, e := l.Accept()
	rpc.ServeConn(conn)
}

// 注册consul
func consulRegister() {
	// 创建连接consul服务配置
	config := api.DefaultConfig()
	config.Address = ConsulAddr
	client, err := api.NewClient(config)
	if err != nil {
		fmt.Println("consul config error : ", err)
	}
	// 创建注册到consul的服务
	registration := new(api.AgentServiceRegistration)
	registration.ID = ServerNameID
	registration.Name = ServerName
	registration.Port, _ = strconv.Atoi(ServerPort)
	registration.Address = ServerHost

	// 注册服务到consul
	err = client.Agent().ServiceRegister(registration)
	if err != nil {
		fmt.Println("consul register error : ", err)
	}
}

// curl -s -X PUT 127.0.0.1:8501/v1/agent/service/deregister/arithmetic_server
func ConsulDeRegister() {
	fmt.Println("ConsulDeRegister")
	// 创建连接consul服务配置
	config := api.DefaultConfig()
	config.Address = ConsulAddr
	client, err := api.NewClient(config)
	if err != nil {
		log.Fatal("consul client error : ", err)
	}
	_ = client.Agent().ServiceDeregister(ServerName)
}

客户端代码

这里有一个坑:发现服务的时候如果使用这个consulClient.Agent().Service只能再注册的consul机器上面发现而无法再集群其他机器发现。。。

参考:https://segmentfault.com/q/1010000039263921

package main

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	"log"
	"net/rpc"
	"strconv"
)

const (
	ConsulAddr   = "127.0.0.1:8504"
	ServerNameID = "arithmetic_server"
)

type Args struct {
	A, B int
}

func main() {
	service := getServer()
	client, err := rpc.Dial("tcp", service.ServiceAddress+":"+strconv.Itoa(service.ServicePort))
	if err != nil {
		log.Fatal("client error:", err)
	}
	args := Args{4, 2}
	var reply int
	err = client.Call("Arithmetic.Add", args, &reply)
	if err != nil {
		log.Fatal("arithmetic error:", err)
	}
	fmt.Println(reply)
}

func getServer() *api.CatalogService {
	config := api.DefaultConfig()
	config.Address = ConsulAddr
	consulClient, err := api.NewClient(config)
	if err != nil {
		panic(err)
	}

	service, _, err := consulClient.Catalog().Service(ServerNameID, "", nil)

	// 获取指定service
	if err != nil {
		panic(err)
	}

	return service[0]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值