go-kratos 学习笔记(7) 服务发现服务间通信grpc调用

服务发现

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

创建一个 Discoverer

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

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

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

package dataimport ("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 clientdb          *gorm.DBlog         *log.HelperorderClient 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 dataimport ("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 *Datalog  *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服务的clientclient := r.data.orderClientorder, err := client.CreateOrder(ctx, &orders.CreateOrderRequest{OrderNo: 1,})if err != nil {return nil, err}fmt.Println(order)var results []dal.UserMores := r.data.db.Find(&results)if res.Error != nil {return nil, res.Error}var userDatas []*users.UserDatafor _, 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488556.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

上传文件传参 pc端vue的formData

formData let formData new FormData(); formData.append("file", blob, ref ".png"); //添加参数并且重新命名文件名称 if(ref.toString().indexOf(qrcode) > 0) formData.append(noStbg, true)//添加参数 uploadType(formData, sour…

《人工智能大语言模型技术发展研究报告(2024)》【下载】

《人工智能大语言模型技术发展研究报告(2024)》下载 自2023年起,大模型技术产品的快速迭代和升级,已经成为全球科技竞争的关键因素。由中国软件评测中心发布的《人工智能大语言模型技术发展研究报告(2024)》…

LLM - 理解 Transformer 的位置编码 sin cos 的作用与原理

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140697827 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 模型中的位置编码是关键技术,通过为每个词嵌入向量添加位…

哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet:1.2 TreeSet:1.3 LinkedHashSet:1.4 HashMap:1.5 TreeMap:1.6 LinkedHashMap:1.7 总结 2. c中2.1 std::unordered_set:2.2 std::s…

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日,第13届PostgreSQL中国技术大会在杭州顺利举办,亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上,亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

vue3前端架构---打包配置

最近看到几篇vue3配置项的文章,转载记录一下 Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案-CSDN博客文章浏览阅读2k次,点赞8次,收藏9次。Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页…

【企业级开发模型】Git分支设计模型 | 企业级项目挂历实战_准备工作开发场景实操

目录 3.Git分支设计模型 3.1master分支 3.2release分支 3.3develop分支 3.4feature分支 3.5hotfix分支 4.企业级项目挂历实战_准备工作&开发场景实操学习文档 3.Git分支设计模型 对于我们开发人员来说,对于不同的场景/环境,来设计分支模型。…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

企元数智引领新零售合规分销系统免费送

企元数智近日宣布推出全新的新零售合规分销系统&#xff0c;并免费向企业提供这一创新解决方案。这一举措旨在帮助更多企业实现数字化转型&#xff0c;提高管理效率&#xff0c;促进业务增长。 新零售合规分销系统是企元数智引领的一项全新数字解决方案&#xff0c;涵盖了销售数…

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌&#xff0c;其产品在市场上广受欢迎。然而&#xff0c;有时由于各种原因&#xff0c;我们可能需要强制恢复出厂设置&#xff0c;这往往意味着数据的丢失。那么&#xff0c;如何在华为强制恢复出厂设置后&#xff0c;让数据“重生”呢&#xff1f;本…

通信类IEEE会议——第四届通信技术与信息科技国际学术会议(ICCTIT 2024)

[IEEE 独立出版&#xff0c;中山大学主办&#xff0c;往届均已见刊检索] 第四届通信技术与信息科技国际学术会议&#xff08;ICCTIT 2024&#xff09; 2024 4th International Conference on Communication Technology and Information Technology 重要信息 大会官网&#xf…

ETL数据集成丨将PostgreSQL数据库数据实时同步至PostgreSQL

前言 我们在进行数据集成、实时数据同步中&#xff0c;经常会出现在同一个数据库中做数据同步和复制、实时分析和报告、负载均衡和高可用性等场景&#xff0c;这次我们以PostgreSQL为例&#xff0c;通过ETLCloud工具&#xff0c;进行同数据库中数据实时同步的步骤应该如何设置…

无人机组装与操作实训课程详解

一、课程名称与目标 课程名称&#xff1a;无人机组装与操作实训课程 课程目标&#xff1a;本课程旨在培养学员对无人机组装技术的深入理解和实际操作能力&#xff0c;使学员能够独立完成无人机的组装、调试和日常维护工作&#xff0c;并具备一定的无人机操作能力和安全意识。…

ZStack Cloud 5.1.8正式发布——GPU运维、物理机硬件监控、克隆云主机网络配置三大亮点简析

云轴科技ZStack Cloud云平台是遵循“简单、弹性、健壮、智能”的“4S”特性的私有云和无缝混合云产品。ZStack Cloud 5.1.8版本正式发布&#xff0c;从用户业务场景和实际需求出发&#xff0c;丰富和完善平台功能&#xff0c;推出一系列重要功能和多项改进&#xff0c;覆盖云主…

ElasticSearch(五)— 文本分析与分词

一、文本分析 文本分析( analysis )是在文档被发送并加入倒排索引之前&#xff0c;Elasticsearch 在其主体上进行的操作。在文档被加入索引之前&#xff0c;Elasticsearch 让每个被分析字段经过一系列的处理步骤。 字符过滤–使用字符过滤器转变字符。文本切分为分词—将文本…

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…

HTTP传输下载和P2P传输下载的区别?

HTTP传输下载和P2P&#xff08;Peer-to-Peer&#xff09;传输下载在多个方面存在显著的区别&#xff0c;以下是详细的分析&#xff1a; 1. 工作原理 HTTP传输下载&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web上进行数据通信的协议&…

Linux中为qt添加opencv

一. 安装OpenCV库&#xff1a; 打开终端&#xff0c;输入以下命令安装OpenCV&#xff1a; sudo apt-get update sudo apt-get install libopencv-dev二. 配置Qt项目 在Qt Creator中打开项目&#xff0c;然后编辑.pro文件&#xff0c;添加以下内容&#xff1a; INCLUDEPATH …

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比&#xff08;Peak Signal-to-Noise Ratio&#xff0c;简称PSNR&#xff09;是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量&#xff0c;可以用来评…

PySide(PyQt)使用QPropertyAnimation制作动态界面

主脚本&#xff1a; # encoding: utf-8 import os import sysfrom PySide6.QtCore import QPropertyAnimation, QEasingCurvefrom UIS import *# 主画面类 class MainWindow(QMainWindow, animationButton_ui.Ui_MainWindow):def __init__(self):super().__init__()self.setup…