go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
创始人
2024-11-11 21:35:53
0
服务发现

Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取

创建一个 Discoverer

        服务间的通信使用的grpc,放到data层,实现的是从uses服务调用orders服务

app/users/internal/data.go 加入 NewDiscovery和 NewOrderServiceClient,需要把新加的2个方法加入到 ProviderSet

需要把新生成的orderClient注入到Data里面 orderClient orders.OrderClient

package data  import ( 	"context" 	"github.com/go-kratos/kratos/contrib/registry/nacos/v2" 	"github.com/go-kratos/kratos/v2/log" 	"github.com/go-kratos/kratos/v2/middleware/recovery" 	"github.com/go-kratos/kratos/v2/registry" 	"github.com/go-kratos/kratos/v2/transport/grpc" 	"github.com/google/wire" 	"github.com/nacos-group/nacos-sdk-go/clients" 	"github.com/nacos-group/nacos-sdk-go/common/constant" 	"github.com/nacos-group/nacos-sdk-go/vo" 	"gorm.io/driver/mysql" 	"gorm.io/gorm" 	"time" 	"xgs_kratos/gen/config/users" 	"xgs_kratos/gen/orders" )  // ProviderSet is data providers. var ProviderSet = wire.NewSet(NewData, NewDiscovery, CreateRegister, NewOrderServiceClient, NewUserRepo)  // Data . type Data struct { 	// TODO wrapped database client 	db          *gorm.DB 	log         *log.Helper 	orderClient orders.OrderClient }  // NewData .  func NewData(c *conf.Data, logger log.Logger, client orders.OrderClient) (*Data, func(), error) { 	cleanup := func() { 		log.NewHelper(logger).Info("closing the data resources") 	} 	db, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{}) 	if err != nil { 		log.Fatalf("failed to connect database: %v", err) 		panic(err) 	} 	return &Data{ 		db:          db, 		log:         log.NewHelper(logger), 		orderClient: client, 	}, cleanup, nil }  // NewDiscovery 服务发现 func NewDiscovery(conf *conf.Data) registry.Discovery { 	sc := []constant.ServerConfig{ 		{ 			IpAddr: conf.Nacos.Addr, 			Port:   conf.Nacos.Port, 		}, 	} 	cc := constant.ClientConfig{ 		NamespaceId: conf.Nacos.NamespaceId, 		TimeoutMs:   5000, 	}  	client, err := clients.NewNamingClient( 		vo.NacosClientParam{ 			ClientConfig:  &cc, 			ServerConfigs: sc, 		}, 	)  	if err != nil { 		panic(err) 	}  	r := nacos.New(client) 	return r }  // NewOrderServiceClient orders 服务客户端 func NewOrderServiceClient(r registry.Discovery) orders.OrderClient { 	conn, err := grpc.DialInsecure( 		context.Background(), 		grpc.WithEndpoint("discovery:///orders-xgs.grpc"), 		grpc.WithDiscovery(r), 		grpc.WithTimeout(time.Second*2), 		grpc.WithMiddleware( 			recovery.Recovery(), 		), 	) 	if err != nil { 		panic(err) 	} 	c := orders.NewOrderClient(conn) 	return c } 

在users下执行 wire

以ListUser方法为例子进行调用

app/users/internal/user.go

package data  import ( 	"context" 	"fmt" 	"github.com/go-kratos/kratos/v2/log" 	"xgs_kratos/app/users/internal/biz" 	"xgs_kratos/app/users/internal/data/dal" 	"xgs_kratos/gen/orders" 	"xgs_kratos/gen/users" )  //data 层处理数据的存储和读取  type userRepo struct { 	data *Data 	log  *log.Helper }  // NewUserRepo . r registry.Discovery, func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo { 	return &userRepo{ 		data: data, 		log:  log.NewHelper(logger), 	} }  // CreateUser 创建用户 func (r *userRepo) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) { 	user := dal.UserMo{ 		Age:   req.Age, 		Name:  req.Name, 		Email: req.Email, 	} 	result := r.data.db.Create(&user) 	if result.Error != nil { 		return nil, result.Error 	} 	return &users.CreateUserReply{ 		Id: user.Id, 	}, nil }  func (r *userRepo) ListUser(ctx context.Context, req *users.ListUserRequest) ([]*users.UserData, error) { 	//获取order服务的client 	client := r.data.orderClient 	order, err := client.CreateOrder(ctx, &orders.CreateOrderRequest{ 		OrderNo: 1, 	})  	if err != nil { 		return nil, err 	} 	fmt.Println(order) 	var results []dal.UserMo 	res := r.data.db.Find(&results) 	if res.Error != nil { 		return nil, res.Error 	}  	var userDatas []*users.UserData 	for _, result := range results { 		userDatas = append(userDatas, &users.UserData{ 			Id:    result.Id, 			Name:  result.Name, 			Age:   result.Age, 			Email: result.Email, 		}) 	} 	return userDatas, nil } 

从新生成一下代码  buf  generate

如果服务是分开部署的,需要拿到对方的存根 proto 执行 kratos proto client xxx.proto生成client

分别启动users和orders 服务是都是注册成功的,由于注册的是http和grpc所有后面拼接的有http和grpc,调用的时候需要拼接上

postman请求看效果

看日志输出 users

再看orders服务的日志输出

 项目的代码  码云 https://gitee.com/gebilaoxie/xgs_kratos.git

相关内容

热门资讯

wepoker底牌透视脚本!w... wepoker底牌透视脚本!wepoker免费脚本(透视)都是是真的有挂(爆料教程)1、完成wepo...
透视黑科技!wepoker辅助... 透视黑科技!wepoker辅助器是真的的吗,aapoker辅助挂,玩家教程(有挂详情);1、许多玩家...
智星菠萝辅助器!wepoker... 智星菠萝辅助器!wepoker一直输的号能继续打吗(透视)本来有挂(玩家教你)1、每一步都需要思考,...
透视ai!wepoker辅助器... 透视ai!wepoker辅助器是真的的吗,wepoker透视脚本苹果,黑科技教程(有挂方法)1)we...
wepoker辅助透视软件!红... wepoker辅助透视软件!红龙poker有辅助吗(透视)其实真的有挂(透明教程)在进入wepoke...
透视挂!wepoker透视脚本... 透视挂!wepoker透视脚本免费,wpk透视脚本链接,大神讲解(有挂攻略)1、每一步都需要思考,不...
wpk透视脚本视频!wepok... wpk透视脚本视频!wepoker辅助脚本(透视)其实是有挂(必胜教程)1、wepoker辅助脚本系...
透视存在!aapoker辅助功... 透视存在!aapoker辅助功能,wpk透视辅助,AI教程(有挂技巧);1、用户打开应用后不用登录就...
德普之星辅助正版!we pok... 德普之星辅助正版!we poker插件(透视)真是有挂(wepoke教程);1、不需要AI权限,帮助...
透视规律!智星德州菠萝插件官网... 透视规律!智星德州菠萝插件官网,wepoker免费永久脚本,AI教程(有挂黑科技);1、任何智星德州...