当前位置: 首页 > article >正文

【Golang学习之旅】Go 语言微服务架构实践(gRPC、Kafka、Docker、K8s)

文章目录

    • 1. 前言:为什么选择Go语言构建微服务架构
      • 1.1 微服务架构的兴趣与挑战
      • 1.2 为什么选择Go语言构建微服务架构
    • 2. Go语言简介
      • 2.1 Go 语言的特点与应用
      • 2.2 Go 语言的生态系统
    • 3. 微服务架构中的 gRPC 实践
      • 3.1 什么是 gRPC?
      • 3.2 gRPC 在 Go 语言中的实现
    • 4. Kafka 在微服务中的应用
      • 4.1 什么是 Kafka?
      • 4.2 Kafka 在 Go 中的应用
    • 5. Docker 在 Go 微服务架构中的应用
      • 5.1 什么是 Docker?
      • 5.2 使用 Docker 容器化 Go 微服务
    • 6. Kubernetes在 Go 微服务架构中的应用
      • 6.1 什么是 Kubernetes?
      • 6.2 Kubernetes 与 Go 微服务的结合
    • 7. 微服务架构的监控与日志管理
      • 7.1 为什么监控与日志管理重要?
      • 7.2 如何实现微服务监控与日志管理
    • 8. 结语

1. 前言:为什么选择Go语言构建微服务架构

1.1 微服务架构的兴趣与挑战

随着互联网技术的飞速发展,尤其是云计算的普及,微服务架构已经成为企业构建大型、分布式系统的主流选择。微服务架构的核心思想是将一个传统的单体应用程序拆解成若干个小而独立的服务,每个服务运行在独立的进程中,通过网络进行通信。每个微服务都负责一个独立的功能,并且可以根据业务需求独立开发、部署和扩展。

在微服务架构中,服务之间通过标准协议(如HTTP、gRPC等)进行通信,而每个服务都拥有自己的数据存储和处理逻辑,避免了数据集中管理的单点故障问题。微服务架构不仅能够有效应对业务增长,还能使得开发和运维更加高效、灵活。然而,微服务架构也带来了许多挑战:

  • 服务间通信复杂性:随着服务数量的增加,服务之间的通信变得更加复杂,需要解决如网络延迟、数据传输等问题。
  • 数据一致性问题:微服务架构中的每个服务都有独立的数据库,如何确保数据的一致性、完整性和可靠性是一个重大挑战。
  • 监控与运维:大量独立运行的服务如何进行统一监控、日志管理、自动化运维等问题,也成为了微服务架构中不可忽视的难题。

因此,在微服务架构中选择合适的技术栈,尤其是高性能的编程语言至关重要。Go语言(Golang)正是解决这些挑战的理想选择之一。

1.2 为什么选择Go语言构建微服务架构

Go语言,作为Google推出的编程语言,已被越来越多的企业采纳,尤其是在构建高并发、高扩展的微服务架构时,Go语言展现了其巨大的优势:

  1. 性能卓越:Go是一种编译型语言,能够直接编译为机器代码,具有接近C语言的执行效率,非常适合高性能的微服务开发,尤其是在需要处理大量并发请求时。
  2. 简洁易学:Go的语法设计非常简洁明了,易于理解,开发人员上手快速。与传统的面向对象语言相比,Go更加注重程序的简单性,适合快速开发和迭代。
  3. 内建的并发支持:Go的并发模型通过groutinechannel提供了高效且简洁的方式来处理并发任务。这使得Go在处理大量并发请求时表现出色,适用于构建高并发、高吞吐量的微服务系统。
  4. 强大的工具链:Go语言自带的工具链(如go buildgo testgo fmt)非常方便,能够提高开发效率,减少开发人员的工作量。同时,Go的标准库功能丰富,能满足很多开发需求。
  5. 广泛的应用场景:由于Go语言的高效性和简洁性,已被广泛应用于云计算、大数据、DevOps和微服务等领域。许多著名的分布式系统和微服务架构(如Kubernetes、Docker)都是用Go编写的,证明了Go在处理高并发、大规模系统的强大能力。

因此,Go语言无疑是构建现代化微服务架构的最佳选择之一。

2. Go语言简介

2.1 Go 语言的特点与应用

