设为首页 加入收藏

TOP

实现etcd服务注册与发现(五)
2023-07-23 13:28:58 】 浏览:101
Tags:实现 etcd
e.proto

课件服务入口

package main

import (
	"context"
	"fmt"
	"go-demo/etcd/common"
	"go-demo/etcd/rpc/courseware"
	"go-demo/etcd/server"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"net"
	"os"
	"strings"
	"time"
)

var Port string

type service struct {
	courseware.UnsafeCoursewareServer
}

func (s *service) Get(ctx context.Context, req *courseware.GetRequest) (res *courseware.GetResponse, err error) {
	fmt.Println("获取课件详情 port:", Port, " time:", time.Now())
	return &courseware.GetResponse{
		Id:   1,
		Code: "HD4544",
		Name: "多媒体课件",
		Type: 4,
	}, nil
}
func main() {
	args := os.Args[1:]
	if len(args) == 0 {
		panic("缺少port参数:port=8400")
	}
	for _, arg := range args {
		ports := strings.Split(arg, "=")
		if len(ports) < 2 || ports[0] != "port" {
			panic("port参数格式错误:port=8400")
		}
		Port = ports[1]
	}
	listen, err := net.Listen("tcp", ":"+Port)
	if err != nil {
		fmt.Println("failed to listen", err)
		return
	}
	s := grpc.NewServer()
	courseware.RegisterCoursewareServer(s, &service{})

	reflection.Register(s)

  // 注册到etcd
	newService, err := server.NewService(server.ServiceInfo{
		Name: common.CoursewareRpc,
		Ip:   "127.0.0.1:" + Port,
	}, common.Endpoints)
	if err != nil {
		fmt.Println("添加到etcd失败:", err)
		return
	}

	go func() {
		err = newService.Start(context.Background())
		if err != nil {
			fmt.Println("开启服务注册失败:", err)
		}
	}()

	if err = s.Serve(listen); err != nil {
		fmt.Println("开启rpc服务失败:", err)
	}
}

5、api服务

package main

import (
	"context"
	"fmt"
	"go-demo/etcd/common"
	"go-demo/etcd/rpc/courseware"
	"go-demo/etcd/server"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/resolver"
	"time"
)

func main() {
	d := server.NewDiscovery(common.Endpoints, common.CoursewareRpc)
	resolver.Register(d)

	for {
		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    // 通过etcd注册中心和grpc服务建立连接
		conn, err := grpc.DialContext(ctx,
			fmt.Sprintf(d.Scheme()+":///"+common.CoursewareRpc),
			grpc.WithTransportCredentials(insecure.NewCredentials()),
			grpc.WithDefaultServiceConfig(`{"loadBalancingConfig": [{"round_robin":{}}]}`),
			grpc.WithBlock(),
		)
		if err != nil {
			fmt.Println("和rpc建立连接失败:", err)
			return
		}

		client := courseware.NewCoursewareClient(conn)
		get, err := client.Get(ctx, &courseware.GetRequest{Id: 1})
		if err != nil {
			fmt.Println("获取课件失败:", err)
			return
		}

		fmt.Println(get)

		time.Sleep(3 * time.Second)
		cancel()
	}

}

6、测试

开启3个服务,可以看到客户端通过负载均衡随机到一个服务请求

go run main.go port=8400
获取课件详情 port: 8400  time: 2022-08-25 18:47:43.784942 +0800 CST m=+78.228450885
获取课件详情 port: 8400  time: 2022-08-25 18:47:52.925858 +0800 CST m=+87.369721731
获取课件详情 port: 8400  time: 2022-08-25 18:48:02.001177
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇垃圾回收 下一篇go-zero docker-compose搭建课件..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目