go-zero 实战(5)

引入Prometheus

用 Prometheus 监控应用

1. 用 docker 启动 Prometheus

编辑配置位置,我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下

prometheus.yaml

global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估间隔scrape_configs:- job_name: 'file_ds'file_sd_configs:- files:- 'targets.json'

由于 prometheus.yaml 文件中,用到了 targets.json 文件,因此,引入 targets.json文件

targets.json

[{"targets":["192.168.10.20:9081"],"labels": {"job": "user-api","app": "user-api","env": "test","instance": "192.168.10.20:8888"}    }
]

我的应用是启动在 宿主机的 8888 端口,因此,我这里写了宿主机的 ip 和端口。
上面的 9081 端口,可以随便写。但是要与应用中的配置一致,看后面配置。

docker run -d --name prometheus --dns=192.168.10.20 -p 9090:9090  -v /opt/prometheus/conf/prometheus.yaml:/etc/prometheus/prometheus.yml  -v /opt/prometheus/conf/targets.json:/etc/prometheus/targets.json quay.io/prometheus/prometheusdocker run -d --name prometheus --network host   -v /opt/prometheus/conf/prometheus.yaml:/etc/prometheus/prometheus.yml  -v /opt/prometheus/conf/targets.json:/etc/prometheus/targets.json quay.io/prometheus/prometheus

下面两条命令都可以启动 Prometheus。

2. 启动应用

修改应用的配置文件 userapi/etc/userapi-api.yaml 文件。

在这里插入图片描述
增加了 Prometheus 配置,端口号与 targets.json 文件中的 targets 条目标识的端口号保持一致。

3.测试

访问 http://192.168.10.20:9090/targets?search=
在这里插入图片描述
这样可以看到 Prometheus 监控了应用。

引入 jaeger

jaeger 是一个用于链路追踪的中间件。

1. docker 启动 jaeger

docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778  -p 16686:16686 -p 14268:14268  -p 14269:14269   -p 9411:9411 jaegertracing/all-in-one:latest

这样启动的 jaeger,数据默认是放在内存中的。可以根据直接的需求,选择将数据放在 elasticsearch或其它存储中。

  • 其中 16686 是 ui 端口,直接访问 http://localhost:16686 便可以进入到 ui 界面
    在这里插入图片描述

2. 修改 userapi/etc/userapi-api.yaml 文件

在配置文件中加入如下配置:

Telemetry:Name: user-apiEndpoint: http://localhost:14268/api/tracesSampler: 1.0Batcher: jaeger

3. 测试

启动 userapi 应用,用postman 访问接口。
在这里插入图片描述
这样就可以在 jaeger 的 ui 上看到访问的接口。

分布式事务

分布式事务也是微服务架构中必不可少的一部分。go-zero 使用了dtm的方案来解决分布式事务问题。

1. 引入 DTM

官网链接

1. github clone 项目

项目地址:https://github.com/dtm-labs/dtm.git

2. 进入项目

创建 conf.yml 配置文件,加入如下配置:

MicroService: # gRPC/HTTP based microservice configDriver: 'dtm-driver-gozero' # name of the driver to handle register/discoverTarget: 'etcd://localhost:2379/dtmservice' # register dtm server to this urlEndPoint: 'localhost:36790'

3. 启动dtm

从源码处启动 dtm

go run main.go -c conf.yml 

在这里插入图片描述

2. 创建表

在当前使用的微服务对应的数据中创建表。我们曾在 go-zero实战(2)中创建过zero-mall数据库。同样在该数据库创建 barrier表。

create table if not exists barrier(id bigint(22) primary key auto_increment,trans_type varchar(45),gid varchar(128),branch_id varchar(128),op varchar(45),barrier_id varchar(45),reason varchar(45),create_time datetime default now(),update_time datetime default now(),key(create_time),key(update_time),unique key(gid, branch_id, op, barrier_id)
);

3. 创建积分服务

1. 在 zero_mall 数据库中 创建 user_score 表

create table user_score(id bigint(0) not null auto_increment,user_id bigint(0) not null,score int(0) not null,primary key(id) using btree
);

2. 创建 user_score.proto 文件

syntax = "proto3";package userscore;option go_package = "./score";message UserScoreRequest {int64 userId = 1;int32 score = 2;
}message UserScoreResponse {int64 userId = 1;int32 score = 2;
}service UserScore {rpc saveScore(UserScoreRequest) returns(UserScoreResponse);rpc saveScoreCallback(UserScoreRequest) returns(UserScoreResponse);
}

为了使用 dmt 实现的分布式事务,saveScore 方法,需要有一个相应的 Callback 方法。为了在发生异常回滚时,执行该方法。

3. 生成代码

goctl rpc protoc user_score.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.

