第33章 - Go语言 云原生开发
第33章 - 云原生开发将深入探讨云原生技术及其在现代软件开发中的应用。我们将从云原生的基本概念开始,逐步介绍Kubernetes的基本使用方法,并结合具体的云服务提供商实例,通过Go语言编写的应用程序来展示如何实现云原生开发。
33.1 云原生的概念
云原生(Cloud Native)是一种构建和运行应用程序的方法,它充分利用云计算的优势,以快速、灵活、可扩展的方式开发和部署应用。云原生应用通常具备以下特点:
- 微服务架构:将应用拆分为一系列小的服务,每个服务实现特定的业务功能,并且可以独立地进行开发、测试、部署和扩展。
- 容器化:使用容器(如Docker)来打包应用及其依赖,确保应用在不同环境中具有一致的行为。
- 持续集成/持续部署 (CI/CD):自动化地构建、测试和部署应用,加快软件交付速度。
- 动态管理:利用云平台提供的服务自动管理应用的生命周期,包括负载均衡、自动扩缩容等。
- 面向服务的架构:强调服务之间的解耦,使系统更加模块化,易于维护和更新。
33.2 Kubernetes入门
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化的应用。Kubernetes的主要组件包括:
- Pods:Kubernetes中最小的部署单元,可以包含一个或多个容器。
- Services:定义了访问Pods的方式,提供负载均衡和网络服务发现。
- Deployments:描述了应用的理想状态,Kubernetes会自动保证这个状态。
- ReplicaSets:确保任意时刻都有指定数量的Pod副本处于运行状态。
- Volumes:为Pods提供存储卷,支持数据持久化。
33.3 云服务提供商
云服务提供商(CSPs)提供了丰富的服务来支持云原生开发,例如:
- 阿里云:提供了一站式的云原生解决方案,包括容器服务ACK、Serverless应用引擎SAE等。
- AWS:Amazon Web Services 提供了广泛的云原生服务,如EKS(Elastic Kubernetes Service)、Lambda等。
- Google Cloud:提供了GKE(Google Kubernetes Engine)等服务,支持高效管理和扩展Kubernetes集群。
33.4 结合案例及源代码
假设我们正在开发一个基于Go语言的简单Web应用,该应用将部署在一个Kubernetes集群上,并使用阿里云的容器服务ACK来管理这个集群。
应用设计
我们的应用将是一个简单的RESTful API服务器,提供用户信息的查询和创建功能。
技术栈
- 后端:Go语言 + Gin框架
- 数据库:MySQL
- 容器化:Docker
- 编排:Kubernetes
- 云服务:阿里云容器服务ACK
源代码示例
下面是一个简单的Go应用示例,使用Gin框架实现了一个基本的API接口。
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 路由处理r.GET("/users", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello from the user service!",})})// 启动服务r.Run(":8080")
}
Dockerfile
为了容器化我们的应用,我们需要创建一个Dockerfile
文件:
FROM golang:1.17-alpine as builder
WORKDIR /app
COPY . .
RUN go build -o app .FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]
部署到Kubernetes
创建一个Kubernetes Deployment和Service来部署我们的应用:
apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-webports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
使用阿里云ACK
- 在阿里云控制台创建一个新的Kubernetes集群。
- 将上面的YAML文件应用到你的集群中,可以通过
kubectl apply -f deployment.yaml
命令完成。 - 访问Service的外部IP地址,测试你的应用是否正常工作。
33.5 优化应用性能
在云原生环境中,优化应用性能是至关重要的。以下是一些常见的优化策略:
1. 资源限制与请求
在Kubernetes中,可以为Pod设置资源限制(limits)和请求(requests),以确保每个Pod都能获得所需的资源,同时防止某个Pod占用过多资源导致其他Pod资源不足。
apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: example-containerimage: your-imageresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"
2. 水平自动扩展
Kubernetes提供了Horizontal Pod Autoscaler(HPA),可以根据CPU使用率或其他自定义指标自动调整Pod的数量。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: go-web-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: go-web-appminReplicas: 3maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
3. 缓存与CDN
使用缓存和内容分发网络(CDN)可以显著提高应用的响应时间和用户体验。例如,可以使用Redis作为缓存层,或者使用阿里云的CDN服务来加速静态资源的加载。
33.6 确保应用安全性
在云原生环境中,安全是不可忽视的重要方面。以下是一些常见的安全措施:
1. 网络策略
Kubernetes网络策略(Network Policies)可以控制Pod之间的通信,确保只有授权的流量才能到达目标Pod。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: go-web-app-policy
spec:podSelector:matchLabels:app: go-webingress:- from:- podSelector:matchLabels:app: frontendports:- protocol: TCPport: 8080
2. 身份验证与授权
使用OAuth2、OpenID Connect等协议进行身份验证和授权,确保只有经过认证的用户才能访问应用的敏感数据。
3. 加密传输
使用HTTPS协议加密传输数据,确保数据在传输过程中不被窃取或篡改。
33.7 利用云服务提供商的高级特性
云服务提供商通常提供许多高级特性来提升应用的可靠性和可维护性。以下是一些常见的高级特性:
1. 监控与日志
使用阿里云的ARMS(Application Real-Time Monitoring Service)和SLS(Log Service)来监控应用的性能和日志,及时发现并解决问题。
2. 备份与恢复
利用阿里云的RDS(Relational Database Service)自动备份功能,确保数据的安全性和可恢复性。
3. 服务网格
使用阿里云的服务网格ASM(Alibaba Cloud Service Mesh)来管理微服务之间的通信,提供统一的服务治理能力。
33.8 实战案例
假设我们正在开发一个电商应用,该应用需要处理大量的用户请求和数据操作。以下是具体的技术方案和步骤:
1. 应用架构
- 前端:React应用,托管在阿里云OSS(Object Storage Service)上,使用CDN加速。
- 后端:Go语言开发的API服务,使用Gin框架。
- 数据库:MySQL,托管在阿里云RDS上。
- 缓存:Redis,托管在阿里云KVStore上。
- 消息队列:RabbitMQ,托管在阿里云MQ上。
- 容器编排:Kubernetes,使用阿里云ACK管理。
2. 部署流程
- 代码仓库:将应用代码托管在GitHub或GitLab上。
- 持续集成/持续部署(CI/CD):使用Jenkins或GitHub Actions自动化构建和测试流程。
- 镜像构建:使用Docker构建应用镜像,并推送到阿里云CR(Container Registry)。
- Kubernetes部署:使用Helm或Kustomize管理Kubernetes资源文件,通过
kubectl
命令将应用部署到ACK集群。 - 服务发现:使用Kubernetes的Service和Ingress资源进行服务发现和路由管理。
- 监控与告警:使用Prometheus和Grafana监控应用性能,使用Alertmanager配置告警规则。
3. 示例代码
以下是一个简单的Go应用示例,展示了如何连接到MySQL数据库并执行查询操作:
package mainimport ("database/sql""fmt""log""net/http"_ "github.com/go-sql-driver/mysql""github.com/gin-gonic/gin"
)var db *sql.DBfunc initDB() {var err errordsn := "user:password@tcp(db-service:3306)/dbname"db, err = sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}if err = db.Ping(); err != nil {log.Fatal(err)}
}func getUser(c *gin.Context) {rows, err := db.Query("SELECT id, name FROM users")if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}defer rows.Close()var users []map[string]interface{}for rows.Next() {var id intvar name stringif err := rows.Scan(&id, &name); err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}users = append(users, map[string]interface{}{"id": id, "name": name})}c.JSON(http.StatusOK, users)
}func main() {initDB()defer db.Close()r := gin.Default()r.GET("/users", getUser)r.Run(":8080")
}
4. Dockerfile
FROM golang:1.17-alpine as builder
WORKDIR /app
COPY . .
RUN go build -o app .FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]
5. Kubernetes资源配置
apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080env:- name: MYSQL_HOSTvalue: "db-service"- name: MYSQL_PORTvalue: "3306"- name: MYSQL_USERvalue: "user"- name: MYSQL_PASSWORDvalue: "password"- name: MYSQL_DBvalue: "dbname"
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-webports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
33.9 总结
通过本章的学习,我们深入了解了云原生开发的核心概念和技术栈,掌握了如何使用Kubernetes和阿里云服务来构建、部署和管理云原生应用。通过实际的案例和源代码,我们展示了如何优化应用性能、确保应用安全,并利用云服务提供商的高级特性来提升应用的可靠性和可维护性。
接下来我们将继续深入探讨一些高级主题,包括如何进行故障排除、如何实现多环境管理、如何进行灰度发布和蓝绿部署,以及如何利用云原生工具进行持续集成和持续部署(CI/CD)。
33.10 故障排除
在云原生环境中,故障排除是一项重要技能。以下是一些常见的故障排除方法和工具:
1. 日志分析
使用Kubernetes的kubectl logs
命令查看Pod的日志,帮助诊断应用问题。
kubectl logs <pod-name>
如果应用使用了集中式日志系统(如阿里云SLS),可以通过日志搜索和分析工具来快速定位问题。
2. 事件查看
使用kubectl get events
命令查看集群中的事件,了解Kubernetes资源的状态变化。
kubectl get events --sort-by=.metadata.creationTimestamp
3. 网络调试
使用kubectl exec
命令进入Pod内部,使用网络工具(如curl
、netstat
)进行网络调试。
kubectl exec -it <pod-name> -- /bin/sh
4. 性能监控
使用Prometheus和Grafana监控应用的性能指标,如CPU使用率、内存使用率、请求延迟等。
33.11 多环境管理
在云原生开发中,通常需要管理多个环境,如开发环境、测试环境和生产环境。以下是一些常见的多环境管理方法:
1. Kubernetes命名空间
使用Kubernetes命名空间(Namespace)隔离不同的环境,每个环境使用一个独立的命名空间。
apiVersion: v1
kind: Namespace
metadata:name: dev
---
apiVersion: v1
kind: Namespace
metadata:name: test
---
apiVersion: v1
kind: Namespace
metadata:name: prod
2. 配置管理
使用ConfigMap和Secret管理环境变量和敏感信息,避免硬编码在代码中。
apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:app.env: "dev"app.log.level: "debug"
---
apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:db.password: <base64-encoded-password>
3. 环境变量注入
在Deployment中注入环境变量,根据不同的环境配置不同的值。
apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080envFrom:- configMapRef:name: app-config- secretRef:name: app-secret
33.12 灰度发布和蓝绿部署
灰度发布和蓝绿部署是两种常见的发布策略,可以帮助减少新版本上线的风险。
1. 灰度发布
灰度发布是指在新版本完全上线之前,先让一部分用户使用新版本,收集反馈和监控数据,再决定是否全面推广。
示例
使用Kubernetes的Ingress和Service实现灰度发布。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: go-web-ingressannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10"
spec:rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: go-web-canaryport:number: 80
---
apiVersion: v1
kind: Service
metadata:name: go-web-canary
spec:selector:app: go-web-canaryports:- protocol: TCPport: 80targetPort: 8080
2. 蓝绿部署
蓝绿部署是指在新版本上线时,保留旧版本的运行环境,新版本在新的环境中运行,确认无误后再切换流量到新版本。
示例
使用Kubernetes的Deployment和Service实现蓝绿部署。
apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app-green
spec:replicas: 3selector:matchLabels:app: go-web-greentemplate:metadata:labels:app: go-web-greenspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-web-greenports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
33.13 持续集成和持续部署(CI/CD)
CI/CD是现代软件开发的重要实践,可以帮助团队更快、更可靠地交付软件。以下是一些常见的CI/CD工具和实践:
1. GitHub Actions
GitHub Actions是一个强大的CI/CD工具,可以直接在GitHub仓库中配置流水线。
示例
创建一个.github/workflows/ci-cd.yml
文件,配置CI/CD流水线。
name: CI/CD Pipelineon:push:branches:- mainjobs:build-and-deploy:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: 1.17- name: Build applicationrun: go build -o app .- name: Build Docker imagerun: docker build -t your-docker-repo/go-web-app:latest .- name: Push Docker imagerun: |echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdindocker push your-docker-repo/go-web-app:latest- name: Deploy to Kubernetesrun: |kubectl apply -f k8s/deployment.yamlkubectl apply -f k8s/service.yamlenv:KUBECONFIG: ${{ secrets.KUBECONFIG }}
2. Jenkins
Jenkins是一个流行的CI/CD工具,支持多种插件和集成方式。
示例
创建一个Jenkinsfile,配置CI/CD流水线。
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/your-repo/go-web-app.git'}}stage('Build') {steps {sh 'go build -o app .'}}stage('Test') {steps {sh 'go test ./...'}}stage('Build Docker Image') {steps {sh 'docker build -t your-docker-repo/go-web-app:latest .'}}stage('Push Docker Image') {steps {withCredentials([usernamePassword(credentialsId: 'docker-credentials', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {sh '''echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdindocker push your-docker-repo/go-web-app:latest'''}}}stage('Deploy to Kubernetes') {steps {withKubeConfig([credentialsId: 'kubeconfig-credentials']) {sh 'kubectl apply -f k8s/deployment.yaml'sh 'kubectl apply -f k8s/service.yaml'}}}}
}
33.14 总结
通过本章的学习,我们不仅深入探讨了云原生开发的核心概念和技术栈,还学习了如何进行故障排除、多环境管理、灰度发布和蓝绿部署,以及如何利用CI/CD工具实现持续集成和持续部署。
希望这些内容能够帮助你在云原生开发的道路上更进一步,构建出高效、稳定、可扩展的应用。如果你有任何问题或需要进一步的帮助,请随时联系我。
相关文章:
第33章 - Go语言 云原生开发
第33章 - 云原生开发将深入探讨云原生技术及其在现代软件开发中的应用。我们将从云原生的基本概念开始,逐步介绍Kubernetes的基本使用方法,并结合具体的云服务提供商实例,通过Go语言编写的应用程序来展示如何实现云原生开发。 33.1 云原生的…...
springboot配置多数据源mysql+TDengine保姆级教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pom文件二、yamlDataSourceConfigServiceMapper.xml测试总结 前言 Mybatis-plus管理多数据源,数据库为mysql和TDengine。 一、pom文件 <de…...
RocketMQ负载均衡机制解析
消费者在消费消息的时候,需要知道从Broker的哪一个消息队列中去获取消息。 ❝ 所以,在消费者端必须要做负载均衡,即Broker端中多个消费队列分配给同一个消费者组中的哪些消费者消费。 在RocketMQ中,在消费者端有一个:R…...
PyTorch 模型转换为 ONNX 格式
PyTorch 模型转换为 ONNX 格式 在深度学习领域,模型的可移植性和可解释性是非常重要的。本文将介绍如何使用 PyTorch 训练一个简单的卷积神经网络(CNN)来分类 MNIST 数据集,并将训练好的模型转换为 ONNX 格式。我们还将讨论 PTH …...
大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
【人工智能】使用Python实现序列到序列(Seq2Seq)模型进行机器翻译
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Sequence-to-Sequence, Seq2Seq)模型是解决序列输入到序列输出任务的核心架构,广泛应用于机器翻译、文本摘要和问答系统等自然语言处理任务中。本篇文章深入介绍 Seq2Seq 模型的原理及其核心组件(…...
elasticsearch安装ik分词器
本文主要记录如何安装ik分词器,如果你刚好刷到了这篇文章,希望对你有所帮助。 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式&…...
QT6之主站freemodbus1.6移植
本次使用的QT是6.8 下载1.6的freemodbus资源包:至少以上的吧 随便下载:官网也可以这个是STM芯片的教程,移植基本一样,略有不同; STM32 移植FreeModbus详细过程-CSDN博客 移植freemodbus: 添加资源文件&a…...
【错误❌】——槽函数定义好但未初始化
public slots:void onClose(); 初始化即可成功:...
数据结构(理解)
探索数据结构:计算机世界的基石 在计算机科学的领域中,数据结构就如同建筑中的基石,它们支撑着整个软件世界的运行。无论是简单的应用程序,还是复杂的大型系统,数据结构都在其中起着至关重要的作用。 一、什么是数据结…...
ROS2 细节知识学习
1. rosidl_generate_interfaces() 在 ROS2 中,rosidl_generate_interfaces是一个关键的构建工具功能。它主要用于从接口定义文件(如.msg消息文件、.srv服务文件和.action动作文件)生成不同编程语言(如 C、Python 等)可…...
SQL进阶——JOIN操作详解
在数据库设计中,数据通常存储在多个表中。为了从这些表中获取相关的信息,我们需要使用JOIN操作。JOIN操作允许我们通过某种关系(如相同的列)将多张表的数据结合起来。它是SQL中非常重要的操作,广泛应用于实际开发中。本…...
Android studio 签名加固后的apk文件
Android studio打包时,可以选择签名类型v1和v2,但是在经过加固后,签名就不在了,或者只有v1签名,这样是不安全的。 操作流程: 1、Android studio 对项目进行打包,生成有签名的apk文件ÿ…...
Mybatis-基础操作
Mybatis的基础操作就是通过Mybatis完成对数据的增删改查。我们通过例子来引入这些操作,之前的项目较久远,因此我们从零开始进行准备工作: 搭建项目 一、创建数据库user_list并插入数据: -- 创建数据库 create table user_list …...
【工具】JS解析XML并且转为json对象
【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…...
软件测试技术面试题及参考答案整理
一、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。 兼容的类型,如果细分的话,有平台的兼容,网络兼…...
Python学习36天
面向对象编程综合 # 创建父类 class Employee:# 创建私有属性__name None__salary None# 创建构造器初始化属性def __init__(self, __name, __salary):self.__name __nameself.__salary __salarydef get_annual(self):# 返回员工年薪return self.__salary * 12# 创建公共方…...
C语言——海龟作图(对之前所有内容复习)
一.问题描述 海龟作图 设想有一只机械海龟,他在C程序控制下在屋里四处爬行。海龟拿了一只笔,这支笔或者朝上,或者朝下。当笔朝下时,海龟用笔画下自己的移动轨迹;当笔朝上时,海龟在移动过程中什么也不画。 …...
关于如何在k8s中搭建一个nsfw黄图鉴定模型
随着现在应用内图片越来越多,安全审查也是必不可少的一个操作了 下面手把手教你如何将huggingface中的黄图检测模型部署到自己的服务器上去 1.找到对应的模型 nsfw_image_detection 2.在本地先验证如何使用 首先安装transformers python库 pip install transform…...
istio结合wasm插件的实际应用
在 Istio 中,WASM 插件的常见使用场景和功能包括以下几个方面: 1. 流量管理与请求修改 请求与响应头处理:动态添加、删除或修改 HTTP 请求或响应头。URL 重写:根据特定规则调整请求的路径或参数。请求路由增强:实现复…...
日志logrus
https://blog.csdn.net/m0_70982551/article/details/143095729 https://blog.csdn.net/wslyk606/article/details/81670713 https://www.bilibili.com/opus/1002468521099132928 地鼠文档:https://www.topgoer.cn/docs/goday/goday-1crg2adjknouc 极客文档…...
11.29 代码随想录Day45打卡(动态规划)
115.不同的子序列 题目:给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题解: class Solution:def numDistinct(self, s: str, t: str) -> int:dp [[0] * (len(t) 1) for _ in range(len(s) 1)]for i in range…...
springboot336社区物资交易互助平台pf(论文+源码)_kaic
毕 业 设 计(论 文) 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此ÿ…...
【Maven】Nexus私服
6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。一些无法从外部仓库下载到的构件,如项目组其他人员开发的…...
【python量化教程】如何使用必盈API的股票接口,获取最新分时KDJ数据
分时KDJ数据简介 股票分时 KDJ 数据是用于分析股票盘中短期走势的指标。它由未成熟随机指标 RSV 计算出 K 值、D 值、J 值。取值范围上,K 和 D 是 0 - 100,J 值可超出此范围。20 以下为超卖区、80 以上是超买区。关键信号有金叉(预示上涨&am…...
DI依赖注入详解
DI依赖注入 声明了一个成员变量(对象)之后,在该对象上面加上注解AutoWired注解,那么在程序运行时,该对象自动在IOC容器中寻找对应的bean对象,并且将其赋值给成员变量,完成依赖注入。 AutoWire…...
mysql sql语句 between and 是否边界值
在 MySQL 中,使用 BETWEEN 运算符时,边界值是包括在内的。这意味着 BETWEEN A AND B 查询会返回 A 和 B 之间的所有值,包括 A 和 B 自身。 示例 假设有一个表 employees,其中有一个 salary 列,您可以使用以下查询&am…...
飞塔防火墙只允许国内IP访问
飞塔防火墙只允许国内IP访问 方法1 新增地址对象,注意里面已经细分为中国内地、中国香港、中国澳门和中国台湾 方法2 手动新增国内IP的对象组,目前好像一共有8632个,每个对象最多支持600个IP段...
宠物之家:基于SpringBoot的领养平台
第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上不…...
golang 实现比特币内核:如何接入 RPC 后端获得特定交易的二进制数据
我们非常关注解析比特币的二进制数据,这使得我们的工作看起来是可行的。比特币是一个分布式网络系统,这意味着它需要全球各地的节点协同工作,甚至比特币核心库也需要连接其他节点来帮助它,就像查询交易费一样。 世界上没有免费的午餐。当你使用比特币系统进行交易时,你需…...
QML学习 —— 34、视频媒体播放器(附源码)
效果 说明 您可以单独使用MediaPlayer播放音频内容(如音频),也可以将其与VideoOutput结合使用以渲染视频。VideoOutput项支持未转换、拉伸和均匀缩放的视频演示。有关拉伸均匀缩放演示文稿的描述,请参见fillMode属性描述。 播放可能出错问题 出现的问题: DirectS…...
宝塔Linux面板上传PHP文件或者修改PHP文件,总是转圈圈,其他文件正常,解决办法
目录 问题描述 寻找解决方案 1.重启宝塔面板 2.清理宝塔缓存 3.升级面板 4.ssh远程 5.清空回收站 6.换网络 7. IDE远程编辑 总结: 问题描述 一直用宝塔linux面板,感觉非常好用,点点就能搞定,环境也很好配置。 公司搬家&…...
Flink——进行数据转换时,报:Recovery is suppressed by NoRestartBackoffTimeStrategy
热词统计案例: 用flink中的窗口函数(apply)读取kafka中数据,并对热词进行统计。 apply:全量聚合函数,指在窗口触发的时候才会对窗口内的所有数据进行一次计算(等窗口的数据到齐,才开始进行聚合…...
贪心算法题目合集
贪心算法题目合集 1319:【例6.1】排队接水 贪心策略思想 1319:【例6.1】排队接水 贪心策略思想 1319:【例6.1】排队接水 贪心算法与其说是算法,不如说是一种风格:每次做事情都选择自己认为的最优解。 贪心算法的题很…...
NSSCTF-做题笔记
[羊城杯 2020]easyre 查壳,无壳,64位,ida打开 encode_one encode_tow encode_three 那么我们开始一步一步解密,从最外层开始 def decode_three(encrypted_str):decrypted_str ""for char in encrypted_str:char_code …...
SpringBoot源码-spring boot启动入口ruan方法主线分析(一)
一、SpringBoot启动的入口 1.当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.ru…...
python json.dump()和json.dumps()的区别
用人话总结一下 json.dump()是针对文件的json和python的转换 json.dumps()主要是针对内容数据 json.dumps(obj, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, encoding“utf-8”, defaultNone, sort_keysFalse…...
快速排序hoare版本和挖坑法(代码注释版)
hoare版本 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>// 交换函数 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }// 打印数组 void _printf(int* a, int n) {for (int i 0; i < n; i) {printf("%d ", a[i]);}printf("…...
ELK(Elasticsearch + logstash + kibana + Filebeat + Kafka + Zookeeper)日志分析系统
文章目录 前言架构软件包下载 一、准备工作1. Linux 网络设置2. 配置hosts文件3. 配置免密登录4. 设置 NTP 时钟同步5. 关闭防火墙6. 关闭交换分区7. 调整内存映射区域数限制8. 调整文件、进程、内存资源限制 二、JDK 安装1. 解压软件2. 配置环境变量3. 验证软件 三、安装 Elas…...
SpringBoot中忽略实体类中的某个属性不返回给前端的方法
使用Jackson的方式: //第一种方式,使用JsonIgnore注解标注在属性上,忽略指定属性 public class PropertyDTO {JsonProperty("disable")private Integer disable;JsonProperty("placeholder")private String placeholde…...
Flink中普通API的使用
本篇文章从Source、Transformation(转换因子)、sink这三个地方进行讲解 Source: 创建DataStream本地文件SocketKafka Transformation(转换因子): mapFlatMapFilterKeyByReduceUnion和connectSide Outpu…...
【人工智能】从零构建一个文本分类器:用Python和TF-IDF实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 文本分类是自然语言处理(NLP)领域的基础任务之一,广泛应用于垃圾邮件检测、情感分析和新闻分类等场景。本篇文章从零开始,通过详细讲解 TF-IDF 特征提取方法,以及如何将其与机器学习算法结合,实现一…...
原型模式
功能:复制一个运行时的对象,包括对象各个成员当前的值。并且能够通过父类的指针来克隆出子类的对象 主要解决:在运行期建立原型 优点:性能提高、避免了构造函数的约束 步骤: 1、定义抽象原型,声明纯虚接…...
基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确
基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目,通过学习FM调制过程熟悉信号处理的一个简单流程,进而熟悉…...
open-instruct - 训练开放式指令跟随语言模型
文章目录 关于 open-instruct设置训练微调偏好调整RLVR 污染检查开发中仓库结构 致谢 关于 open-instruct github : https://github.com/allenai/open-instruct 这个仓库是我们对在公共数据集上对流行的预训练语言模型进行指令微调的开放努力。我们发布这个仓库,并…...
Java爬虫:获取1688商品详情接口的技术实现与代码示例
引言 1688作为中国领先的B2B电子商务平台,拥有海量的商品信息。对于商家和市场研究人员来说,能够从1688获取商品详情信息,对于市场分析、竞品研究等具有重要价值。本文将介绍如何使用Java编写爬虫,以合法、高效的方式获取1688商品…...
详解Rust泛型用法
文章目录 基础语法泛型与结构体泛型约束泛型与生命周期泛型与枚举泛型和Vec静态泛型(const 泛型)类型别名默认类型参数Sized Trait与泛型常量函数与泛型泛型的性能 Rust是一种系统编程语言,它拥有强大的泛型支持,泛型是Rust中用于实现代码复用和类型安全…...
Spring Boot拦截器(Interceptor)详解
拦截器Interceptor 拦截器我们主要分为三个方面进行讲解: 介绍下什么是拦截器,并通过快速入门程序上手拦截器拦截器的使用细节通过拦截器Interceptor完成登录校验功能 1. 快速入门 什么是拦截器? 是一种动态拦截方法调用的机制ÿ…...
STM32-- 看门狗--介绍、使用场景、失效场景
STM32 中的看门狗(Watchdog Timer,简称 WDG)有两种主要类型:独立看门狗(IWDG) 和 窗口看门狗(WWDG)。它们的喂狗机制各有特点,主要区别如下: 1. 独立看门狗&a…...
Perplexica - AI 驱动的搜索引擎
更多AI开源软件: AI开源 - 小众AIhttps://www.aiinn.cn/sources Perplexica 是一个开源的 AI 驱动的搜索工具或 AI 驱动的搜索引擎,可以深入互联网寻找答案。受 Perplexity AI 的启发,它是一个开源选项,不仅可以搜索网络…...