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

相关内容

热门资讯

五分钟黑科技!aapoker插... 五分钟黑科技!aapoker插件(透明挂黑科技)外挂透明挂辅助下载(2024已更新)(哔哩哔哩)是一...
七分钟指导!德扑之星记牌器(透... 七分钟指导!德扑之星记牌器(透明挂黑科技)外挂透明挂辅助机器人(2020已更新)(哔哩哔哩);德扑之...
4分钟私人局!德扑之星怎么在电... 4分钟私人局!德扑之星怎么在电脑上玩(透明挂黑科技)外挂透明挂辅助安装(2026已更新)(哔哩哔哩)...
六分钟指导!红龙扑克发牌有问题... 六分钟指导!红龙扑克发牌有问题(透明挂黑科技)外挂透明挂辅助智能(2020已更新)(哔哩哔哩);红龙...
五分钟了解!aapoker透明... 五分钟了解!aapoker透明挂是真的吗(透明挂黑科技)外挂透明挂辅助机器人(2025已更新)(哔哩...
8分钟黑科技!AApoker辅... 8分钟黑科技!AApoker辅助工具(透明挂黑科技)外挂透明挂辅助机器人(2020已更新)(哔哩哔哩...
7分钟体悟!wepoke计算辅... 7分钟体悟!wepoke计算辅助(透明挂黑科技)外挂透明挂辅助神器(2020已更新)(哔哩哔哩)相信...
九分钟透视!wpk ai辅助(... 九分钟透视!wpk ai辅助(透明挂黑科技)外挂透明挂辅助智能(2020已更新)(哔哩哔哩);是一款...
七分钟科普!智星德州辅助器(透... 七分钟科普!智星德州辅助器(透明挂黑科技)外挂透明挂辅助神器(2023已更新)(哔哩哔哩)是一款可以...
两分钟普及!wepoke辅助多... 两分钟普及!wepoke辅助多久会检测到(透明挂黑科技)外挂透明挂辅助软件(2022已更新)(哔哩哔...