【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语言展现了其巨大的优势:
性能卓越
:Go是一种编译型语言,能够直接编译为机器代码,具有接近C语言的执行效率,非常适合高性能的微服务开发,尤其是在需要处理大量并发请求时。简洁易学
:Go的语法设计非常简洁明了,易于理解,开发人员上手快速。与传统的面向对象语言相比,Go更加注重程序的简单性,适合快速开发和迭代。内建的并发支持
:Go的并发模型通过groutine
和channel
提供了高效且简洁的方式来处理并发任务。这使得Go在处理大量并发请求时表现出色,适用于构建高并发、高吞吐量的微服务系统。强大的工具链
:Go语言自带的工具链(如go build
、go test
、go fmt
)非常方便,能够提高开发效率,减少开发人员的工作量。同时,Go的标准库功能丰富,能满足很多开发需求。广泛的应用场景
:由于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:运行服务
- 先启动服务端:
go run server.go
- 然后再启动客户端:
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 如何实现微服务监控与日志管理
- 使用 Prometheus 和 Grafana 进行监控
Prometheus 是一个开源的监控系统,它通过抓取指标数据并存储在时序数据库中,帮助我们实时监控微服务的健康状态。Grafana 则是一个可视化工具,可以帮助我们展示 Prometheus 存储的数据并创建各种仪表板。 - 使用 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 语言中的实…...
数据结构:栈(Stack)及其实现
栈(Stack)是计算机科学中常用的一种数据结构,它遵循先进后出(Last In, First Out,LIFO)的原则。也就是说,栈中的元素只能从栈顶进行访问,最后放入栈中的元素最先被取出。栈在很多应用…...
DeepSeek在linux下的安装部署与应用测试
结合上一篇文章,本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型,主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署,Open WebUI官网也提供了完整的docker部署说明,大家可…...
Next.js【详解】获取数据(访问接口)
Next.js 中分为 服务端组件 和 客户端组件,内置的获取数据各不相同 服务端组件 方式1 – 使用 fetch export default async function Page() {const data await fetch(https://api.vercel.app/blog)const posts await data.json()return (<ul>{posts.map((…...
pnpm, eslint, vue-router4, element-plus, pinia
利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错,prettier用于美观) 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具(git的钩子工具,可以在特定实际执行特…...
将jar安装到Maven本地仓库中
将jar安装到Maven本地仓库中 1. 使用 mvn install:install-file 命令模版示例 2.项目中添加依赖 将一个 .jar 文件安装到 Maven 本地仓库中是一个常见的操作,尤其是在你想要在本地测试一个尚未发布到中央仓库的库时。以下是如何将 .jar 文件安装到 Maven 本地仓库的…...
Spring 和 Spring MVC 的关系是什么?
Spring和Spring MVC的关系就像是“大家庭和家里的小书房”一样。 Spring是一个大家庭,提供了各种各样的功能和服务,比如管理Bean的生命周期、事务管理、安全性等,它是企业级应用开发的全方位解决方案。这个大家庭里有很多房间,每个…...
Ollama ModelFile(模型文件)
1. 什么是 Modelfile? Modelfile 是 Ollama 的配置文件,用于定义和自定义模型的行为。通过它,你可以: 基于现有模型(如 llama2、mistral)创建自定义版本 调整生成参数(如温度、重复惩罚&#…...
基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...
基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例
简简单单 Online zuozuo :本心、输入输出、结果 文章目录 基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例前言下载 Ollama实际部署所需的硬件要求设置 LLM 使用 GPU ,发挥 100% GPU 性能Ollama 大模型管理命令大模型的实际运行资源消耗基于 Ollam…...
大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何选择?
简介:在人工智能飞速发展的今天,大模型已经成为推动技术革新的核心力量。无论是智能客服、内容创作,还是科研辅助、代码生成,大模型的身影无处不在。然而,面对市场上琳琅满目的工具,如何挑选最适合自己的那…...
【05】密码学与隐私保护
5-1 零知识证明 零知识证明介绍 零知识证明的概念 设P(Prover)表示掌握某些信息,并希望证实这一事实的实体,V(Verifier)是验证这一事实的实体。 零知识证明是指P试图使V相信某一个论断是正确的,但却不向…...
Flink SQL与Doris实时数仓Join实战教程(理论+实例保姆级教程)
目录 第一章:Regular Joins 深度解析 1.1 核心原理与适用场景 1.2 电商订单 - 商品实时关联案例 1.2.1 数据流设计 1.2.2 Doris 表设计优化 1.2.3 性能调优要点 第二章:Interval Joins 实战应用 2.1 时间区间关联原理 2.2 优惠券使用有效性验证 2.2.1 业务场景说明 …...
DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)
一、前言 这份报告旨在应对数字化转型过程中数据安全面临的挑战,并提供全面的管理与技术体系建设框架。报告首先分析了数字化社会的发展背景,强调了数据安全在国家安全层面的重要性,并指出数据安全风险的来源和防护措施。接着,报…...
【Github每日推荐】-- 2024 年项目汇总
1、AI 技术 项目简述OmniParser一款基于纯视觉的 GUI 智能体,能够准确识别界面上可交互图标以及理解截图中各元素语义,实现自动化界面交互场景,如自动化测试、自动化操作等。ChatTTS一款专门为对话场景设计的语音生成模型,主要用…...
【Spring详解一】Spring整体架构和环境搭建
一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心ÿ…...
Spring Boot(8)深入理解 @Autowired 注解:使用场景与实战示例
搞个引言 在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…...
Machine Learning:Optimization
文章目录 局部最小值与鞍点 (Local Minimum & Saddle Point)临界点及其种类判断临界值种类 批量与动量(Batch & Momentum)批量大小对梯度下降的影响动量法 自适应学习率AdaGradRMSPropAdam 学习率调度优化总结 局部最小值与鞍点 (Local Minimum & Saddle Point) 我…...
wordpress get_footer();与wp_footer();的区别的关系
在WordPress中,get_footer() 和 wp_footer() 是两个不同的函数,它们在主题开发中扮演着不同的角色,但都与页面的“页脚”部分有关。以下是它们的区别和关系: 1. get_footer() get_footer() 是一个用于加载页脚模板的函数。它的主…...
Windows Docker运行Implicit-SVSDF-Planner
Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器,挂载主机的D:/Github文…...
设计模式14:职责链模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者链传递,直到有一个处理者能够处理该请求。这种模式通过…...
Golang GORM系列:GORM并发与连接池
GORM 是一个流行的 Go 语言 ORM(对象关系映射)库,用于简化数据库操作。它支持连接池和并发访问功能,这些功能对于高性能、高并发的应用场景非常重要。本文结合示例详细介绍gorm的并发处理能力,以及如何是哟个连接池提升…...
linux笔记:shell中的while、if、for语句
在Udig软件的启动脚本中使用了while循环、if语句、for循环,其他内容基本都是变量的定义,所以尝试弄懂脚本中这三部分内容,了解脚本执行过程。 (1)while循环 while do循环内容如下所示,在循环中还用了expr…...
【Java】逻辑运算符详解:、|| 与、 | 的区别及应用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 💯前言💯一、基本概念与运算符介绍💯二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. …...
Java 设计模式之解释器模式
文章目录 Java 设计模式之解释器模式概述UML代码实现 Java 设计模式之解释器模式 概述 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定…...
关于前后端分离跨域问题——使用DeepSeek分析查错
我前端使用ant design vue pro框架,后端使用kratos框架开发。因为之前也解决过跨域问题,正常是在后端的http请求中加入中间件,设置跨域需要通过的字段即可,代码如下所示: func NewHTTPServer(c *conf.Server, s *conf…...
Linux下ioctl的应用
文章目录 1、ioctl简介2、示例程序编写2.1、应用程序编写2.2、驱动程序编写 3、ioctl命令的构成4、测试 1、ioctl简介 ioctl(input/output control)是Linux中的一个系统调用,主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/…...
Windows 环境下 Grafana 安装指南
目录 下载 Grafana 安装 Grafana 方法 1:使用 .msi 安装程序(推荐) 方法 2:使用 .zip 压缩包 启动 Grafana 访问 Grafana 配置 Grafana(可选) 卸载 Grafana(如果需要) 下载 G…...
【操作系统】操作系统概述
操作系统概述 1.1 操作系统的概念1.1.1 操作系统定义——什么是OS?1.1.2 操作系统作用——OS有什么用?1.1.3 操作系统地位——计算机系统中,OS处于什么地位?1.1.4 为什么学操作系统? 1.2 操作系统的历史1.2.1 操作系统…...
基于SSM+uniapp的鲜花销售小程序+LW示例参考
1.项目介绍 系统角色:管理员、商户功能模块:用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试环境&#x…...
第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入
3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述,总结一下就是:软件设计模式中有一种叫做【控制反转】的设计模式,而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入,是学习怎样实现控…...
排序与算法:插入排序
执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,…...
uniapp 打包安卓 集成高德地图
接入高德地图 let vm this;uni.chooseLocation({success: function (res) {// console.log(位置名称: res.name);// console.log(详细地址: res.address);// console.log(纬度: res.latitude);// console.log(经度: res.long…...
python爬虫系列课程2:如何下载Xpath Helper
python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…...
win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统
目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统,报错:Operating System not found 二、原因分析 国产系统,需要注意的点: 需要看你的系统类…...
基于微信小程序的宿舍报修管理系统设计与实现,SpringBoot(15500字)+Vue+毕业论文+指导搭建视频
运行环境 jdkmysqlIntelliJ IDEAmaven3微信开发者工具 项目技术SpringBoothtmlcssjsjqueryvue2uni-app 宿舍报修小程序是一个集中管理宿舍维修请求的在线平台,为学生、维修人员和管理员提供了一个便捷、高效的交互界面。以下是关于这些功能的简单介绍: …...
分布式同步锁:原理、实现与应用
分布式同步锁:原理、实现与应用 引言1. 分布式同步锁的基本概念1.1 什么是分布式同步锁?1.2 分布式锁的特性 2. 分布式锁的实现方式2.1 基于数据库的分布式锁实现原理优缺点示例 2.2 基于 Redis 的分布式锁实现原理优缺点示例Redlock 算法 2.3 基于 ZooK…...
Chrome多开终极形态解锁!「窗口管理工具+IP隔离插件
Web3项目多开,继ads指纹浏览器钱包被盗后,更多人采用原生chrome浏览器,当然对于新手,指纹浏览器每月成本也是一笔不小开支,今天逛Github发现了这样一个解决方案,作者开发了窗口管理工具IP隔离插件ÿ…...
FreeSwitch的应用类模块
FreeSWITCH 应用类模块(Applications)完整表格 模块名称功能描述mod_callcenter提供呼叫中心功能,支持队列、座席管理、监控等。mod_conference提供多方会议功能,支持音频、视频会议。mod_blacklist提供黑名单功能,阻…...
【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python
6123. 哞叫时间 Week 1 2月18日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛以…...
Unity 淡入淡出
淡入(Fade in):类似打开幕布 淡出(Fade out):类似关上幕布 方案一 使用Dotween(推荐) using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class Test : MonoB…...
PBR光照模型相关知识
PBR是基于物理的光照模型,与lambert光照模型以及Blinn-Phong光照模型有所不同 一、三种光照模型的区别 原理基础 Lambert 光照模型:基于朗伯余弦定律,该定律表明,漫反射光的强度与入射光的方向和物体表面法线的夹角的余弦值成正比…...
【Go | 从0实现简单分布式缓存】-2:HTTP服务端与一致性哈希
本文目录 一、回顾1.1 复习接口 二、http标准库三、实现HTTP服务端四、一致性哈希 本文为极客兔兔“动手写分布式缓存GeeCache”学习笔记。 一、回顾 昨天已经开发了一部分项目,我们先来看看项目结构。 分布式缓存需要实现节点间通信,建立基于 HTTP 的…...
STM32 低功耗模式
目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…...
Docker__持续更新......
Docker 1. 基本知识1.1 为什么有Docker?1.2 Docker架构与容器化 画图解释 画图解释2. 项目实战 1. 基本知识 1.1 为什么有Docker? 用一行命令跨平台安装项目,在不同平台上运行项目。把项目打包分享运行应用。 1.2 Docker架构与容器化 准备机器,在机…...
什么是语料清洗、预训练、指令微调、强化学习、内容安全; 什么是megatron,deepspeed,vllm推理加速框架
什么是语料清洗、预训练、指令微调、强化学习、内容安全 目录 什么是语料清洗、预训练、指令微调、强化学习、内容安全语料清洗预训练指令微调强化学习内容安全什么是megatron,deepspeed,vllm推理加速框架语料清洗 语料清洗是对原始文本数据进行处理的过程,旨在去除数据中的…...