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

Go容器化微服务系统实战

 1-1 本课的go微服务有什么不同?

聚焦于容器化可观测的购物微服务系统实战,通过介绍Go语言的应用趋势、容器化优势及微服务适用性,旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术,包括API网关层、接口层、应用层及领域层等模块。

 

 

第2章 Go微服务介绍与容器化入门 

2-1 微服务基础介绍

微服务介绍
  1. 微服务首先他是一种架构模式
  2. 微服务相比较单体架构,微服务架构更独立,能够单独更新和发布
  3. 微服务里面的服务仅仅用于某一个特定的业务功能
  4. 特点
    • 逻辑清晰
    • 快速迭代
    • 多语言灵活组合

微服务与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 输出依次如下&#xff1a; #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…...

mysql的查询操作

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

0基础学前端 day2

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

Invalid Executable The executable contains bitcode

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

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式&#xff0c;这里推荐flvAnalyser。其支持&#xff1a; 1.FLV 文件分析&#xff08;Tag 列表、时间戳、码率、音视频同步等&#xff09;&#xff0c;HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01)&#xff1b; 2.RTMP/HTT…...

Java服务端开发中的网络安全:防护DDoS与数据泄露的策略

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

CodeMeter 8.20AxProtector 11.50版本更新

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

C语言在嵌入式系统中的应用有哪些?

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

Android 系统WIFI AP模式

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

java jdk8内存序列化为xml

在Java JDK 8中&#xff0c;将对象内存序列化为XML格式&#xff0c;可以使用JAXB&#xff08;Java Architecture for XML Binding&#xff09;&#xff0c;它是JDK 8的一部分&#xff0c;并且被广泛用于Java对象与XML之间的转换。以下是一个使用JAXB在JDK 8中将Java对象序列化为…...

脚本注入网页:XSS

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

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 …...

医学数据分析实训 项目九 糖尿病风险预测

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

C语言-文件操作-一些我想到的、见到的奇怪的问题

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

变电站设备检测系统源码分享

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

电机foc线上课程开课啦

凌鸥学园电机控制学习盛宴&#xff0c;诚邀您的加入 &#x1f393;免费学习&#xff0c;荣誉加冕 凌鸥学园提供免费的电机控制课程&#xff0c;从基础到专业&#xff0c;全程无负担。 &#x1f4da;全面课程体系&#xff0c;灵活学习模式 凌鸥学园提供从基础到专业的全面课程…...

解决Mac 默认设置 wps不能双面打印的问题

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

智谱清影 - CogVideoX-2b-部署与使用

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 体验地址&#xff1a;[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…...

python queue.Queue介绍

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

Qt 每日面试题 -3

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

TypeScript系列:第四篇 - typeof 与 keyof

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

JDK8新增特性(值得收藏)

1.Lamdba表达式 就相当于要使用接口Lock就不需要再创建一个类去实现接口了&#xff0c;直接用Lambda表达式省略了在创建的那个类。 Lamdba表达式是什么&#xff1f; “->”,Lambda操作符或箭 头操作符&#xff0c;它将Lambda表达式分割为两部分。 左边&#xff1a;指Lam…...

MATLAB系列06:复数数据、字符数据和附加画图类

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

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 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&#xff0c;涉及的知识面比较窄&#xff0c;主要关注 缓冲区溢出漏洞 这一个方面&#xff0c;并基于此进行代码攻击&#xff0c;体验一把做黑客的感觉&#xff0c;对应知识点为书中的 3.10 节内容。 这个 Lab 上手便给了我当头一棒&#xff0c;在…...

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI&#xff1a;网络功能虚拟化基础设施层 NFVI&#xff08;Network Functions Virtualization Infrastructure&#xff09;即网络功能虚拟化基础设施层&#xff0c;是NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;架构中的一个重要…...