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 常用命令讲解 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431948.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用, clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

百度amis框架经验分享

百度amis框架经验分享 官方文档 amis - 低代码前端框架 这篇文章讲了amis的设计 为什么说百度AMIS框架是一个优秀的设计_百度前端框架-CSDN博客 学习方法: 最好的学习方法就是GPT官方文档 不要去很大力气通读官方文档,大概浏览一遍就行, 以你…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录?如何实现28、 如何实现上拉加载,下拉刷新29、说说你对正则表达式的理解?应用场景?30、说说你对函数式编程的理解?优缺点 26、如何判断一个元…

MySQL 主从复制部署与优化

文章目录 前言 在现代数据库管理中,MySQL 主从复制是一种关键技术,用于提高数据的可用性和性能。随着 Docker 容器技术的普及,利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势,它提供了一种简便、高效且可扩展的解决方案。本…

某建筑市场爬虫数据采集逆向分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示:以下是本篇文章正文内容,下面…

应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、网络应用模型 在网络边缘的端系统之间的通信方式通常可划分为两大类:客户 - 服务器方式(C/S 方式 [Client/Server] )和对等…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式:Vim有几种不同的模式,包括: 命令/正常/普通模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode 插入模…

【Vision Transformer】辅助理解笔记

注:本文主要是对 PPT 部分内容的补充与拓展,建议结合使用(当然也完全可以单看)。 一、基础知识 1、从向量表示到词嵌入 这部分主要是参考如下文章,大部分图片均来自此文:The Illustrated Word2vec – Jay…

visio 2021入门直通车(一天全搞定)

安装Visio 2021 (64bit)安装教程 1.1. 模板类型 1.2. 界面布局 1.3. 插入对象 1.4. 添加页面 1.5. 全屏演示|页面自适应|visio文件切换 1.6. 快捷键 快捷键说明 Shift 鼠标滚轮 按下shift,点击鼠标滚轮水平页面滚动 鼠标滚轮 垂直页面滚动 Ctrl 鼠标滚轮 按…

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie,然后让后台最…

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览,而且支持用户USB接口连接,同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项,能够帮助摄影师优化相机的性能&…

Redis技术解析(基础篇)

1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 Redis-server NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至jso…

ad14转cadence17.4

一、原理图转换 将原理图文件拖入到新建工程中

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天,云原生 AI 20场主题分享,三展互动,为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接) 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖:2.applic…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢? 解决方案? 5、指令重排序…

精密制造与质量控制:保障滚珠丝杆重载运行精度

滚珠丝杆作为精密机械传动领域的重要零部件,能够将旋转动力精准地转化为流畅的直线运动。在数控机床、精密制造及高度自动化生产线上扮演着不可或缺的角色。在应对温度波动、负载突变及严苛环境条件的考验中,都有很好的表现。那么,应该如何确…

【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 JUC是“Java Util Concurrency”的缩写,指的是Java并发工具包,它位于java.util.concurrent包及其子包中。JUC包提供了大量用于构建并发应用程序的工具和…

深入解析Python 中的 sortedcontainers 库:高效的排序数据结构

在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问…

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开,有两种方式 (1)需要将文件关闭,再用非阻塞方式打开 (2)fctnl函数,先获取旧属性,再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…