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.mzph.cn/diannao/14623.shtml

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

相关文章

【代码随想录 二叉树】二叉树前序、中序、后序遍历的迭代遍历

文章目录 1. 二叉树前序遍历(迭代法)2. 二叉树后序遍历(迭代法)3. 二叉树中序遍历(迭代法) 1. 二叉树前序遍历(迭代法) 题目连接 🍎因为处理顺序和访问顺序是一致的。所…

类和对象的基本概念

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

交换机部分综合实验

实验要求 1.内网IP地址使用172.16.0.0/16 2.sw1和sW2之间互为备份; 3.VRRP/mstp/vlan/eth-trunk均使用; 4.所有pc均通过DHcP获取Ip地址; 5.ISP只配置IP地址; 6.所有电脑可以正常访问IsP路由器环回 实验拓扑 实验思路 1.给交换机创建vlan,并将接口划入vlan 2.在SW1和…

Unity Render Streaming 云渲染 外网访问

初版: 日期:2024.5.20 前言:临时思路整理,后期会详细补充 环境: 1. 阿里云服务器 需要安装好nodejs 、npm 2. windows电脑,需安装好 nodejs 、npm 3.Unity 2021.3.15f1 4.Unity Render Streaming …

乡村振兴的农业供给侧结构性改革:优化农业产业结构,提升农产品质量,满足市场需求,实现美丽乡村产业振兴

一、引言 乡村振兴战略是我国当前及未来一段时间内的重大战略部署,旨在推动农业农村现代化,实现城乡融合发展。在乡村振兴战略中,农业供给侧结构性改革是核心任务之一。通过优化农业产业结构、提升农产品质量、满足市场需求,不仅…

AI巨头争相与Reddit合作:为何一个古老的论坛成为AI训练的“宝藏”?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

debian nginx upsync consul 实现动态负载

1. consul 安装 wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_r…

MariaDB 给指定列值自动加密(持久数据加触发器)

文章目录 代码插入时,自动加密更新时,自动加密查看触发器数据操作示例update数据取出解密取 注意一次尝试,看加密后数据长度 参考链接: 一篇非常好的讲解触发器的文章:示例、原理MySQL/MariaDB触发器。 用触发器自动加…

前端工程化07-常见的包管理工具npm、yarn、cnpm、npx、pnpm

8、包管理工具 8.1、包管理工具概述 npm包管理工具、在安装node的时候这个东西就已经安装过了,通过npm去管理包的时候这个时候回有一个配置文件叫做package.json,他是以json的方式来书写对应的一个配置文件,这个配置文件是可以添加特别多的一些字段的&…

案例题(第二版)

案例题目 信息系统架构设计 基本概念 信息系统架构(ISA)是对某一特定内容里的信息进行统筹、规划、设计、安排等一系列的有机处理的活动。特点如下 架构是对系统的抽象,它通过描述元素、元素的外部可见属性及元素之间的关系来反映这种抽象…

k8s 1.28.10 浏览器访问6443查看api,需要证书

添加证书 使用client-certificate-data和client-key-data生成一个p12文件 1.生成client-certificate-data grep client-certificate-data ~/.kube/config | head -n 1 | awk {print $2} | base64 -d >> kubecfg.crt2.生成client-key-data grep client-key-data ~/.kub…

K8S中YAML案例

目录 案例:自主式创建service并关联上面的pod 案例:部署redis 案例:部署myapp 案例:部署MySQL数据库 总结 1.K8S集群中访问流向 K8S集群外部:客户端——nodeIP:nodeport——通过target port——podIP…

Java入门基础学习笔记44——String

为什么要学习String的处理呢? 开发中,对字符串的处理是非常常见的。 String是什么?可以做什么? java.lang.String 代表字符串。可以用来创建对象封装字符串数据,并对其进行处理。 1、创建对象 2、封装字符串数据 3…

blender 烘焙渲染图片,已经导出fbx,导出贴图。插件生成图片

1.新建一个模型。选择资产浏览器的材质,并拖动到模型身上,如下图。资产浏览器的材质可以网上找。 2.打开着色器面板。正下方着色器窗口中,点击空白取消选择,然后右击-添加-着色器-原理化BSDF,右击-添加-纹理-图像纹理。…

宝塔Linux下安装EMQX服务并设置匿名访问

简述 之前有在Windows和Linux下搭建过EMQX服务并且使用方面都没问题,但那都是使用的用户和密码方式访问,且前提都是通过浏览器进入EMQX的配置页面设置的属性; 但这次使用的是腾讯云租用的宝塔Liniux,由于没有浏览器只能通过命令行方式修改EMQX配置以达到目的;由于事先没看…

【博主推荐】HTML5实现520表白、情人节表白模板源码

文章目录 1.设计来源1.1 表白首页1.2 甜蜜瞬间11.3 甜蜜瞬间21.4 甜蜜瞬间31.5 甜蜜瞬间41.6 甜蜜瞬间51.7 甜蜜瞬间61.8 永久珍藏 2.效果和源码2.1 页面动态效果2.2 页面源代码2.3 源码目录2.4 更多为爱表白源码 3.源码下载地址 作者:xcLeigh 文章地址:…

国内安装Axure RP Extension for Chrome插件

1、到项目的当前目录来 2、后缀改成.rar 3、解压成文件夹 4、拖入chrome中 我这里直接准备好了文件 链接:https://pan.baidu.com/s/1V98tx5LgXZRoKY7XjnIcrA 提取码:gh13

中国上市公司融资约束指数数据上市公司SA指数与WW指数(2000-2023年)

上市公司融资约束指数,是用来评估公司面临的融资限制程度的工具。SA指数由Hadlock和Pierce开发,基于公司规模和年龄计算,其中较小且较年轻的公司通常会有更高的指数值,表明其融资约束较大。另一方面,WW指数由Whited和W…

【静态分析】在springboot使用太阿(Tai-e)03

参考:使用太阿(Tai-e)进行静态代码安全分析(spring-boot篇三) - 先知社区 1. JavaApi 提取 1.1 分析 预期是提取controller提供的对外API,例如下图中的/sqli/jdbc/vuln 先看一下如何用tai-e去获取router…

浅谈分布式系统

目录 一、单机架构二、分布式架构1、应用服务与数据库分离2、负载均衡3、数据库读写分离4、引入缓存5、数据库分库分表6、引入微服务 一、单机架构 单机架构,只有一台服务器,这个服务器负责所有工作。 绝大多数公司的产品,都是这种单机架构。…