4. 整理代码

  1. 将 生成的 user_score.pb.go 文件和 user_score_grpc.pb.go 文件放入 rpc-common 工程的score目录下。
  2. 将 userscore.go 文件放入 rpc-common 工程的 userscore 目录下。
  3. 在user-score 创建 go.mod 文件,如下:
    module user-scorego 1.22.2
    
  4. 在 mall 工程下,执行如下命令:
    go work use user-score  # 加入 workspace
    go mod tidy             # 下载依赖
    
  5. 在 user-score 创建 database 目录,并增加 sqlx.go 文件,参考 go-zero 实战(3)
  6. 将user 微服务 user/internal 目录下的 dao、repo、model三个目录复制一份到 user-score 微服务的 user-score/internal 目录下并做相应的命名修改。
  7. 修改 user-score/etc/userscore.yaml 文件
    Name: score.rpc
    ListenOn: 127.0.0.1:8081
    Etcd:Hosts:- 127.0.0.1:2379Key: score.rpc
    Mysql:Datasource: root:thinker@tcp(127.0.0.1:3306)/zero_mall?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghaiCacheRedis:- Host: 127.0.0.1:6379Pass: thinkerType: node
    
  8. 修改 user-score/internal/svc/servicecontext.go 文件,加入 UserScoreRepo
  9. 修改生成的 savescorelogic.go 和 savescorecallbacklogic.go 文件

到此,积分服务创建完成。

4. 在 userapi 中调用积分服务

1. 修改 userapi/etc/userapi-api.yaml 文件

加入 user-score 微服务的 rpc 配置

UserScoreRpc:Etcd:Hosts:- 127.0.0.1:2379Key: score.rpc

2. 修改 userapi/intrenal/config/config.go 文件

在这里加入 user-score 微服务的 rpc。
在这里插入图片描述

3. 在 userapi/internal/svc/servicecontext.go 文件为上一步增加的变量赋值

在这里插入图片描述

因为userapi 是作为 rpc 客户端,而 user-score 微服务是 rpc 服务端。并且这两个服务都会用到公共的部分,于是,将公共部分抽取到 rpc-common 下。这样,userapi 微服务不会用到 user-score 微服务下的代码。

4. 修改 userapi/internal/logic/userapilogic.go 文件

我们修改了 Register 接口,增加调用 user-score 微服务的代码。

到此,算是正常走通了。在 userapi 微服务下,注册功能实现时,同时调用了 user服务和 user-score 服务。

5. 测试

在这里插入图片描述

代码,这部分代码提交到了 score 分支。

6. 使用 DTM

在上面的注册功能里,从userapi 远程调用了 user 和 user-score 两个服务。试想,如果有一个微服务调用错误,显然不会影响到另一个。我们引入分布式事务,就为了解决在注册成功后,用户能够增加积分。如果积分增加失败的情况下,也要保证注册不成功。

1. 在项目中导入 dtm

分别在 /mall/userapi、/mall/user、/mall/user-score 下执行命令:

go get github.com/dtm-labs/dtm

2. 项目中加入dtm 驱动

  1. 修改 userapi/internal/logic/userapilogic.go 文件
    加入驱动

    	_ "github.com/dtm-labs/dtmdriver-gozero"// 这里的地址在文章 分布式事务 1.2 这个步骤,修改配置文件时候,指定的地址// 先上看 1.2 步骤可以找到var dtmServer = "etcd://localhost:2379/dtmservice" 
    

3. 修改 userapi/internal/userapilogic.go 文件

修改 Register 方法的逻辑,引入 dtm

func (l *UserLogic) Register(req *types.Request) (resp *types.Response, err error) {gid := dtmgrpc.MustGenGid(dtmServer)sagaGrpc := dtmgrpc.NewSagaGrpc(dtmServer, gid)userServer, err := l.svcCtx.Config.UserRpc.BuildTarget()if err != nil {return nil, err}userScoreServer, err := l.svcCtx.Config.UserScoreRpc.BuildTarget()if err != nil {return nil, err}userReq := &user.UserRequest{Id:     req.Id,Name:   req.Name,Gender: req.Gender,}// call save methodsagaGrpc.Add(userServer+"/user.User/save", userServer+"/user.User/saveCallback", userReq)// 这个地方,应该是传入一个User,因为远程调用拿不到返回值。暂且先写死,为了测试效果。userScoreReq := &score.UserScoreRequest{UserId: req.Id,Score:  10,}sagaGrpc.Add(userScoreServer+"/userscore.UserScore/saveScore", userScoreServer+"/userscore.UserScore/saveScoreCallback", userScoreReq)sagaGrpc.WaitResult = trueerr = sagaGrpc.Submit()if err != nil {fmt.Println("---------------------------")fmt.Println(err)return nil, err}//fmt.Sprintf("register add score %d \n", userScore.Score)return &types.Response{Message: "success",Data:    "",}, nil
}

核心代码,就是将原来直接的rpc 调用,委托给 dtm 调用。

4. 修改服务端

  1. 修改 user-score/internal/logic/savescorelogic.go 文件
    引入 dtm
  2. 修改 user/internal/logic/userlogic.go 文件

5. 测试

在这里插入图片描述

指定id,插入用于,测试成功。

6. 测试事务

现在模拟 user-score 服务的逻辑出现了问题。检查事务是否生效。

在这里插入图片描述
我们用 postman测试后,发现, user 表中插入了新的数据,但是积分表中是没有新数据的。那是否事务没有生效呢?
在这里插入图片描述
当从后台打印的日志可以看出,saveCallback 方法被调用。

