Go容器化微服务系统实战
1-1 本课的go微服务有什么不同?
聚焦于容器化可观测的购物微服务系统实战,通过介绍Go语言的应用趋势、容器化优势及微服务适用性,旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术,包括API网关层、接口层、应用层及领域层等模块。
第2章 Go微服务介绍与容器化入门
2-1 微服务基础介绍
微服务介绍
- 微服务首先他是一种架构模式
- 微服务相比较单体架构,微服务架构更独立,能够单独更新和发布
- 微服务里面的服务仅仅用于某一个特定的业务功能
- 特点
- 逻辑清晰
- 快速迭代
- 多语言灵活组合
微服务与DDD
领域驱动设计(Domain Driven Design,简称DDD )
还有个定律:康威定律(Conway’s Law)。就是说组织架构对应我们微服务拆分。
DDD的作用:真正决定软件复杂性的是设计方法
有助于指导我们确定系统边界
能够聚焦在系统核心元素上
帮助我们拆分系统
DDD常用概念-领域
领域:领域是有范围界限的,也可以说是有边界的
核心域:核心域是业务系统的核心价值
通用子域:所有子域的消费者,提供着通用服务(比如电商领域的短信、邮件就属于这个)
支撑子域:专注于业务系统的某一重要的业务
DDD常用概念-界限上下文
理解∶语文中的语境的意思
方式∶领域+界限上下文
目的:不在于如何划分边界,而在于如何控制边界
DDD常用概念-领域模型
理解∶领域模型是对我们软件系统中要解决问题的抽象表达。
领域∶反应的是我们业务上需要解决的问题
模型:我们针对该问题提出的解决方案、
2-2 微服务必备技能Docker入门介绍
2-3 go-micro基础之 grpc proto
2-4 go-micro 组件架构及通讯原理
2-5 go-micro 入门案例编写
2-6 go-micro 入门案例验证
第3章 微服务模块开发
micro_practice/user at main · yunixiangfeng/micro_practice · GitHub
3-1 micro new 和项目目录创建
开发目录和依赖包
项目目录搭建
# 使用容器方式micro/micro 这个容器创建不了--type=api 只能创建service 估计版本问题
sudo docker pull micro/micro
sudo docker run --rm -v $(pwd):$(pwd) -w $(pwd) micro/micro new user(user是我们需要开发的模块)
# 使用容器方式microhq/micro 这个容器暂时用不起来 老报错GOPATH路径找不到 改天研究一下
sudo docker run --rm -v $(pwd):$(pwd) -w $(pwd) microhq/micro new user(user是我们需要开发的模块)
# 直接安装环境 验证micro是否安装成功:micro --version
# 官网https://micro.mu/introduction 这里的最新版本已经不支持consul建议使用etcd
go get github.com/micro/micro
micro new user
Go module的使用
GORM基本介绍及使用
3-2 go mod 私有化设置 和 gorm 说明
3-3 编写proto并自动生成代码
user.proto
syntax = "proto3";package go.micro.service.user;service User {//注册rpc Register(UserRegisterRequest) returns (UserRegisterResponse) {}//登录rpc Login(UserLoginRequest) returns (UserLoginResponse) {}//查询用户信息rpc GetUserInfo(UserInfoRequest) returns (UserInfoResponse) {}
}message UserInfoRequest {string user_name = 1;
}message UserInfoResponse {int64 user_id = 1;string user_name = 2;string first_name = 3;
}message UserRegisterRequest {string user_name = 1;string first_name = 2;string pwd = 3;//... 其它信息
}message UserRegisterResponse {string message = 1;
}message UserLoginRequest {string user_name = 1;string pwd = 2;
}message UserLoginResponse {bool is_success = 1;
}
protoc -I ./ --go_out=./ --micro_out=./ ./proto/user/*.proto
3-4 domain对数据库和模型进行操作
D:\Workspace\Go\src\micro_practice\user\domain\service\user_data_service.go
3-5 编写Handel要暴露的服务
D:\Workspace\Go\src\micro_practice\user\handler\user.go
D:\Workspace\Go\src\micro_practice\user\main.go
3-6 go-micro开发流程梳理
D:\Workspace\Go\src\micro_practice\user\main.go
3-7 dockerfile 打包 user 功能
D:\Workspace\Go\src\micro_practice\user\Dockerfile
FROM alpineADD user /userENTRYPOINT [ "/user" ]
D:\Workspace\Go\src\micro_practice\user\Makefile
GOPATH:=$(shell go env GOPATH)
.PHONY: proto
proto:sudo docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) -e ICODE=CF388DF1EF1C5EBE cap1573/cap-protoc -I ./ --go_out=./ --micro_out=./ ./proto/user/*.proto.PHONY: build
build:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o user *.go.PHONY: test
test:go test -v ./... -cover.PHONY: dockerBuild
dockerBuild:sudo docker build -t user:latest .
make proto
make build
make dockerBuild
第4章 注册配置中心实现
https://github.com/yunixiangfeng/micro_practice/tree/main/category
4-1 注册中心的基本介绍
注册中心Consul原理介绍
Consul基本介绍
调用过程原理讲解及集群版本原理
Consul的安装和使用
注册中心Consul基本介绍
Consul是一种服务网格解决方案
提供具有服务发现,配置和分段功能的全功能控制平面
Consul 附带一个简单的内置代理,可以开箱即用
注册中心Consul关键功能
服务发现:客户端可以注册服务,程序可以轻松找到它们所依赖的服务
运行状况检查: Consul 客户端可以提供任意数量的运行状况检查
KV存储:应用程序可以将 Consul 的层级键/值存储用于任何目的包括动态配置,功能标记,协调,领导者选举等
注册中心Consul两个重要协议
Gossip Protocol(八卦协议)
Raft Protocol(选举协议)
4-2 注册中心的安装
注册中心Consul安装
docker pull cap1573/consu
docker run -d -p 8500:8500 cap1573/consul
Consul web 管理界面简单说明
4-3 分类模块目录结构生成
4-4 编写对外暴露的服务
D:\Workspace\Go\src\micro_practice\category\Makefile
GOPATH:=$(shell go env GOPATH)
.PHONY: proto
proto:sudo docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) -e ICODE=CF388DF1EF1C5EBE cap1573/cap-protoc -I ./ --micro_out=./ --go_out=./ ./proto/category/category.proto.PHONY: build
build: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o category-service *.go.PHONY: test
test:go test -v ./... -cover.PHONY: docker
docker:docker build . -t category-service:latest
D:\Workspace\Go\src\micro_practice\category\proto\category\category.proto
syntax = "proto3";package go.micro.service.category;service Category {rpc CreateCategory(CategoryRequest) returns (CreateCategoryResponse) {}rpc UpdateCategory(CategoryRequest) returns (UpdateCategoryResponse) {}rpc DeleteCategory(DeleteCategoryRequest) returns (DeleteCategoryResponse){}rpc FindCategoryByName(FindByNameRequest) returns (CategoryResponse) {}rpc FindCategoryByID(FindByIdRequest) returns (CategoryResponse){}rpc FindCategoryByLevel(FindByLevelRequest) returns (FindAllResponse) {}rpc FindCategoryByParent(FindByParentRequest) returns (FindAllResponse) {}rpc FindAllCategory(FindAllRequest) returns (FindAllResponse){}
}message CategoryRequest {string category_name = 1;uint32 category_level = 2;int64 category_parent = 3;string category_image = 4;string category_description = 5;
}message CreateCategoryResponse {string message =1 ;int64 category_id =2;
}message UpdateCategoryResponse {string message = 1;
}message DeleteCategoryRequest {int64 category_id =1 ;
}message DeleteCategoryResponse {string message =1;
}message FindByNameRequest {string category_name =1;
}message CategoryResponse {int64 id = 1;string category_name =2;uint32 category_level = 3;int64 category_parent =4;string category_images =5;string category_description =6;
}message FindByIdRequest {int64 category_id = 1;
}message FindByLevelRequest {uint32 level =1;
}message FindByParentRequest {int64 parent_id =1;
}message FindAllRequest {}message FindAllResponse {repeated CategoryResponse category =1;
}
protoc -I ./ --micro_out=./ --go_out=./ ./proto/category/category.proto
4-5 数据库进行交互
D:\Workspace\Go\src\micro_practice\category\domain\model\category.go
D:\Workspace\Go\src\micro_practice\category\domain\repository\category_repository.go
D:\Workspace\Go\src\micro_practice\category\domain\service\category_data_service.go
4-6 编写Handler
D:\Workspace\Go\src\micro_practice\category\handler\category.go
4-7 配置中心/注册中心的使用
D:\Workspace\Go\src\micro_practice\category\main.go
package mainimport ("git.imooc.com/coding-447/category/common""git.imooc.com/coding-447/category/domain/repository"service2 "git.imooc.com/coding-447/category/domain/service""git.imooc.com/coding-447/category/handler""github.com/jinzhu/gorm""github.com/micro/go-micro/v2"log "github.com/micro/go-micro/v2/logger""github.com/micro/go-micro/v2/registry""github.com/micro/go-plugins/registry/consul/v2"_ "github.com/jinzhu/gorm/dialects/mysql"category "git.imooc.com/coding-447/category/proto/category"
)func main() {//配置中心consulConfig,err := common.GetConsulConfig("127.0.0.1",8500,"/micro/config")if err !=nil {log.Error(err)}//注册中心consulRegistry := consul.NewRegistry(func(options *registry.Options) {options.Addrs = []string{"127.0.0.1:8500",}})// New Serviceservice := micro.NewService(micro.Name("go.micro.service.category"),micro.Version("latest"),//这里设置地址和需要暴露的端口micro.Address("127.0.0.1:8082"),//添加consul 作为注册中心micro.Registry(consulRegistry),)//获取mysql配置,路径中不带前缀mysqlInfo := common.GetMysqlFromConsul(consulConfig,"mysql")//连接数据库db,err := gorm.Open("mysql",mysqlInfo.User+":"+mysqlInfo.Pwd+"@/"+mysqlInfo.Database+"?charset=utf8&parseTime=True&loc=Local")if err !=nil {log.Error(err)}defer db.Close()//禁止复表db.SingularTable(true)//rp := repository.NewCategoryRepository(db)//rp.InitTable()// Initialise serviceservice.Init()categoryDataService := service2.NewCategoryDataService(repository.NewCategoryRepository(db))err = category.RegisterCategoryHandler(service.Server(),&handler.Category{CategoryDataService:categoryDataService})if err != nil {log.Error(err)}// Run serviceif err := service.Run(); err != nil {log.Fatal(err)}
}
4-8 完善Consul配置
D:\Workspace\Go\src\micro_practice\category\common\config.go
D:\Workspace\Go\src\micro_practice\category\common\mysql.go
D:\Workspace\Go\src\micro_practice\category\common\swap.go
consul 新建key/value
第5章 链路追踪观望台
5-1 jaeger 原理
链路追踪作用与特性
链路追踪 jaeger 术语,原理,组件,安装
在代码中使用链路追踪jaeger
微服务链路追(jaeger)踪作用
它是用来监视和诊断基于微服务的分布式系统
用于服务依赖性分析,辅助性能优化
微服务链路追踪(jaeger)主要特性
高扩展性
原生支持 OpenTracing
可观察性
微服务链路追踪(jaeger)-术语 Span
Jaeger 中的逻辑工作单元
具有操作名称,操作的开始时间和持续时间
跨度可以嵌套并排序以建立因果关系模型
Operation name:操作名称(也可以称作 Span name
Start timestamp:起始时间
Finish timestamp:结束时间
Span tag:一组键值对构成的Span 标签集合
Span log:一组Span 的日志集合
SpanContext:span 上下文对象
References( Span 间关系):相关的零个或者多个 Span
微服务链路追踪(jaeger)的五个重要组件
Jaeger-client (客户端库)
Agent(客户端代理)
Collector ( 数据收集处理)
Data Store (数据存储)
UI(数据查询与前端界面展示)
微服务链路追踪(jaeger)的安装
docker pull cap1573/jaeger
docker run -d --name jaeger -p 6831:6831/udp -p 16686:166861 cap1573/jaeger
5-2 商品领域 proto编写
D:\Workspace\Go\src\micro_practice\product\proto\product\product.proto
syntax = "proto3";package go.micro.service.product;service Product {rpc AddProduct(ProductInfo) returns (ResponseProduct){}rpc FindProductByID(RequestID) returns (ProductInfo){}rpc UpdateProduct(ProductInfo) returns (Response) {}rpc DeleteProductByID(RequestID) returns (Response) {}rpc FindAllProduct(RequestAll) returns (AllProduct){}
}message ProductInfo {int64 id = 1;string product_name = 2;string product_sku = 3;double product_price = 4;string product_description = 5;int64 product_category_id = 6;repeated ProductImage product_image = 7;repeated ProductSize product_size = 8;ProductSeo product_seo = 9;}message ProductImage {int64 id = 1;string image_name = 2;string image_code = 3;string image_url = 4;
}message ProductSize{int64 id = 1;string size_name = 2;string size_code = 3;
}message ProductSeo {int64 id = 1;string seo_title = 2;string seo_keywords = 3;string seo_description =4;string seo_code = 6;
}message ResponseProduct {int64 product_id = 1;
}message RequestID {int64 product_id = 1;
}message Response {string msg = 1;
}message RequestAll{}message AllProduct{repeated ProductInfo product_info =1;
}
D:\Workspace\Go\src\micro_practice\product\Makefile
.PHONY: proto
proto:sudo docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) -e ICODE=CF388DF1EF1C5EBE cap1573/cap-protoc -I ./ --micro_out=./ --go_out=./ ./proto/product/product.proto.PHONY: build
build: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o product-service *.go.PHONY: test
test:go test -v ./... -cover.PHONY: docker
docker:docker build . -t product-service:latest
5-3 商品领域 模型编写
D:\Workspace\Go\src\micro_practice\product\domain\model\product.go
D:\Workspace\Go\src\micro_practice\product\domain\model\product_size.go
D:\Workspace\Go\src\micro_practice\product\domain\model\product_seo.go
D:\Workspace\Go\src\micro_practice\product\domain\model\product_image.go
5-4 商品领域repository 开发
D:\Workspace\Go\src\micro_practice\product\domain\repository\product_repository.go
5-5 商品领域 service开发
D:\Workspace\Go\src\micro_practice\product\domain\service\product_data_service.go
5-6 商品领域 handler开发
D:\Workspace\Go\src\micro_practice\product\handler\product.go
5-7 商品领域 链路追踪使用
D:\Workspace\Go\src\micro_practice\product\common\config.go
D:\Workspace\Go\src\micro_practice\product\common\mysql.go
D:\Workspace\Go\src\micro_practice\product\common\swap.go
D:\Workspace\Go\src\micro_practice\product\common\jaeger.go
package commonimport ("github.com/opentracing/opentracing-go""github.com/uber/jaeger-client-go""github.com/uber/jaeger-client-go/config""io""time"
)//创建链路追踪实例
func NewTracer(serviceName string, addr string) (opentracing.Tracer, io.Closer, error) {cfg := &config.Configuration{ServiceName:serviceName,Sampler:&config.SamplerConfig{Type: jaeger.SamplerTypeConst,Param: 1,},Reporter: &config.ReporterConfig{BufferFlushInterval: 1*time.Second,LogSpans: true,LocalAgentHostPort: addr,},}return cfg.NewTracer()
}
D:\Workspace\Go\src\micro_practice\product\main.go
D:\Workspace\Go\src\micro_practice\product\productClient.go
package mainimport ("context""fmt""git.imooc.com/coding-447/product/common"go_micro_service_product "git.imooc.com/coding-447/product/proto/product""github.com/micro/go-micro/v2""github.com/micro/go-micro/v2/registry"consul2 "github.com/micro/go-plugins/registry/consul/v2"opentracing2 "github.com/micro/go-plugins/wrapper/trace/opentracing/v2""github.com/opentracing/opentracing-go""log"
)func main() {//注册中心consul := consul2.NewRegistry(func(options *registry.Options) {options.Addrs = []string{"127.0.0.1:8500",}})//链路追踪t,io,err:=common.NewTracer("go.micro.service.product.client","localhost:6831")if err !=nil {log.Fatal(err)}defer io.Close()opentracing.SetGlobalTracer(t)service := micro.NewService(micro.Name("go.micro.service.product.client"),micro.Version("latest"),micro.Address("127.0.0.1:8085"),//添加注册中心micro.Registry(consul),//绑定链路追踪micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),)productService:=go_micro_service_product.NewProductService("go.micro.service.product",service.Client())productAdd := &go_micro_service_product.ProductInfo{ProductName: "imooc",ProductSku: "cap",ProductPrice: 1.1,ProductDescription: "imooc-cap",ProductCategoryId: 1,ProductImage: []*go_micro_service_product.ProductImage{{ImageName: "cap-image",ImageCode: "capimage01",ImageUrl: "capimage01",},{ImageName: "cap-image02",ImageCode: "capimage02",ImageUrl: "capimage02",},},ProductSize: []*go_micro_service_product.ProductSize{{SizeName: "cap-size",SizeCode: "cap-size-code",},},ProductSeo: &go_micro_service_product.ProductSeo{SeoTitle: "cap-seo",SeoKeywords: "cap-seo",SeoDescription: "cap-seo",SeoCode: "cap-seo",},}response,err:=productService.AddProduct(context.TODO(),productAdd)if err !=nil {fmt.Println(err)}fmt.Println(response)
}
jager ui
find trace
链路追踪数据写入的过程中可以加入kafaka缓冲压力
可以通过链路追踪发现我们是否有循环调用
在链路中如非必要尽量避免带入异步场景的span
链路追踪还有哪些场景?
异步链路如何实现?
第6章 熔断,限流,负载均衡
6-1 熔断器作用和原理
6-2 限流的作用和原理
6-3 负载均衡作用和原理
6-4 微服务API网关
6-5 server端 proto 文件编写
6-6 service 端 model 开发
6-7 server端 repository 开发
6-8 server端口service开发
6-9 common 独立使用
6-10 server端 handler开发
6-11 server 端 添加限流
6-12 购物车API层 添加熔断
6-13 购物车API层 添加负载均衡
6-14 API 网关及熔断看板使用
第7章 性能监控能力完善
7-1 监控系统prometheus基本介绍
7-2 docker-compose 基础介绍
7-3 docker-compose 具体使用的例子
7-4 订单领域 proto 开发
7-5 订单领域 model 开发
7-6 订单领域 repository 开发
7-7 订单领域 service 开发
7-8 微服务handler 代码编写
7-9 订单main.go 添加 prometheus 监控
7-10 监控系统可视化
第8章 服务级观测台完成
8-1 日志系统ELK 架构介绍
8-2 Filebeat 工作原理及注意事项
8-3 Logstash 工作原理
8-4 docker-compose 配置安装 ELK
8-5 国际支付 PayPal 账户和沙盒环境指南
8-6 日志zap 封装
8-7 支付服务端 Proto 开发
8-8 支付信息 handler 开发
8-9 支付服务端 main.go 文件开发
8-10 FileBeat 下载和使用说明
8-11 支付API proto 开发
8-12 国际支付PayPal handler 退款业务开发(上)
8-13 国际支付PayPal handler 退款业务开发(下)
8-14 支付PayPal main.go 开发及效果展示(上)
8-15 支付PayPal main.go 开发及效果展示(下)
8-16 幂等性介绍
8-17 Kibana日志可视化展示
第9章 项目部署,完成闭环
9-1 k8s 基础入门及架构介绍
9-2 k8s api server 架构及创建应用原理
9-3 k8s 不同种类controller 作用讲解
9-4 k8s 安装-阿里云创建ECS
9-5 k8s 安装 服务器基础安装
9-6 k8s 安装初始化Master 节点
9-7 k8s node 节点加入集群
9-8 kompose 介绍和说明
9-9 kubectl 常用命令讲解
相关文章:

Go容器化微服务系统实战
1-1 本课的go微服务有什么不同? 聚焦于容器化可观测的购物微服务系统实战,通过介绍Go语言的应用趋势、容器化优势及微服务适用性,旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…...

研究生三年概括
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、研一1.上学期2. 下学期 二、研二1.研二上2.研二下 三、研三1.研三上2.研三下 前言 不知道是谁说的了,人生的路很长,关键的就那么几…...

MongoDB在Linux系统中的安装与配置指南
在这篇文章中,我们将介绍如何在CentOS 7服务器上安装MongoDB,并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…...

Linux下如何实现不用加路径调用启动脚本
配置Systemctl启动 Linux下便于启停服务,可以配置systemcl,配置如下描述 说明 只有root用户可配置,文件路径为 /etc/systemd/system/XXX.service,本文将用nginx.service举例说明 1、创建文件 首先创建一个nginx.service文件,用于配置ngi…...

编程练习2 数据单元的变量替换
示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下: #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…...

mysql的查询操作
MySQL的查询操作是数据库管理和数据检索的核心。通过SQL(Structured Query Language,结构化查询语言)语句,用户可以执行包括数据检索、数据插入、更新和删除在内的多种操作。在本文中,我们将重点讨论数据检索ÿ…...

0基础学前端 day2
大家好,欢迎来到无限大的频道。 今天继续带领大家开始0基础学前端。 一、CSS简介与基础 层叠样式表(CSS,Cascading Style Sheets)是用来进行网页样式和布局设计的语言。通过CSS,开发者可以控制网页中元素的颜色、字体…...

Invalid Executable The executable contains bitcode
Invalid Executable The executable contains bitcode xcode世界xcode16后,打包上传testflight时三方库报错:Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案: 执行一下指令删除该f…...

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
一、引言 有很多工具可以分析FLV格式,这里推荐flvAnalyser。其支持: 1.FLV 文件分析(Tag 列表、时间戳、码率、音视频同步等),HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01); 2.RTMP/HTT…...

Java服务端开发中的网络安全:防护DDoS与数据泄露的策略
Java服务端开发中的网络安全:防护DDoS与数据泄露的策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,网络安全是我们必须重点关注的领域,…...

CodeMeter 8.20AxProtector 11.50版本更新
CodeMeter是一款强大的软件保护和许可管理工具,此次8.20版本更新引入了多个重要的新功能和优化,进一步提升了不同平台上的兼容性与使用体验。本次更新扩展了对CmCloudContainer的支持,优化了Python、Rust等语言的加密能力,并修复了…...

C语言在嵌入式系统中的应用有哪些?
C语言在嵌入式系统中的应用非常广泛,这主要得益于其高效的运行速度、优秀的代码优化能力以及丰富的函数库。以下是C语言在嵌入式系统应用中的几个关键方面: 1. 硬件直接访问能力 底层硬件操作:C语言提供了直接访问底层硬件的机制࿰…...

Android 系统WIFI AP模式
在 Android 系统中,AP 模式(Access Point Mode,热点模式)允许设备作为 Wi-Fi 热点,其他设备可以通过连接这个热点进行互联网访问或局域网通信。要让 Android 设备工作在 AP 模式,你可以通过应用层的 API 控…...

java jdk8内存序列化为xml
在Java JDK 8中,将对象内存序列化为XML格式,可以使用JAXB(Java Architecture for XML Binding),它是JDK 8的一部分,并且被广泛用于Java对象与XML之间的转换。以下是一个使用JAXB在JDK 8中将Java对象序列化为…...

脚本注入网页:XSS
跨站脚本攻击(Cross-Site Scripting,简称 XSS)是一种常见的网络安全漏洞。它是指攻击者在网页中注入恶意脚本代码,当用户访问该网页时,恶意脚本会在用户的浏览器中执行,从而导致一系列安全问题。这些问题可…...

Python将ONNX转为Json脚本
Python脚本 import onnx from onnx.shape_inference import infer_shapes import numpy as npfrom google.protobuf.json_format import MessageToJson, Parse import argparse import osdef convertToJson(onnx_model_path):onnx_model = onnx.load(onnx_model_path)message …...

医学数据分析实训 项目九 糖尿病风险预测
文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码(一)数据准备(二)特征工程(三)模…...

C语言-文件操作-一些我想到的、见到的奇怪的问题
博客主页:【夜泉_ly】 本文专栏:【C语言】 欢迎点赞👍收藏⭐关注❤️ C语言-文件操作-一些我想到的、见到的奇怪的问题 前言1.在不关闭文件的情况下,连续多次调用 fopen() 打开同一个文件,会发生什么?1.1过…...

变电站设备检测系统源码分享
变电站设备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…...

电机foc线上课程开课啦
凌鸥学园电机控制学习盛宴,诚邀您的加入 🎓免费学习,荣誉加冕 凌鸥学园提供免费的电机控制课程,从基础到专业,全程无负担。 📚全面课程体系,灵活学习模式 凌鸥学园提供从基础到专业的全面课程…...

解决Mac 默认设置 wps不能双面打印的问题
目录 问题描述: 问题解决: 问题描述: 使用mac电脑的时候,发现wps找不到双面打印的按钮,导致使用wps打开的所有文件都不能自动双面打印 问题解决: mac的wps也是有双面打印的选项,只是默认被关…...

智谱清影 - CogVideoX-2b-部署与使用
🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 体验地址:[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…...

python queue.Queue介绍
queue.Queue 是 Python 中的线程安全队列,适合用于多线程或多进程环境中进行任务和数据的共享。queue.Queue 提供了 FIFO(先进先出)队列的实现,并包含线程锁机制以保证在多线程环境下数据的安全性。 queue.Queue 的主要方法&…...

Qt 每日面试题 -3
21、static和const的使用 static : 静态变量声明,分为局部静态变量,全局静态变量,类静态成员变量。也可修饰类成员函数。 有以下几类∶ 局部静态变量 : 存储在静态存储区,程序运行期间只被初始化一次,作用域仍然为局部…...

TypeScript系列:第四篇 - typeof 与 keyof
在 TypeScript系列:第三篇 - 泛型 有提及 keyof 的使用。 本文将详细介绍 keyof 和 typeof 运算符的基本概念、应用场景以及如何结合使用它们来提高代码的类型安全性。 #mermaid-svg-bnMG6PMTxMI4iafc {font-family:"trebuchet ms",verdana,arial,sans-se…...

JDK8新增特性(值得收藏)
1.Lamdba表达式 就相当于要使用接口Lock就不需要再创建一个类去实现接口了,直接用Lambda表达式省略了在创建的那个类。 Lamdba表达式是什么? “->”,Lambda操作符或箭 头操作符,它将Lambda表达式分割为两部分。 左边:指Lam…...

MATLAB系列06:复数数据、字符数据和附加画图类
MATLAB系列06:复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量( complex variables)6.1.2 带有关系运算符的复数的应用6.1.3 复函数( complex function)6.1.4 复数数据的作…...

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型
【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…...

CSAPP Attack Lab
个人感觉非常有意思的一个 Lab,涉及的知识面比较窄,主要关注 缓冲区溢出漏洞 这一个方面,并基于此进行代码攻击,体验一把做黑客的感觉,对应知识点为书中的 3.10 节内容。 这个 Lab 上手便给了我当头一棒,在…...

通信工程学习:什么是NFVI网络功能虚拟化基础设施层
NFVI:网络功能虚拟化基础设施层 NFVI(Network Functions Virtualization Infrastructure)即网络功能虚拟化基础设施层,是NFV(Network Functions Virtualization,网络功能虚拟化)架构中的一个重要…...