Go微服务: Gin框架搭建网关, 接入熔断器,链路追踪以及服务端接入限流和链路追踪

基于Go-Gin实现网关 基于go实现简单网关 阅读详情
AI摘要

本文详细描述了如何使用Gin框架搭建一个微服务网关,实现对购物车服务的RPC调用,并集成了熔断、限流和链路追踪功能,包括目录结构、核心代码和配置管理。

概述

  • 本文使用最简单和快速的方式基于Gin框架搭建一个微服务的网关调用微服务的场景
  • 网关作为客户端基于RPC调用某一服务端的服务并接入熔断和限流以及链路追踪
  • 具体场景:通过网关API查询购物车里的数据
  • 在最后,会贴上网关和购物车服务的代码仓库

服务端搭建


1 )目录结构

cart
├── domain
│      ├── model
│      │     └── cart.go
│      ├── repository
│      │     └── cart_repository.go
│      ├── service
│      │     └── cart_data_service.go
├── handler
│      └── cart.go
├── proto
│      ├── cart
│            ├── cart.proto
│            ├── cart.pb.go                  # 待生成
│            └── cart.pb.micro.go            # 待生成
├── go.mod
├── main.go
└── Makefile
  • 可以看到这是基于领域模型搭建的框架,默认是通过 go-micro生成的模板,之后进行修改的
  • proto 下的 pb.go 和 pb.micro.go 是通过 Makefile 中配置的 protoc 命令生成的
    • $ protoc --proto_path=. --micro_out=. --go_out=:. proto/cart/*.proto

2 ) 核心 main.go

package main

import (
	"fmt"
	"log"
	"strconv"

	"github.com/go-micro/plugins/v4/registry/consul"
	opentracingTool "github.com/go-micro/plugins/v4/wrapper/trace/opentracing"

	"github.com/go-micro/plugins/v4/wrapper/ratelimiter/ratelimit"
	jujuratelimit "github.com/juju/ratelimit"

	"github.com/opentracing/opentracing-go"
	"go-micro.dev/v4"
	"go-micro.dev/v4/registry"

	"gitee.com/go-micro-services/cart/domain/repository"
	"gitee.com/go-micro-services/cart/domain/service"
	"gitee.com/go-micro-services/cart/handler"
	pbcart "gitee.com/go-micro-services/cart/proto/cart"
	"gitee.com/go-micro-services/common"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var (
	serviceName     = "go.micro.service.cart"
	version         = "latest"
	host            = "127.0.0.1"
	port            = 8500
	address         = host + ":" + strconv.Itoa(port)
	mysqlConfigPath = "/micro/config/mysql"
)

func main() {
	// 1. 指定注册中心
	consulReg := consul.NewRegistry(
		registry.Addrs(address),
	)

	// 2. 从配置中心获取mysql配置并创建处理
	mysqlConfig, consulConfigErr := common.GetConsulMysqlConfig(address, mysqlConfigPath)
	if consulConfigErr != nil {
		log.Fatal(consulConfigErr)
	}
	mysqlUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", mysqlConfig.User, mysqlConfig.Pwd, mysqlConfig.Host, mysqlConfig.Port, mysqlConfig.Database)
	db, dbErr := gorm.Open("mysql", mysqlUrl)
	if dbErr != nil {
		log.Fatal(dbErr)
	}
	defer db.Close()

	rp := repository.NewCartRepository(db)
	// 数据库表初始化,只执行一次, 如果本来就设计好了,则无需下面
	// rp.InitTable()
	// db.SingularTable(false) // true 则 表就是单数

	// 3. 链路追踪配置
	tracer, closer, tracerErr := common.NewTracer("go.micro.service.cart", "localhost:6831")
	if tracerErr != nil {
		log.Fatal(tracerErr)
	}
	defer closer.Close()
	opentracing.SetGlobalTracer(tracer)

	// 4. 创建服务实例
	cartDataService := service.NewCartDataService(rp)

	// 5. 创建服务和初始化
	srv := micro.NewService()
	srv.Init(
		micro.Name(serviceName),
		micro.Version(version),
		micro.Registry(consulReg),
		// micro.Address("0.0.0.0:8087"), // 暴露的服务地址 这里可用可不用指定
		micro.WrapHandler(opentracingTool.NewHandlerWrapper(opentracing.GlobalTracer())),       // 绑定链路追踪
		micro.WrapHandler(ratelimit.NewHandlerWrapper(jujuratelimit.NewBucket(50, 100), true)), // 添加限流
	)

	// 6. 注册 handler
	if handlerErr := pbcart.RegisterCartHandler(srv.Server(), &handler.Cart{CartDataService: cartDataService}); handlerErr != nil {
		log.Fatal(handlerErr)
	}

	// 7. 运行服务
	if runErr := srv.Run(); runErr != nil {
		log.Fatal(runErr)
	}
}
  • 以下是一些注意事项
    • 服务初始化需要借助mysql,mysql的一些连接信息是从consul配置中心获取的
    • 在初始化的时候,需要先运行一次 rp.InitTable() 和 db.SingularTable(false)
    • 上面 jujuratelimit.NewBucket(50, 100) 中的参数50, 100可以写入环境变量来获取,这个可以根据具体资源情况进行调节
  • 这里,购物车服务已经搭建完成,可以进行启动了
    • $ sudo go run main.go
  • 启动后,在consul中查看,发现已经注册成功了

网关搭建


1 )目录结构

api
├── conf
│      ├── app.ini                                 # 通用配置文件
│      ├── env.local.ini                           # 本地配置文件
│      ├── env.test.ini                            # 测试环境配置
│      ├── env.uat.ini                             # uat环境配置
│      ├── env.prod.ini                            # prod环境配置
├── controllers
│      ├── api
│           └── api.go
├── middlewares
│      └── tracer.go                               # 链路追踪中间件
├── routers
│      └── router.go                               # 路由配置
├── utils
│      ├── common.go                               # 工具包通用工具
│      ├── conf.go                                 # 读取配置工具
│      └── micro.go                                # 微服务工具
├── go.mod
├── main.go
└── Makefile

2 )通用配置信息

[app]
appName  = go.micro.api
appVersion = latest
appZeroHost = 0.0.0.0
appAddr  =  0.0.0.0:8080

[consul]
address  = 127.0.0.1:8500

[jaeger]
tracerAddr = 127.0.0.1:6831

[hystrix]
hystrixPort = 9096

3 ) main.go 核心代码

package main

import (
	"gitee.com/go-micro-services/api/middlewares"
	"gitee.com/go-micro-services/api/routers"
	"gitee.com/go-micro-services/api/utils"
	"github.com/gin-gonic/gin"
	"go-micro.dev/v4/web"
)

func main() {
	// 1. 创建一个默认的路由引擎
	ginRouter := gin.Default()
	ginRouter.Use(middlewares.Trace()) // 加入 tracing 中间件
	routers.RoutersInit(ginRouter)

	// 2. web网关服务开启
	server := web.NewService(
		web.Name(utils.AppName),       // 服务名称
		web.Address(utils.AppAddr),    // 服务端口
		web.Handler(ginRouter),        // 服务路由
		web.Registry(utils.ConsulReg), // 注册中心
	)
	// 3. 启动
	server.Run()
}
  • 这里,web模块是go-micro中用于构建Web服务的部分
  • 它允许你使用标准的HTTP协议来暴露和调用微服务
  • web.NewService 函数的作用
    • 用于创建一个新的Web服务实例
    • 该函数接受一系列的配置参数
    • 用于定义服务的名称、地址、处理程序(即路由引擎)以及注册中心等信息
  • 下面是web.NewService函数中各个参数的意义
    • web.Name(utils.AppName): 设置服务的名称, 这通常用于服务发现和注册中心中的服务标识
    • web.Address(utils.AppAddr): 设置服务的监听地址和端口号, 这决定了服务应该在哪里监听传入的HTTP请求
    • web.Handler(ginRouter): 设置服务的路由处理程序, 这里传入的是基于gin框架的路由引擎实例,它定义了如何处理传入的HTTP请求
    • web.Registry(utils.ConsulReg): 设置服务的注册中心,这允许服务在启动时将自己注册到指定的注册中心(例如Consul),以便其他服务可以发现和调用它

4 )utils 包

  • utils.common.go

    package utils
    
    import (
    	"fmt"
    	"os"
    
    	"gopkg.in/ini.v1"
    )
    
    // 读取通用配置
    func getConfig() *ini.File {
    	appConfig, iniErr := ini.Load("conf/app.ini")
    	if iniErr != nil {
    		fmt.Printf("Fail to read file: %v", iniErr)
    		os.Exit(1)
    	}
    	return appConfig
    }
    
    func init() {
    	// 1. 读取配置文件
    	appConfig := getConfig()
    	// 2. 获取配置
    	initConfig(appConfig)
    	// 3. 初始化微服务
    	initMicro(appConfig)
    }
    
  • utils/conf.go

    package utils
    
    import (
    	"gopkg.in/ini.v1"
    )
    
    // 通用配置
    var AppName string
    var AppVersion string
    var AppAddr string
    var AppZeroHost string
    
    // 读取通用配置
    func initConfig(appConfig *ini.File) {
    	AppName = appConfig.Section("app").Key("appName").String()         // 应用名称
    	AppVersion = appConfig.Section("app").Key("appVersion").String()   // 应用版本
    	AppAddr = appConfig.Section("app").Key("appAddr").String()         // 应用地址
    	AppZeroHost = appConfig.Section("app").Key("appZeroHost").String() // 零地址
    }
    
  • utils/micro.go

    package utils
    
    import (
    	"context"
    	"fmt"
    	"net"
    	"net/http"
    
    	"go-micro.dev/v4"
    	"go-micro.dev/v4/client"
    	"gopkg.in/ini.v1"
    
    	"gitee.com/go-micro-services/common"
    	"github.com/go-micro/plugins/v4/registry/consul"
    	opentracingTool "github.com/go-micro/plugins/v4/wrapper/trace/opentracing"
    	"github.com/opentracing/opentracing-go"
    	log "go-micro.dev/v4/logger"
    	"go-micro.dev/v4/registry"
    
    	"github.com/afex/hystrix-go/hystrix"
    	"github.com/go-micro/plugins/v4/wrapper/select/roundrobin"
    )
    
    // 微服务micro客户端
    var SrvClient client.Client
    var ConsulAddr string
    var ConsulReg registry.Registry
    var TracerAddr string
    var HystrixPort string
    
    // 读取通用配置
    func initMicro(appConfig *ini.File) {
    	// 1. 配置注册中心
    	ConsulAddr = appConfig.Section("consul").Key("address").String()
    	ConsulReg := consul.NewRegistry(
    		registry.Addrs(ConsulAddr),
    	)
    	// 2. 配置链路追踪 jaeger
    	TracerAddr = appConfig.Section("jaeger").Key("tracerAddr").String()
    	// 3. 配置熔断
    	HystrixPort = appConfig.Section("hystrix").Key("hystrixPort").String()
    	setHystrix()
    
    	// 4. 创建服务
    	srv := micro.NewService()
    	srv.Init(
    		micro.Name(AppName),
    		micro.Version(AppVersion),
    		micro.Registry(ConsulReg),
    		// 绑定链路追踪
    		micro.WrapHandler(opentracingTool.NewHandlerWrapper(opentracing.GlobalTracer())),
    		// 添加熔断
    		micro.WrapClient(NewClientHystrixWrapper()),
    		// 添加负载均衡
    		micro.WrapClient(roundrobin.NewClientWrapper()),
    	)
    	SrvClient = srv.Client() // 对外暴露
    }
    
    // 链路追踪配置
    func SetTracer() (opentracing.Tracer, error) {
    	tracer, closer, err := common.NewTracer(AppName, TracerAddr)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer closer.Close()
    	return tracer, err
    }
    
    // 熔断器 设置
    func setHystrix() {
    	hystrixStreamHandler := hystrix.NewStreamHandler()
    	hystrixStreamHandler.Start()
    	go func() {
    		// 启动端口
    		err := http.ListenAndServe(net.JoinHostPort(AppZeroHost, HystrixPort), hystrixStreamHandler)
    		if err != nil {
    			log.Error(err)
    		}
    	}()
    }
    
    // 熔断器 type
    type clientWrapper struct {
    	client.Client
    }
    
    // 熔断器 Call
    func (c *clientWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
    	return hystrix.Do(req.Service()+"."+req.Endpoint(), func() error {
    		// run 正常执行
    		fmt.Println(req.Service() + "." + req.Endpoint())
    		return c.Client.Call(ctx, req, rsp, opts...)
    	}, func(err error) error {
    		fmt.Println(err)
    		return err
    	})
    }
    
    // 熔断器 Wrapper
    func NewClientHystrixWrapper() client.Wrapper {
    	return func(i client.Client) client.Client {
    		return &clientWrapper{i}
    	}
    }
    

5 )路由

package routers

import (
	"gitee.com/go-micro-services/api/controllers/api"
	"github.com/gin-gonic/gin"
)

func RoutersInit(r *gin.Engine) {
	rr := r.Group("/api")
	{
		rr.GET("/findAll", api.ApiController{}.FindAll)
	}
}

6 ) 控制器

package api

import (
	"context"
	"fmt"
	"strconv"

	"gitee.com/go-micro-services/api/utils"
	cart "gitee.com/go-micro-services/cart/proto/cart"
	"github.com/gin-gonic/gin"

	"github.com/prometheus/common/log"
)

type ApiController struct{}

func (con ApiController) FindAll(c *gin.Context) {
	log.Info("接受到 /api/findAll 访问请求")
	// 1. 获取参数
	user_id_str := c.Query("user_id")
	userId, err := strconv.ParseInt(user_id_str, 10, 64)
	if err != nil {
		c.JSON(200, gin.H{
			"message": "参数异常",
			"success": false,
		})
		return
	}
	fmt.Println(userId)

	// 2. rpc 远程调用:获取购物车所有商品
	cartClient := cart.NewCartService("go.micro.service.cart", utils.SrvClient)
	cartAll, err := cartClient.GetAll(context.TODO(), &cart.CartFindAll{UserId: userId})
	fmt.Println(cartAll)
	fmt.Println("-----")

	c.JSON(200, gin.H{
		"data":    cartAll,
		"success": true,
	})
}

7 ) 服务启动准备

  • 这里可以看到,基于gin框架来搭建了一个网关
  • 这里可以访问 /api/findAll?user_id=xxx 来调用购物车的微服务
  • 现在我们准备下数据,在数据库中初始化一条数据
  • 现在就可以通过:网关ip:8080/api/findAll?user_id=1 来调用了

8 )服务启动

  • $ sudo go run main.go
  • 可以看到,服务已经启动了

服务调用与测试


1 ) 调用

  • 访问网关ip:8080/api/findAll?user_id=1
  • 可以看到,调用成功

2 )查看链路追踪

  • 在 JAEGER UI 上, 比如本机访问:http://127.0.0.1:16686/search
  • 可以看到链路追踪上多了2个服务
  • 我们可以看下 api 的相关调用
  • 再看下 cart 的服务调用
  • 当然以上都是通常的调用,如果存在复杂的调用关系或出错信息,也可以从这里看出来

3 )测试限流

  • 在已搭建好的熔断面板上可以查看熔断功能:http://127.0.0.1:9002/hystrix
  • 因为熔断器是在客户端,也就是网关层接入的,所以,上面填入 网关ip:/hystrix.stream,比如上面的:192.168.1.7:9096/hystrix.stream
  • 好,现在我们频繁访问,刷新API,来测试下
  • 可见峰值不超过 60%,限流成功

总结

【Gin框架入门到精通系列24】微服务架构设计 本文深入探讨基于Gin框架构建微服务架构的全面指南,包括服务拆分原则、通信方式选择、服务注册与发现机制、API网关设计以及分布式事务处理,帮助开发者构建可扩展、可维护的现代分布式应用。 阅读详情

相关推荐

go 整合网关Hertz

Hertz 网关是一个微服务网关,由CloudWeGo团队开发,于2021年正式发布。它基于Go语言编写,支持HTTP/gRPC/Thrift协议,具备高并发、高性能、高可用等特性,可以部署在Kubernetes环境中。Hertz 网关具有动态路由、限流、熔断、黑白名单、认证鉴权等功能,并且支持可插拔的扩展机制。

m0_66212848的博客 1111

[golang gin框架] 41.Gin商城项目-微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)

微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 2164

在优快云学Golang工程组件(微服务工具集go-kit)

KrakenD提供了很多特性,包括请求路由、反向代理、缓存、限流、日志记录等,并且可以轻松集成OAuth2认证等第三方服务。API网关是一个位于客户端和后端服务之间的中间层,它负责处理所有的请求和响应,并且提供了一些通用的功能(如身份验证、访问控制、路由、监控等)。在分布式系统中,服务发现和负载均衡是非常重要的技术手段,可以帮助我们实现高可用、高性能的服务架构。在分布式系统中,请求链路追踪是非常重要的技术手段,可以帮助我们快速定位问题、优化性能。在Golang中,我们可以使用一些库来实现这些功能。

YKM_2580的博客 284

[golang gin框架] 42.Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务

Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 1667

Go + Gin 错误治理实战:从统一响应到高并发场景下的生产级错误架构

Code很多人把错误处理理解为“异常情况下补几行代码”,这是远远不够的。当系统失败时,用户会看到什么?当系统失败时,工程师能否快速定位?当系统失败时,系统是否还能稳定运行?因此,好的 Go + Gin 错误治理,不是简单的return err,也不是几个middleware用统一错误模型表达语义用分层设计隔离职责用中间件实现统一收口用可观测性建立排障闭环用高并发优化保证治理本身不成为负担用策略字段打通重试、降级、熔断等稳定性能力。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 353

构建AI Agent安全网关:Spring Cloud Gateway实现工具调用管控

在微服务架构中,API网关是管理服务间通信、实施安全策略和流量控制的核心组件。其原理是通过统一的入口,对请求进行认证、鉴权、限流和审计,确保系统的安全性与可观测性。这一技术价值在于为企业级应用提供了标准化的服务治理能力。随着AI Agent技术的发展,大模型调用外部工具(如数据库、API)的需求激增,但直接调用带来了权限滥用、成本失控等安全风险。因此,将API网关的设计理念应用于AI工具调用场景,构建一个专门的**安全网关**,成为实现AI应用落地的关键。本文聚焦于如何利用**Spring Cloud Ga

cmff98425的博客 422

Go语言微服务框架选型全对比(2024最新版):哪款最适合你的项目?

全面解析主流go语言微服务框架选型方案,帮助开发者根据项目规模、性能需求与团队技术栈做出最优决策。涵盖gRPC、Go Micro、Kratos等框架的适用场景与核心优势,对比性能、生态与学习成本,值得收藏。

CodeVibe的博客 931

智能眼镜AI导航实战:DashScope API安全配置与限流策略完整指南

在构建嵌入式AI应用时,API安全与限流是保障服务稳定与数据安全的核心环节。API Key作为访问云服务的凭证,其安全存储与传输直接关系到应用的安全基线。采用**三层安全架构**,通过后端代理隔离客户端与云服务,是实现**客户端零密钥**的关键设计模式,能有效防范密钥泄露风险。在工程实践中,结合**令牌桶算法**在代理层实施限流,可平滑请求流量,避免触发云服务商限流策略,确保服务高可用。对于智能眼镜等移动端AI应用场景,这种架构不仅能保护敏感数据,还能通过客户端优雅降级与智能重试机制,在复杂网络环境下维持流

weixin_30680385的博客 536

Go微服务框架选型实战:go-zero、Kratos、go-kit对比与避坑指南

微服务架构是一项系统工程,框架只是其中的一部分,它负责服务间通信、注册发现与治理能力。理解框架的边界和定位,是选型的第一步。在Go生态中,go-zero、Kratos、go-kit、go-micro各有侧重:go-zero以代码生成和内置治理见长,适合快速交付;Kratos基于protobuf契约,强调规范与多注册中心支持;go-kit作为工具库提供极高自由度,但需自行组装限流熔断、服务发现等组件;go-micro则因维护状态需谨慎评估。从服务注册到限流熔断,从etcd到K8s部署,框架间的硬指标差异直接影

weixin_34414196的博客 305

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1038

Golang OSINT工具开发实战:从PhoneInfoga看高并发架构与框架选型

开源情报(OSINT)技术是从公开来源搜集和分析信息的关键方法,广泛应用于安全评估、风控和调研领域。其核心原理在于通过自动化工具聚合多源公开数据,进行交叉验证,以提升信息获取的效率和可靠性。在技术实现上,高并发处理和易部署性是关键价值。Golang语言凭借其卓越的并发模型(Goroutine)和编译为单一可执行文件的特性,成为构建此类高性能命令行工具和网络服务的理想选择。结合插件化架构设计,开发者可以快速构建像PhoneInfoga这样可扩展的OSINT框架。在实际应用场景中,这类技术不仅用于电话号码等信息

weixin_34038293的博客 340

Altium Concord Pro 的应用范围,安装,和使用范围

Altium Concord Pro 的应用范围,安装,和使用范围。保证满足两者软件的最低安装要求。 Altium Concord Pro 是配合Digapcb,和MCAD,Altium 和相应机械设计软件的基础和交换桥梁

hanzhaos的博客 1121

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

在微服务与云原生架构中,API网关作为核心的流量入口与统一管控层,其核心价值在于对后端服务的路由、认证、限流、熔断与监控进行集中治理。通过引入服务治理模式,网关能够有效提升分布式系统的韧性,防止因下游服务不稳定导致的级联故障,保障业务高可用。在AI应用规模化落地的场景下,企业往往需要集成多个供应商(如英伟达NIM、NGC)的模型服务,此时一个统一的AI服务网关显得尤为重要。它能将分散的API调用、密钥管理与成本核算进行整合,通过定义统一的请求响应模型、集成熔断重试机制,并利用Prometheus实现可观测性

weixin_34268843的博客 468

如何下载最新版本的VMware Workstation

随着虚拟化技术的发展,VMware Workstation作为行业领先的桌面虚拟化软件,为用户提供了在单一物理计算机上运行多个操作系统的能力。本文将详细介绍如何从Broadcom支持网站下载最新的VMware Workstation Pro版本。

安呀智数据坊的博客 670

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 676

Go后端面试三件套:gin、gorm、go-zero核心考点全解析

在Go后端开发中,Web框架、ORM和微服务框架是构建高并发系统的三大基石。理解它们的原理与边界,不仅是日常开发的必备技能,也是面试中拉开差距的关键。从HTTP路由的底层数据结构,到数据库事务与软删除的实现机制,再到微服务场景下的熔断与负载均衡,每一环节都考验着开发者对工程实践的深度把握。这些技术并非孤立存在:gin负责接口层的高效路由与中间件编排,gorm屏蔽了SQL细节并提供钩子与预加载能力,go-zero则通过代码生成与服务治理组件支撑微服务架构。掌握它们如何协同,以及各自在真实项目中的取舍,能够帮助

weixin_30647423的博客 282

解决OpenCASCADE性能瓶颈:显示加速与三角剖分优化全攻略

本文深入探讨OpenCASCADE在工业设计和CAD建模中的性能优化策略,重点解决显示加速与三角剖分等核心瓶颈问题。通过智能刷新控制、显示数据结构优化和动态LOD技术,显著提升渲染效率和交互体验,适用于复杂场景下的三维可视化应用。

weixin_30752699的博客 344

接口对接性能提升80%:Java与Go混合架构下的最佳实践

解决高并发场景性能瓶颈,分享Java与Go对接代码的最佳实践。结合微服务架构,通过gRPC通信与异步处理提升接口响应速度80%。适用于混合技术栈系统优化,值得收藏。

CodeIsle的博客 291

MFC 中实现 WebSocket 客户端以支持实时双向通信

3. **协议兼容**:若服务器使用 `wss://`(加密),需在 `lws_client_connect_info` 中配置 SSL 相关参数(`ssl_connection = LCCSCF_USE_SSL`)。- 编辑框(`m_editUrl`):输入 WebSocket 服务器地址(如 `ws://echo.websocket.events`)。2. 将编译后的库文件(`.lib`、`.dll`)和头文件路径添加到 MFC 项目中(项目属性 -> VC++ 目录)。// UI:服务器地址。

寒寒豆豆软件公司的博客 202

【OpenClaw从入门到精通】第17篇:OpenClaw巨头布局实战:阿里CoPaw/腾讯云/百度/火山引擎深度拆解(2026实操版)

2026年OpenClaw以22.8万星标登顶GitHub,引发阿里、腾讯、百度、字节等互联网巨头入局角逐。本文基于公开技术文档与实测经验,深度解析四大巨头的OpenClaw布局战略:阿里云CoPaw的全栈托管、腾讯云的流量入口绑定、百度智能云的搜索生态内嵌、火山引擎的极致智力供给。从核心原理、算法构建、实操流程三个维度,提供可直接落地的接入方案,包含完整代码示例与执行结果验证。通过流程图可视化核心架构,搭配避坑指南与选型矩阵,帮助新手快速上手、进阶读者实现多厂商协同部署。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1685

Go-zero 电商用户系统实战:注册登录、JWT 鉴权与缓存设计

在微服务架构中,用户系统作为电商核心入口,需兼顾高并发、低延迟与高可用。Go-zero 框架通过 API 网关与 RPC 分层,结合 JWT 鉴权、Redis 缓存及服务注册发现,为登录注册、用户信息管理等场景提供工程化方案。其代码生成器 goctl 统一了分层规范,并内置缓存管理、熔断限流等机制,有效应对读多写少、响应敏感的业务特征。本文基于 Go-zero 从零搭建用户系统,涵盖数据库设计、JWT 签发、缓存策略及单节点到集群的演进,重点解析 bcrypt 密码安全、缓存穿透与并发控制等实操细节,为电商

weixin_34342207的博客 343

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

后端工程师技能图谱:从编程语言到分布式系统的实战学习路线

后端开发是构建数字应用核心支撑系统的关键技术领域,其核心在于处理业务逻辑、数据存储与系统间通信。从技术原理层面看,后端工程师需要深入理解计算机基础,包括数据结构与算法如何优化程序效率,操作系统进程与内存管理机制如何影响应用性能,以及网络协议如何保障服务间可靠通信。这些基础原理共同支撑着高并发、高可用的分布式系统实现,其技术价值体现在能够构建稳定、可扩展的线上服务,直接关系到产品的用户体验和商业成败。典型的应用场景涵盖电商交易系统、实时通信平台、大数据处理管道等,要求系统能应对海量请求、保证数据一致性。本文聚

weixin_30735745的博客 1000

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从丧尸生存到系统架构:技术选型与团队构建的隐喻与实战

在软件工程中,技术选型与团队构建是保障系统稳定性的核心决策。其原理在于根据项目不同阶段的核心风险,匹配相应的技术角色与组件,以构建一个具备弹性、可观测性和可扩展性的系统。这一过程的技术价值在于,它能够将抽象的工程问题转化为具体的、可执行的架构方案,从而有效应对高并发、系统故障、安全漏洞等挑战。在实际应用场景中,这通常体现为对高性能网关、微服务框架、监控告警体系等技术的组合运用。例如,通过引入Nginx实现负载均衡,并结合Redis缓存应对流量洪峰,可以显著提升系统的瞬时处理能力;同时,集成Spring Cl

weixin_30784501的博客 351

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

agents24 后端系统架构 Agent 全解析:backend-architect 的可扩展 API 设计与微服务架构能力手册

> 本文深度剖析多 Harness Agent 插件市场中 `backend-development` 插件内置的 **backend-architect** 专用 Agent:从其在 [plugins/backend-development/agents/backend-architect.md](https://link.gitcode.com/i/777cf8087cc82b29695731

gitblog_00992的博客 611

构建智能工单排查系统:从规则引擎到知识闭环的工程实践

在软件开发和运维领域,自动化与智能化是提升效率的关键方向。其核心原理在于通过预设规则、集成数据源和算法模型,将重复、繁琐的人工操作转化为系统自动执行的流程,从而释放人力专注于更高价值的创造性工作。这一技术价值在问题排查与工单处理场景中尤为凸显,能够显著缩短平均故障恢复时间(MTTR)。具体到应用场景,当系统出现性能瓶颈或异常时,传统的排查需要工程师手动关联日志、监控和链路追踪数据,过程耗时且依赖个人经验。本文介绍的智能工单排查系统,正是这一理念的工程化落地。它通过构建感知、决策、执行、反馈的四层架构,实现了

weixin_30660027的博客 362
上一篇: Go微服务: Prometheus性能监控与Grafana平台的搭建
下一篇: Go微服务: 接入Prometheus性能监控平台与Grafana平台
Wang's Blog
博客等级 码龄12年 7433粉丝 2418原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值