这里需要明白一点。

userapi/internal/logic/userapilogic.go 代码逻辑如下:

在这里插入图片描述
代码提交到了 dtm 分支。代码

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络拓扑—DHCP服务配置

文章目录 DHCP服务搭建相关配置细节前提安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统:Windows Server 2003 IP网段:10.0.0.0/24 三台机子: 普通PC机 DHCP服务器 路由器(两块网卡,连接内外网) //注…

中国主要城市房价指数数据集(2011-2024)

数据来源:东方财富网 时间跨度:2011年1月 - 2024年4月 数据范围:中国主要城市 包含指标: 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

get和post的区别,二者是幂等的吗?

一、什么是幂等 所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同的副作用。 维基百科定义:幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执…

Docker(四) 文件和网络

1 Dockerfile 1.1 什么是Dockerfile Dockerfile是一个文本文件,包含一系列命令,这些命令用于在 Docker 镜像中自动执行操作。Dockerfile 定义了如何构建 Docker 镜像的步骤和所需的操作。 Dockerfile 中包含的命令可以设置和定制容器的环境,…

优于InstantID!中山大学提出ConsistentID:可以仅使用单个图像根据文本提示生成不同的个性化ID图像

给定一些输入ID的图像,ConsistentID可以仅使用单个图像根据文本提示生成不同的个性化ID图像。效果看起来也是非常不错。 相关链接 Code:https://github.com/JackAILab/ConsistentID Paper:https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

一文带你入门ini格式

引入: 以蜂鸣器为例,每次我们增加新的设备, 都需要添加两个新文件: 修改程序代码,手动添加: 缺点: 不利于维护 设备类节点直接通过ini文件配置 什么是.ini文件 ini文件通常以纯文本形式存在,并且包含了一个或多个节(se…

java技术:spring-secrity实现认证、授权

目录 一、依赖 二、逻辑图 三、代码设计 1、WebSecurityConfigurerAdapter的实现类 2、设计登录接口 config配置: 1)UserDetailsService实现类重写: 2)书写登录实现类(调用authenticationManager、可以与后面的…

重新夺回控制权!原创始人从Synk回购FossID,致力于解决开源许可合规风险

FossID 于 2022 年 9 月被其原始创始人从 Snyk, Inc. 重新收购。为什么 Snyk 在 2021 年收购了 FossID,又在 2022 年将其分拆,以及为什么 FossID 的创始人(Oskar Swirtun 和 Jon Aldama)后来又回购了该公司? 公司背景 …

类和对象的基本概念

类和对象的基本概念 C和C中struct区别类的封装封装访问权限总结struct和class的区别 将成员变量设置为private C和C中struct区别 C语言struct只有变量C语言struct 既有变量,也有函数 类的封装 封装 把变量(属性)和函数(操作&a…

Undet for SketchUp 2023.3 点云建模软件 支持支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描,对AEC行业用户来说,真正需要的是如何将这些数据快速处理为三维模型,这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…

Go源码--sync库(1)sync.Once和

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换: pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换: 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

表现层框架设计之表现层设计模式_3.MVVM模式

1.MVVM模式 MVVM模式正是为解决MVP中UI种类变多,接口也会不断增加的问题而提出的。 MVVM模式全称是模型-视图-视图模型(Model-View-ViewModel),它和MVC、MVP类似,主要目的都是为了实现视图和模型的分离,不…

Flink 生态对 Confluent / Kafka Schema Registry 支持情况的研究报告

文章目录 1. Flink CDC 对 Confluent Schema Registry 的支持情况2. Confluent Avro Format 对 Confluent Schema Registry 的支持情况3. 关键性结论 这几年,在流式链路上引入一个 Schema Registry 变得越来越流行,也越来越有必要, Schema Re…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…

舵机(结构,原理,控制方法)

介绍 舵机,全称为伺服马达(Servo Motor),是一种能够精确控制角度或位置的电动机。它广泛应用于模型制作、机器人技术、工业自动化等领域。舵机通过接收控制信号,将其转化为机械运动,从而实现精确的控制。 …

211初试自命题复试线仅302分!延边大学计算机考研考情分析!

延边大学(Yanbian University),简称“延大”,地处吉林省延边朝鲜族自治州,是国家“双一流”建设高校、国家“211工程”重点建设大学、西部开发重点建设院校、吉林省人民政府和教育部共同重点支持建设大学、吉林省人民政…

pcd点云江湖之处处碰壁:点云文件pcd加载02

江湖好汉,休走,废了半天力气把threejs自带的代码搬迁到自己项目中了,高高兴兴给领导看。领导一句话,顿时无奈:领导曰:点云单色太丑,能不能按照分类展示? 一句话难道英雄好汉&#xf…

IT廉连看——UniApp——事件绑定

IT廉连看——UniApp——事件绑定 这是我们上节课最终的样式; 一、现在我有这样一个需求,当我点击“生在国旗下,长在春风里”它的颜色由红色变为蓝色,该怎么操作? 这时候我们需要一个事件的绑定,绑定一个单…