Go 语言是一种开源的编译型编程语言,由 Google 在 2009 年发布,旨在解决大规模软件开发中的许多痛点。Go 语言的设计理念强调简洁性、高效性和现代化的并发编程,它结合了 C 语言的高效性和 Python 的简洁性,同时拥有许多现代语言的优秀特性。以下是 Go 语言的一些关键特点:

  • 并发编程模型: Go 语言通过 goroutine 和 channel 提供了简洁且高效的并发编程模型。Goroutine 是 Go 语言的轻量级线程,开发者可以轻松地在应用程序中启动成千上万的 goroutine 并管理它们之间的通信。Channel 用于在不同的 goroutine 之间传递数据,避免了传统并发编程中的共享内存问题。
  • 垃圾回收:Go 内建垃圾回收(GC)机制,能够有效管理内存分配,减轻开发人员的负担。Go 的垃圾回收采用了标记-清除算法,并且非常高效,适合高性能的服务端应用。
  • 跨平台性:Go 支持多平台开发,可以在 Linux、Windows、macOS 等操作系统上进行开发并部署。Go 编译出的可执行文件可以直接在目标平台上运行,免去依赖库安装的麻烦。
  • 标准库和工具链:Go 拥有丰富的标准库,涵盖了 Web 开发、数据库访问、并发处理等多个领域,开发者几乎不需要依赖第三方库。同时,Go 还自带了完善的工具链,如 go fmt 用于自动格式化代码,go test 用于单元测试,go run 用于直接运行代码等。
  • 高效的编译速度:Go 的编译速度非常快,这对于快速迭代和开发至关重要。Go 的构建系统可以快速编译出可执行文件,这对于微服务架构中的开发者而言,可以显著提升开发效率。

2.2 Go 语言的生态系统

Go 语言不仅有强大的语法和并发模型,它的生态系统也非常成熟和丰富。Go 语言在微服务、分布式系统和云原生技术中得到了广泛应用:

  • Kubernetes:作为世界上最流行的容器编排平台,Kubernetes 完全是用 Go 语言编写的,它证明了 Go 在处理分布式系统、容器化管理和自动化方面的强大能力。
  • Docker:Docker 是一个开源的容器化平台,它的核心部分也使用 Go 编写,展示了 Go 在容器化、虚拟化等领域的优势。
  • gRPC:gRPC 是 Google 开发的一种高性能、开源和通用的远程过程调用(RPC)框架,它的服务端和客户端代码生成也使用 Go,广泛应用于微服务之间的高效通信。

Go 语言在微服务架构中的应用主要体现在高效的并发处理、快速的开发周期和出色的运行时性能上,许多大规模的企业级应用系统都使用 Go 语言构建。

3. 微服务架构中的 gRPC 实践

3.1 什么是 gRPC?

gRPC(Google Remote Procedure Call)是 Google 开发的一款高性能、开源的远程过程调用(RPC)框架。它基于 HTTP/2 协议,支持多种语言(如 Go、Java、Python、C++ 等),能够让不同语言编写的微服务之间实现高效的通信。

gRPC 采用了 Protocol Buffers(protobuf)作为默认的接口定义语言(IDL)。它通过接口定义文件(.proto 文件)来定义服务的接口和消息类型,从而实现跨平台的服务调用。与传统的 REST API 相比,gRPC 提供了更高效的通信机制,尤其在高并发、高吞吐量的场景中表现尤为突出。

3.2 gRPC 在 Go 语言中的实现

在 Go 中实现 gRPC 服务相对简单。首先,需要安装 protoc 编译器和 Go 的 gRPC 插件。然后通过定义.proto文件来生成服务端和客户端代码。接下来,我们可以实现实际的 gRPC 服务和客户端。以下是 gRPC 在 Go 中的实现步骤:
步骤 1:安装依赖
首先,我们需要安装 protoc 和相关的插件:

# 安装 protobuf 编译器
brew install protobuf  # MacOS 使用 Homebrew 安装
# 也可以从 https://github.com/protocolbuffers/protobuf/releases 下载
# 安装 gRPC 和 Protobuf 插件
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

步骤 2:定义 .proto 文件
.proto 文件中,我们可以定义服务接口和消息类型。例如,我们创建一个 user.proto 文件,定义了一个简单的服务:

syntax = "proto3";package user;option go_package = "./proto";service UserService {rpc GetUser (UserRequest) returns (UserResponse);
}message UserRequest {int32 id = 1;
}message UserResponse {int32 id = 1;string name = 2;string email = 3;
}

此文件定义了一个 UserService 服务,包含一个 GetUser 的 RPC 方法,该方法接收一个 UserRequest 消息并返回一个 UserResponse 消息。

步骤 3:生成 Go 代码
使用 protoc 工具生成服务端和客户端的 Go 代码:

protoc --go_out=. --go-grpc_out=. user.proto

步骤 4:实现 gRPC 服务端
接下来,我们在 Go 中实现 gRPC 服务端:
server/server.go

package mainimport ("context""fmt""log""my-ecommerce-app/userpb""net""google.golang.org/grpc"
)// 定义 gRPC服务
type userServiceServer struct {userpb.UnimplementedUserServiceServer
}// 实现 GetUser 方法
func (s *userServiceServer) GetUser(ctx context.Context, req *userpb.UserRequest) (*userpb.UserResponse, error) {// 模拟从数据库提取数据user := &userpb.UserResponse{Id:    req.GetId(),Name:  "John Doe",Email: "johndoe@example.com",}return user, nil
}func main() {// 启动 gRPC 服务lis, err := net.Listen("tcp", ":50051") // 监听端口if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer() // 创建 gRPC 服务器// 注册 gRPC 服务userpb.RegisterUserServiceServer(s, &userServiceServer{})// 启动服务器fmt.Println("Server started on port 50051...")if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}

步骤 5:实现 gRPC 客户端
然后,我们在客户端实现 gRPC 客户端代码:
client/client.go

package mainimport ("context""log""my-ecommerce-app/userpb""google.golang.org/grpc"
)func main() {// 连接到grpc服务器conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := userpb.NewUserServiceClient(conn)// 调用grpc服务response, err := c.GetUser(context.Background(), &userpb.UserRequest{Id: 1})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", response)
}

步骤 6:运行服务

  1. 先启动服务端:
go run server.go
  1. 然后再启动客户端:
go run client.go

这样,客户端就能够通过 gRPC 调用服务端的 GetUser 方法,并接收返回的数据。
在这里插入图片描述

4. Kafka 在微服务中的应用

4.1 什么是 Kafka?

Kafka是一个分布式流处理平台,广泛用于构建实时数据流应用程序和数据管道。在微服务架构中,Kafka常常作为服务之间的消息队列,负责处理高吞吐量、低延迟的消息传递。
Kafka具有以下特点:

  • 高吞吐量:Kafka能够处理每秒数百万条消息,非常适合高负载的实时数据流处理。
  • 持久性和可靠性:Kafka提供数据持久化,能够确保消息在系统崩溃时不会丢失。
  • 分布式架构:Kafka本身支持水平扩展,能够根据需求自动增加节点,提供高可用性和负载均衡。

4.2 Kafka 在 Go 中的应用

在Go中使用Kafka,我们可以通过第三方库github.com/segmentio/kafka-go来进行消息的生产和消费。下面是如何在Go中实现Kafka消息的生产者和消费者。

步骤一:安装Kafka Go客户端

go get github.com/segmentio/kafka-go

步骤 二:实现 Kafka 生产者
internal/kafka/producer/producer.go

package mainimport ("context""fmt""log""github.com/segmentio/kafka-go"
)func main() {// 创建Kafka 写入器writer := kafka.NewWriter(kafka.WriterConfig{Brokers:  []string{"localhost:9092"},Topic:    "user-events",Balancer: &kafka.LeastBytes{},})// 写入消息err := writer.WriteMessages(context.Background(), kafka.Message{Key:   []byte("user1"),Value: []byte("User Created"),})if err != nil {log.Fatal(err)}fmt.Println("Message sent to Kafka topic")
}

步骤三:实现 Kafka 消费者
BackEnd\kafka\consumer\consumer.go

package mainimport ("context""fmt""log""github.com/segmentio/kafka-go"
)func main() {// 创建Kafka读取器reader := kafka.NewReader(kafka.ReaderConfig{Brokers:  []string{"localhost:9092"},Topic:    "user-events",GroupID:  "test-group",MinBytes: 10e3, // 10KBMaxBytes: 10e6, // 10MB})// 消费消息for {message, err := reader.ReadMessage(context.Background())if err != nil {log.Fatal(err)}// 打印消息fmt.Println("Received: %s\n", string(message.Value))}
}

通过上述生产者和消费者实现,我们就可以利用 Kafka 在微服务之间传递消息。
在这里插入图片描述

5. Docker 在 Go 微服务架构中的应用

5.1 什么是 Docker?

Docker 是一种开源的容器化平台,能够帮助开发者快速构建、部署和运行应用。Docker 使用容器技术将应用及其依赖打包到一个标准化的单元中,可以在任何地方运行。容器化技术使得应用具有跨平台、跨环境的一致性,特别适合微服务架构。
Docker 具有以下优势:

  • 环境一致性:无论在开发、测试还是生产环境,Docker 容器中的应用行为都完全一致。
  • 轻量级:与虚拟机不同,容器共享操作系统内核,因此相对于虚拟机,容器更加轻量级,启动速度更快。
  • 高效的资源利用:容器使用系统资源更加高效,多个容器可以共享相同的操作系统资源。
  • 易于扩展和部署:Docker 与 Kubernetes 等容器编排工具结合,能快速、自动化地进行部署和扩展。

5.2 使用 Docker 容器化 Go 微服务

将 Go 微服务应用容器化是构建微服务架构的一个重要步骤。在 Docker 中,我们需要创建一个 Dockerfile 来描述如何构建一个 Go 服务的镜像,并将其部署到 Docker 容器中。
步骤 1:创建 Dockerfile
在 Go 服务的根目录下创建一个 Dockerfile 文件,定义如何构建 Go 应用的镜像:

# 使用官方 Golang 镜像作为基础镜像
FROM golang:1.24# 为镜像设置必要的环境变量
ENV GO111MODULE=on \GOPROXY=https://goproxy.cn,direct \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64# 设置工作目录为 /build
WORKDIR /build# 复制 go.mod 和 go.sum 文件,以便安装依赖
COPY go.mod go.sum ./# 安装 Go 依赖
RUN go mod download# 将源代码复制到容器中的工作目录
COPY . .# 复制 .env 文件到容器的根目录(确保路径正确)
COPY .env /dist/.env# 复制 configs 目录到容器的 /dist/configs 目录
COPY configs /dist/configs# 编译 Go 程序,输出二进制文件 app
RUN go build -o app cmd/web-app/main.go# 将工作目录切换到 /dist
WORKDIR /dist# 将编译后的二进制文件从 /build 目录复制到 /dist 目录
RUN cp /build/app .# 声明容器监听的端口
EXPOSE 7070# 启动容器时运行的命令
CMD ["/dist/app"]

这个 Dockerfile 使用了多阶段构建的方式,先用 Golang 的官方镜像构建 Go 应用,然后将构建好的二进制文件复制到一个更轻量的 Alpine 镜像中,以减小镜像的体积。

步骤 2:构建 Docker 镜像
在项目根目录下运行以下命令来构建 Docker 镜像:

docker build -t go-microservice .

此命令会根据 Dockerfile 构建一个名为go-microservice的 Docker 镜像。
在这里插入图片描述
步骤 3:运行 Docker 容器
使用以下命令启动一个 Docker 容器:

docker run -d -p 7070:7070 --name go-microservice-container go-microservice

这将会启动一个名为go-microservice-container的容器,并将容器内的 7070 端口映射到主机的 7070端口。
在这里插入图片描述
步骤 4:访问服务
此时,Go 微服务已经运行在 Docker 容器中,我们可以通过访问 http://localhost:7070来测试服务是否正常工作。

6. Kubernetes在 Go 微服务架构中的应用

6.1 什么是 Kubernetes?

Kubernetes(简称K8s)是一个开源的容器编排平台,专门用于自动化部署、扩展和管理容器化应用。它提供了丰富的功能,能够在分布式环境中高效管理容器。Kubernetes的核心功能包括容器调度、服务发现、负载均衡、自动扩展、自动恢复等。

在微服务架构中,Kubernetes提供了高可用性、可伸缩性和容器管理能力,帮助团队以自动化、弹性和高效的方式运行和管理服务。

6.2 Kubernetes 与 Go 微服务的结合

Go 微服务与 Kubernetes 的结合非常紧密,Kubernetes 可以帮助我们实现微服务的自动化部署、扩展和管理。以下是将 Go 微服务部署到 Kubernetes 中的流程。

步骤 1:创建 Kubernetes 配置文件
我们需要编写 Kubernetes 配置文件来描述如何部署 Go 微服务。首先创建一个 deployment.yaml 文件,定义了 Go 服务的部署:

apiVersion: apps/v1
kind: Deployment
metadata:name: go-microservice
spec:replicas: 3selector:matchLabels:app: go-microservicetemplate:metadata:labels:app: go-microservicespec:containers:- name: go-microserviceimage: go-microservice:latestports:- containerPort: 8080

这个配置文件定义了一个名为 go-microservice 的部署,副本数为 3,表示有 3 个副本的 Go 微服务实例在 Kubernetes 集群中运行。

接下来,我们创建一个 service.yaml 文件,定义 Kubernetes 服务暴露:

apiVersion: v1
kind: Service
metadata:name: go-microservice-service
spec:selector:app: go-microserviceports:- protocol: TCPport: 8080targetPort: 8080type: LoadBalancer

这个服务暴露了 Go 微服务的 8080 端口,并指定了一个负载均衡器(LoadBalancer),用于将流量分发到多个微服务实例。

步骤 2:应用 Kubernetes 配置
deployment.yaml service.yaml 文件应用到 Kubernetes 集群中:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

步骤 3:查看部署状态
查看 Go 微服务是否已经成功部署:

kubectl get pods

这将显示所有的 pod 列表,确保 go-microservice部署的 pod 在正常运行。

步骤 4:暴露服务
在 Kubernetes 中,我们使用 kubectl expose 命令暴露服务:

kubectl expose deployment go-microservice --type=LoadBalancer --name=go-microservice-service

此命令将服务暴露为负载均衡器类型,自动为服务分配一个公网 IP。

步骤 5:访问服务
通过访问负载均衡器分配的公网 IP,我们可以测试 Go 微服务是否已成功运行在 Kubernetes 集群中。

7. 微服务架构的监控与日志管理

7.1 为什么监控与日志管理重要?

在微服务架构中,由于系统由多个服务组成,单个服务的异常可能影响整个系统的正常运行。因此,及时发现并排查问题对于微服务的稳定性至关重要。监控与日志管理是确保系统高可用性和性能的关键组成部分。

  • 监控:可以帮助我们实时了解服务的运行状态,发现潜在的性能瓶颈、资源消耗过大等问题。
  • 日志管理:通过集中化日志管理,开发者可以快速定位问题,并对故障进行及时修复。

7.2 如何实现微服务监控与日志管理

  1. 使用 Prometheus 和 Grafana 进行监控
    Prometheus 是一个开源的监控系统,它通过抓取指标数据并存储在时序数据库中,帮助我们实时监控微服务的健康状态。Grafana 则是一个可视化工具,可以帮助我们展示 Prometheus 存储的数据并创建各种仪表板。
  2. 使用 ELK(Elasticsearch、Logstash 和 Kibana)进行日志管理
    ELK 是一个流行的日志管理方案。Elasticsearch 用于存储和索引日志数据,Logstash 用于收集、过滤和转发日志数据,而 Kibana 则用于展示和分析日志数据。通过集中化的日志管理,我们可以轻松地查看微服务的日志并快速定位问题。

8. 结语

通过本篇文章的深入探讨,我们了解了如何使用 Go 语言实现一个高效的微服务架构,并借助 gRPC、Kafka、Docker 和 Kubernetes 等技术来构建现代化的分布式系统。在微服务架构中,每个组件都有其独特的作用,如何高效地管理这些组件是确保系统稳定和高性能的关键。希望通过本文的内容,能够帮助大家深入理解 Go 语言在微服务架构中的应用,并为未来的项目实践提供有力的指导。

在未来的工作中,我们可以继续通过优化服务架构、提升系统的可扩展性、监控和自动化运维等方面,不断提升系统的健壮性和可维护性,打造更加高效和灵活的微服务系统。

相关文章:

【Golang学习之旅】Go 语言微服务架构实践(gRPC、Kafka、Docker、K8s)

文章目录 1. 前言:为什么选择Go语言构建微服务架构1.1 微服务架构的兴趣与挑战1.2 为什么选择Go语言构建微服务架构 2. Go语言简介2.1 Go 语言的特点与应用2.2 Go 语言的生态系统 3. 微服务架构中的 gRPC 实践3.1 什么是 gRPC?3.2 gRPC 在 Go 语言中的实…...

Spring核心思想之—AOP(面向切面编程)

目录 一 .AOP概述 二. Spring AOP 使用 2.1 引入AOP依赖 2.2 编写AOP程序 三. Spring AOP详情 3.1 切点(Pointcut) 3.2 连接点(Join Point) 3.3通知(Advice) 3.4切面(Aspect) 3.5通知 3.6 PointCut (公共切点)…...

使用 Openpyxl 操作 Excel 文件详解

文章目录 安装安装Python3安装 openpyxl 基础操作1. 引入2. 创建工作簿和工作表3. 写入数据4. 保存工作簿5. 加载已存在的Excel6. 读取单元格的值7. 选择工作表 样式和格式化1. 引入2. 设置字体3. 设置边框4. 填充5. 设置数字格式6. 数据验证7. 公式操作 性能优化1. read_only/…...

关于使用雪花算法生成唯一ID,返回给前端ID不一致的问题

问题 在某个项目中,使用雪花算法生成的唯一ID,从数据库查询到数据后返回给前端,但是前端接受到的数据ID和数据库原先生成的不一致 但是前端展示的数据: 原因 原因是后端使用Long类型来存储雪花算法生成的ID,但是这个数值已经超过前端数值类型的范围,导致前端在存储这个数值…...

axios post请求 接收sse[eventsource]数据的

axios 接收sse数据的 axios 接收sse数据的 EventSource什么 基于 HTTP 协议实现,通过与服务器建立一个持续连接,实现了服务器向客户端推送事件数据的功能。在客户端,EventSource 对象通过一个 URL 发起与服务器的连接。连接成功后&#xff0…...

Spring Boot 示例项目:从零开始构建 Web 应用

一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...

大语言模型常用微调与基于SFT微调DeepSeek R1指南

概述 大型语言模型(LLM,Large Language Model)的微调(Fine-tuning)是指在一个预训练模型的基础上,使用特定领域或任务的数据对模型进行进一步训练,以使其在该领域或任务上表现更好。微调是迁移…...

聚焦地灾防治,助力城市地质安全风险防控

城市是人类社会发展的重要载体,承载着经济繁荣、文化交流和人口聚集等重要功能。然而,由于城市建设过程中地质条件复杂,地质灾害风险隐患存在,城市地质安全等问题日益突出,引起人们的广泛关注。为保障城市发展的安全和…...

为什么WP建站更适合于谷歌SEO优化?

在当今数字时代,建立一个网站似乎变得容易,但要构建一个真正能够带来流量和订单的网站却并非易事。特别是在谷歌SEO优化方面,不同的建站程序在SEO支持方面的效果差异显著。对于希望提升搜索引擎表现的用户来说,WordPress无疑是最佳…...

基于JavaScript的实时数据监控仪表盘开发实践

基于JavaScript的实时数据监控仪表盘开发实践 一、项目背景 某云计算服务商需要为其客户提供服务器集群健康状态监控系统。原有系统存在以下痛点: 数据刷新依赖手动操作可视化效果单一(仅表格展示)缺乏异常状态的智能预警移动端适配性差 …...

同步异步日志系统-日志落地模块的实现

功能:将格式化完成后的日志消息字符串,输出到指定的位置 扩展:支持同时将日志落地到不同的位置 位置分类: 1.标准输出 2.指定文件(时候进行日志分析) 3.滚动文件(文件按照时间/大小进行滚动…...

大模型常识:什么是大模型/大语言模型/LLM

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...

用deepseek学大模型08-长短时记忆网络 (LSTM)

deepseek.com 从入门到精通长短时记忆网络(LSTM),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导…...

IOT通道MQTT

IoT通道是物联网(IoT)系统中用于设备与云端或设备之间通信的专用通道,其主要作用是实现数据的高效传输和设备的远程控制。以下是关于IoT通道的定义、应用和技术特点的总结: 定义 IoT通道是物联网设备与云端或设备之间建立的通信…...

(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解

题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...

小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格

文章目录 一、对比表格二、目录2.1 服务2.2 数据2.3 安全 一、对比表格 下表从多个维度对服务治理、数据治理和安全治理进行详细对比,为读者提供一个直观而全面的参考框架。 维度服务治理数据治理安全治理定义对软件开发全流程、应用交付及API和接口管理进行规范化…...

开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微调-LLaMA-Factory-单机单卡-V100(一)

一、前言 如今,大语言模型领域热闹非凡,各种模型不断涌现。DeepSeek-R1-Distill-Qwen-7B 模型凭借其出色的效果和性能,吸引了众多开发者的目光。而 LLaMa-Factory 作为强大的微调工具,能让模型更好地满足个性化需求。 在本篇中&am…...

如何避免redis长期运行持久化AOF文件过大的问题:AOF重写

一、AOF 重写的核心作用 通过 重建 AOF 文件,解决以下问题: 体积压缩:消除冗余命令(如多次修改同一 key),生成最小操作集合。混合持久化支持(若启用 aof-use-rdb-preamble yes)&am…...

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…...

以下是一个使用 HTML、CSS 和 JavaScript 实现的登录弹窗效果示例

以下是一个使用 HTML、CSS 和 JavaScript 实现的登录弹窗效果示例&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>登录弹窗示例</title><style>body {font-family: Aria…...

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持&#xff0c;轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术&#xff0c;无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统&#xff0c;并全面拥抱 WebRTC 标准。这一特性确保了“一次开发&#xff0c;多端运行”的便捷性&#xff0c…...

LeetCode1287

LeetCode1287 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 给定一个非递减的整数数组 arr&#xff0c;其中有一个元素恰好出现超过数组长度的 25%。请你找到并返回这个元素。 示例 示例 1 输入: arr [1, 2, 2, 6, 6, 6, 6, 7,…...

【计算机网络】网络层数据包(Packet)格式

在计算机网络中&#xff0c;数据包&#xff08;Packet&#xff09; 是网络层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在不同网络之间传输数据。数据包的格式取决于具体的网络层协议&#xff08;如 IPv4、IPv6 等&#xff09;。以下是常见数据包格式的详细说…...

使用vite打包并部署vue项目到nginx

1 使用 Vite 创建 vue3 项目 Vite 是一个新型的前端构建工具&#xff0c;专为现代浏览器和工具链而设计&#xff0c;提供了极快的冷启动和热模块更新&#xff08;HMR&#xff09;速度。以下是使用 Vite 创建 Vue 3 项目的详细步骤&#xff1a; 一、安装 Node.js 和 npm 首先…...

深度学习笔记之自然语言处理(NLP)

深度学习笔记之自然语言处理(NLP) 在行将开学之时&#xff0c;我将开始我的深度学习笔记的自然语言处理部分&#xff0c;这部分内容是在前面基础上开展学习的&#xff0c;且目前我的学习更加倾向于通识。自然语言处理部分将包含《动手学深度学习》这本书的第十四章&#xff0c…...

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;ClearDiagnosticInformation_0x84服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月14日 关键词&#xff1a;UDS协议、0x84服务、清除诊断信息、ISO 14229-1:2023、ECU测试 一、服…...

自动化测试框架搭建-单次接口执行-三部曲

目的 判断接口返回值和提前设置的预期是否一致&#xff0c;从而判断本次测试是否通过 代码步骤设计 第一步&#xff1a;前端调用后端已经写好的POST接口&#xff0c;并传递参数 第二步&#xff1a;后端接收到参数&#xff0c;组装并请求指定接口&#xff0c;保存返回 第三…...

Spring Bean的生命周期和作用域

一、Bean 生命周期 Bean的定义Bean的实例化属性注入Bean的初始化Bean的使用Bean的销毁 可以增强的位置&#xff1a; PostConstruct&#xff1a;属性注入后&#xff0c;afterPropertiesSet方法 &#xff08;前提实现&#xff1a;InitializingBean接口&#xff09;前增强。 Pr…...

DeepSeek R1生成图片总结2(虽然本身是不能直接生成图片,但是可以想办法利用别的工具一起实现)

DeepSeek官网 目前阶段&#xff0c;DeepSeek R1是不能直接生成图片的&#xff0c;但可以通过优化文本后转换为SVG或HTML代码&#xff0c;再保存为图片。另外&#xff0c;Janus-Pro是DeepSeek的多模态模型&#xff0c;支持文生图&#xff0c;但需要本地部署或者使用第三方工具。…...

ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用

ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用 &#x1f4cd;项目地址&#xff1a;https://github.com/lvgl/lv_port_esp32参考文章&#xff1a;https://blog.csdn.net/chentuo2000/article/details/126668088https://blog.csdn.net/p1279030826/article/details/…...