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

istio介绍(二)

5. kubesphere istio使用

5.1 整体架构

在这里插入图片描述

  • ks-account 提供用户、权限管理相关的 API
  • ks-apiserver 整个集群管理的 API 接口和集群内部各个模块之间通信的枢纽,以及集群安全控制
  • ks-apigateway 负责处理服务请求和处理 API 调用过程中的所有任务
  • ks-console 提供 KubeSphere 的控制台服务
  • ks-controller-manager 实现业务逻辑的,例如创建企业空间时,为其创建对应的权限;或创建服务策略时,生成对应的 Istio 配置等
  • Metrics-server Kubernetes 的监控组件,从每个节点的 Kubelet 采集指标信息
  • Prometheus 提供集群、节点、工作负载、API 对象等相关监控数据与服务
  • Elasticsearch 提供集群的日志索引、查询、数据管理等服务,在安装时也可对接您已有的 ES 减少资源消耗
  • Fluent Bit 提供日志接收与转发,可将采集到的⽇志信息发送到 ElasticSearch、Kafka
  • Jenkins 提供 CI/CD 流水线服务
  • SonarQube 可选安装项,提供代码静态检查与质量分析
  • Source-to-Image 将源代码自动将编译并打包成 Docker 镜像,方便快速构建镜像
  • Istio 提供微服务治理与流量管控,如灰度发布、金丝雀发布、熔断、流量镜像等
  • Jaeger 收集 Sidecar 数据,提供分布式 Tracing 服务
  • OpenPitrix 提供应用模板、应用部署与管理的服务
  • Alert 提供集群、Workload、Pod、容器级别的自定义告警服务
  • Notification 通用的通知服务,目前支持邮件通知
  • redis 将 ks-console 与 ks-account 的数据存储在内存中的存储系统
  • MySQL 集群后端组件的数据库,监控、告警、DevOps、OpenPitrix 共用 MySQL 服务
  • PostgreSQL SonarQube 和 Harbor 的后端数据库
  • OpenLDAP 负责集中存储和管理用户账号信息与对接外部的 LDAP
  • 存储 内置 CSI 插件对接云平台存储服务,可选安装开源的 NFS/Ceph/Gluster 的客户端
  • 网络 可选安装 Calico/Flannel 等开源的网络插件,支持对接云平台 SDN

5.2 ks-apiserver

ks-apiserver 的主要功能是聚合整个系统的业务功能对外提供同一的API入口,如下图所示ks-apiserver聚合的功能对象主要包含以下几类
在这里插入图片描述

  • kubernetes原生的对象,由ks-apiserver连接api-server,直接获取更改etcd中kubernetes的原始数据(origin data)即可,操作的对象即kubernetes原生的configmap. deployment等对象。

  • ks-controller-manager 封装的对象,ks-controller-manager的封装功能逻辑以crd对象的方式表现在etcd中,ks-apiserver通过连接k8s-apiserver操作etcd中的crd数据(crd data)即可,操作 ks-controller-manager 扩展的逻辑功能。

  • 第三方的operator对象,如prometheus-operator等第三方完成的模块以operator的方式运行在系统中,其功能对应的对象也以crd的形式存放载etcd中,ks-apiserver也是通过和k8s-apiserver交互操作对应的crd完成。

  • 普通的服务对象,如kenkins,sonarqube等以普通服务的方式运行在系统中,ks-apiserver直接通过网络调用和此类对象交互

以上,ks-apiserver就完成了和各个内部对象的交互,即内部API(inner API aggregate)。ks-apiserver在对这些各个模块的功能进行整合,对外提供统一的API,即外部API(out API aggregate)

5.3 kubesphere的服务网格

kubesphere 使用istio 目前提供的功能:

  • 流量管理

  • 灰度发布, 支持蓝绿发布、金丝雀发布和流量镜像

  • 链路追踪

kubesphere 使用istio 实现服务网格:

  1. 初始化并启动informer
	//初始化 informers, cmd/ks-apiserver/app/options/options.goinformerFactory := informers.NewInformerFactories(kubernetesClient.Kubernetes(), kubernetesClient.KubeSphere(),kubernetesClient.Istio(), kubernetesClient.Snapshot(), kubernetesClient.ApiExtensions(), kubernetesClient.Prometheus())apiServer.InformerFactory = informerFactory// start informer,pkg/informers/informers.goif f.istioInformerFactory != nil {f.istioInformerFactory.Start(stopCh)}
  1. 创建controller
  # 分别创建 virtualservice 和 destinationrule的controller, cmd/controller-manager/app/controllers.goif serviceMeshEnabled {vsController = virtualservice.NewVirtualServiceController(kubernetesInformer.Core().V1().Services(),istioInformer.Networking().V1alpha3().VirtualServices(),istioInformer.Networking().V1alpha3().DestinationRules(),kubesphereInformer.Servicemesh().V1alpha2().Strategies(),client.Kubernetes(),client.Istio(),client.KubeSphere())drController = destinationrule.NewDestinationRuleController(kubernetesInformer.Apps().V1().Deployments(),istioInformer.Networking().V1alpha3().DestinationRules(),kubernetesInformer.Core().V1().Services(),kubesphereInformer.Servicemesh().V1alpha2().ServicePolicies(),client.Kubernetes(),client.Istio(),client.KubeSphere())}
  1. VirtualServiceController

监听service、destinationRule、strategy三种资源

  // service直接enqueueServiceserviceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc:    v.enqueueService,DeleteFunc: v.enqueueService,UpdateFunc: func(old, cur interface{}) {// TODO(jeff): need a more robust mechanism, because user may change labelsv.enqueueService(cur)},})// strategy提取出ApplicationLabels,然后根据ApplicationLabels找到services, 然后 enqueuestrategyInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{DeleteFunc: v.addStrategy,AddFunc:    v.addStrategy,UpdateFunc: func(old, cur interface{}) {v.addStrategy(cur)},})// destinationRule找到同ns下同name的 service, 然后 enqueuedestinationRuleInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: v.addDestinationRule,UpdateFunc: func(old, cur interface{}) {v.addDestinationRule(cur)},})

VirtualServiceController 起 5个协程worker,用于处理workqueue 中item,每个worker 的逻辑是:

  • 查询service,若不存在,删除同名的VirtualService和Strategy,若存在,继续
  • 查询与service同名的DestinationRule,取出 Subsets
  • 根据app label取出strategies,即获取到应用到service的所有strategies(正常只有1个)
  • 获取与service同名的virtualservice
  • 处理 service.Spec.Ports,组装成 VirtualService 中的 http或者tcp列表
  • 应用strategy到VirtualService,strategy.Spec.StrategyPolicy有Paused、Immediately、WaitForWorkloadReady三种,比较destinationRule中subsets和strategy中的subsets,判断subset是否ready,ready时,或者Immediately时,组装VirtualService spec,否则不组装。strategy.Spec.GovernorVersion表示所有流量都走该版本
  • 判断原VirtualService和新组装出的VirtualService 是否完全相同,不相同,就创建或更新VirtualService;相同,不做任何操作
  • 如果创建或更新VirtualService失败,生成warning 类型事件
func (v *VirtualServiceController) Run(workers int, stopCh <-chan struct{}) error {...if !cache.WaitForCacheSync(stopCh, v.serviceSynced, v.virtualServiceSynced, v.destinationRuleSynced, v.strategySynced) {return fmt.Errorf("failed to wait for caches to sync")}for i := 0; i < workers; i++ {go wait.Until(v.worker, v.workerLoopPeriod, stopCh)}...
}//主逻辑
func (v *VirtualServiceController) syncService(key string) error {...
}
  1. DestinationRuleController

监听 deployment、service、servicePolicy三种资源,servicePolicy中template是destinationRule,用于创建destinationRule

  // service直接enqueueServiceserviceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc:    v.enqueueService,DeleteFunc: v.enqueueService,UpdateFunc: func(old, cur interface{}) {v.enqueueService(cur)},})// 处理带有 app.kubernetes.io/name 等3个label的deploy,找到deploy 的service, 并比较selector,相等时 enqueue// 目的是监听 deploy 的变化,是否还会和service 对应上deploymentInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc:    v.addDeployment,DeleteFunc: v.deleteDeployment,UpdateFunc: func(old, cur interface{}) {v.addDeployment(cur)},})//根据servicePolicy上的 app label找到service,去重后,enqueueservicePolicyInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: v.addServicePolicy,UpdateFunc: func(old, cur interface{}) {v.addServicePolicy(cur)},DeleteFunc: v.addServicePolicy,})

DestinationRuleController 起 5个协程worker,用于处理workqueue 中item,每个worker 的逻辑是:

  • 查询对应service,如果不存在,则删除同名的servicePolicy和DestinationRule;存在,继续
  • 根据service select labels 找到其对应的所有deploy
  • 根据 deploy annotation 的servicemesh.kubesphere.io/enabled是否为true,判读是否开启serviceMesh,
  • 如果开启,获取deploy 的version,进而添加到一个 subsets 列表
  • 根据service name查找 对应的DestinationRule dr,没有就创建出dr
  • 根据 app label 找到对应的servicePolicy(只有一个),将 servicePolicy 中port和destination级别的TrafficPolicy都赋给dr
  • dr和开始获取出的DestinationRule是否有变化,如果有变化,来创建或更新DestinationRule
  • 如果创建或更新失败,生成 Warning 类型的event

具体代码见 pkg/controller/destinationrule/destinationrule_controller.go的 syncService()

6. istio使用ingress-nginx-controller为网关

6.1 实现步骤

  1. 修改nginx-controller pod注解
    在 ingress-nginx-controller 的pod中加入如下annotation
traffic.sidecar.istio.io/includeInboundPorts: ""   # 将指定端口的流量重定向到envoy sidecar
traffic.sidecar.istio.io/excludeInboundPorts: "80,443"   # 将指定端口的流量不重定向到envoy sidecar
traffic.sidecar.istio.io/excludeOutboundIPRanges: "10.233.0.1/32"   # 将指定ip范围的流出流量不重定向到envoy sidecar。`kubectl get svc kubernetes -n default -o jsonpath='{.spec.clusterIP}'`
  1. 将envoy注入nginx-controller
kubectl get deployments -n istio-system ingress-nginx-controller -o yaml| istioctl kube-inject -f - | kubectl apply -f -
  1. VirtualService配置

使用nginx-controller作为网关后,Gateway资源应该就没有作用了。因为nginx-controller是ingress-controller的实现,pilot在watch到gateway资源后不会下发配置到nginx-controller。

所以之后在virtualService中要么不写gateways,写了的话就得加上一个mesh,才能生效vs的规则

spec:gateways:- xxx- meshhosts:- '*'
  1. 配置应用ingress
    本测试中使用的应用为 productpage,ingress 需要加入如下annotations:
    kubernetes.io/ingress.class: "nginx"# 默认nginx是将流量直接打到pod ip中的,而不是通过service ip。这个配置用来禁用它,使他的流量发往service ipnginx.ingress.kubernetes.io/service-upstream: "true"# 这里写的是后端Service的完整fqdn。目的是修改Host请求头的值nginx.ingress.kubernetes.io/upstream-vhost: "nginx-svc.istio-demo.svc.cluster.local" 

6.2 实现原理

入口流量路径:

client——>nginx-controller中的nginx——> app svc——>app pod

7. istio排错日志

7.1 开启日志

在istio 启动时添加 如下参数

# 开启envoy 访问日志,输出到stdout
--set meshConfig.accessLogFile=/dev/stdout# 设置日志格式为json
--set meshConfig.accessLogEncoding=JSON

7.2 五元组日志

envoy 访问日志demo 如下所示:

{"start_time": "2021-12-03T01:11:54.847Z","bytes_received": 0,"upstream_cluster": "outbound|8000||httpbin.cfd-test.svc.cluster.local",# httpbin svc"downstream_local_address": "10.111.183.126:8000",  # sleep pod ip"downstream_remote_address": "172.30.209.64:50392","route_name": "default","response_flags": "-","duration": 7,# sleep pod ip"upstream_local_address": "172.30.209.64:43924","x_forwarded_for": null,"bytes_sent": 135,"response_code": 418,"path": "/status/418","connection_termination_details": null,"method": "GET","protocol": "HTTP/1.1","request_id": "e5f57f0a-4894-400e-a3df-e0123c32adf2","upstream_transport_failure_reason": null,"user_agent": "curl/7.80.0-DEV",# httpbin pod ip"upstream_host": "172.30.21.184:80","response_code_details": "via_upstream","upstream_service_time": "6","authority": "httpbin:8000","requested_server_name": null
}

Envoy流量五元组:

  • upstream_local_address, Local address of the upstream connection
  • upstream_host, Upstream host URL
  • upstream_cluster, Upstream cluster to which the upstream host belongs to
  • downstream_local_address, Local address of the downstream connection
  • downstream_remote_address, Remote address of the downstream connection

关键字段response_flags,请求的错误标志会被赋值给该字段,常见错误标志有如下几种:

HTTP and TCP相关

  • UH: No healthy upstream hosts in upstream cluster in addition to 503 response code.
  • UF: Upstream connection failure in addition to 503 response code.
  • UO: Upstream overflow (circuit breaking) in addition to 503 response code.
  • NR: No route configured for a given request in addition to 404 response code, or no matching filter chain for * a downstream connection.
  • URX: The request was rejected because the upstream retry limit (HTTP) or maximum connect attempts (TCP) was reached.
  • NC: Upstream cluster not found.
  • DT: When a request or connection exceeded max_connection_duration or max_downstream_connection_duration.

TCP相关

  • DC: Downstream connection termination.
  • LH: Local service failed health check request in addition to 503 response code.
  • UT: Upstream request timeout in addition to 504 response code.
  • LR: Connection local reset in addition to 503 response code.
  • UR: Upstream remote reset in addition to 503 response code.
  • UC: Upstream connection termination in addition to 503 response code.
  • DI: The request processing was delayed for a period specified via fault injection.
  • FI: The request was aborted with a response code specified via fault injection.
  • RL: The request was ratelimited locally by the HTTP rate limit filter in addition to 429 response code.
  • UAEX: The request was denied by the external authorization service.
  • RLSE: The request was rejected because there was an error in rate limit service.
  • IH: The request was rejected because it set an invalid value for a strictly-checked header in addition to 400 * response code.
  • SI: Stream idle timeout in addition to 408 response code.
  • DPE: The downstream request had an HTTP protocol error.
  • UPE: The upstream response had an HTTP protocol error.
  • UMSDR: The upstream request reached max stream duration.
  • OM: Overload Manager terminated the request.

8. istio与skywalking集成

istio与skywalking集成有如下三种方式:

  • skywalking与 istio中的Mixer组件进行集成
  • skywalking与Envoy 的 access log service 进行相关的系统集成
  • 基于 Metrics 与 skywalking集成

8.1 skywalking与 istio中的Mixer组件进行集成

在早期的istio集成中采用该种方案,架构如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
从图上看,所有的监控指标都汇聚到中间的 Mixer 组件,然后由 Mixer 再发送给他左右的 Adapter,通过 Adapter 再将这些指标发送给外围的监控平台,如 SkyWalking 后端分析平台。在监控数据流经 Mixer 的时候,Istio 的元数据会被附加到这些指标中。

8.2 skywalking与Envoy 的 access log service 进行相关的系统集成

与Mixer集成类似,SkyWalking 与 Envoy 的 access log service 进行相关的系统集成,然后根据access log进行数据的解析。

与 Envoy 集成的优势在于可以非常高效的将访问日志发送给 SkyWalking 的接收器,这样延迟最小。但缺点是目前的 access log service 发送数据非常多,会潜在影响 SkyWalking 的处理性能和网络带宽。同时所有的分析模块都依赖于较为底层的访问日志,一些 Istio 的相关特性不能被识别。比如这种模式下只能现实 Envoy 的元数据,Istio 的虚拟服务等概念无法有效的现实。

此方式的具体实现,见 skywalking与Envoy系统集成方案

8.3 基于 Metrics 与 skywalking集成

基于 Telemetry V2 观测体系是通过 Envoy 的 Proxy 直接将监控指标发送给分析平台,此种模式是基于 Metrics 监控而不是基于访问日志,模式如下图所示,这种模式将对外暴露两种 Metrics:

  • service level: 这种 Metrics 描述的是服务之间的关系指标,用来生成拓扑图和服务级别的指标;
  • proxy level: 这种 Metrics 描述的 Proxy 进程的相关指标,用来生成实例级别的指标.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种模方式的优点是对分析平台友好,网络带宽消耗小。缺点是需要消耗 Envoy 的资源,特别是对内存消耗大。但是相信经过外来多轮优化,可以很好的解决这些问题。
但此种方式还有另外的缺点,即不能生成端点 Endpoint 的监控指标。如果用户希望能包含此种指标,还需要使用基于 ALS 访问日志的模式。

8.4 Tracing 与 Metric 混合支持

在 SkyWalking8.0 之前,如果开启 Service Mesh 模式,那么传统的 Tracing 模式是不能使用的。原因是他们共享了一个分析流水线。如果同时开启会造成计算指标重复的问题。

在这里插入图片描述

在 SkyWalking8.0 中,引入的 MeterSystem 可以避免此种问题的产生。而且计划将 Tracing 调整为可以配置是否生成监控指标,这样最终将会达到的效果是:指标面板与拓扑图的数据来源于 Envoy 的 Metrics,跟踪数据来源于 Tracing 分析,从而达到支持 Istio 的 Telemetry 在控制面中的所有功能。

在这里插入图片描述

9 istio最佳实践

9.1 流量管理最佳实践

  • 为服务设置默认路由
  • 控制配置在命名空间之间的共享
  • 将大型VirtualService和DestinationRule拆分为多个资源
  • 避免重新配置服务路由时出现 503 错误

相关文章:

istio介绍(二)

5. kubesphere istio使用 5.1 整体架构 ks-account 提供用户、权限管理相关的 APIks-apiserver 整个集群管理的 API 接口和集群内部各个模块之间通信的枢纽&#xff0c;以及集群安全控制ks-apigateway 负责处理服务请求和处理 API 调用过程中的所有任务ks-console 提供 KubeSp…...

中文编程开发语言工具构件说明:屏幕截取构件的编程操作

屏幕截取 用于截取指定区域的图像。 图 标&#xff1a; 构件类型&#xff1a;不可视 重要属性 l 截取类型 枚举型&#xff0c;设置在截取屏幕时的截取类型。包括&#xff1a;全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏&#xff08;PrintScre…...

selenium多窗口、多iframe切换、alert、3种等待

1、多标签/多窗口之间的切换 场景&#xff1a; 在页面操作过程中有时候点击某个链接会弹出新的窗口&#xff0c;这时就需要切换到新打开的窗口上进行操作。这种情况下&#xff0c;需要识别多标签或窗口的情况。 操作方法&#xff1a; switch_to.window()方法&#xff1a;切换…...

物联网AI MicroPython传感器学习 之 RTC时钟模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片&#xff0c;内含有一个实时时钟/日历和31字节静态RAM&#xff0c;实时时钟/日历电路提供秒、分、时、日、周、月、年的信息&#xff0c;每月的天数…...

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080&#xff0c;从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …...

租用服务器后需要注意什么呢

租用服务器后需要注意什么呢 1、从IDC服务商中接收到服务器时&#xff0c;需要对服务器的各项性能进行测试确认&#xff0c;并做好记录以便对服务器的性能做到心中有数。 2、在服务器租用交接时&#xff0c;要了解服务器的安全设置情况&#xff0c;对服务器安全技术方面不了解…...

pip 时报错 no such option: --bulid-dir 的解决办法

Pycharm 安装第三方库报错及解决方案——no such option: --build-dir Pycharm 安装第三方库报错及解决方案——no such option: --build-dir 最近在学习路径规划相关内容&#xff0c;在运行GitHub上下载例程时缺少“plotly”库&#xff0c;根据网上查到的安装步骤操作&#x…...

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置&#xff08;*重要*&#xff09; 三、Sprin…...

【软考】计算机指令系统寻址的几种方式及其速度的比较

速度比较&#xff1a;立即>寄存器>直接> 间接 1. 立即寻址&#xff1a; 直接在指令中给出操作数 2. 寄存器寻址&#xff08;Register Addressing&#xff09;&#xff1a; 寄存器寻址是指操作数直接存储在寄存器中。指令中的地址字段指定要使用的寄存器编号&#…...

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了&#xff0c;各大厂商都有加大go工程师的需求&#xff0c;作为go语言的学习者&#xff0c;我们除了要了解如何使用go语言外&#xff0c;也有必要了解一下如何编译、调试go源码…...

DailyPractice.2023.10.22

文章目录 1.[39. 组合总和]2.[22. 括号生成]3.[79. 单词搜索]4.[131. 分割回文串] 1.[39. 组合总和] 39. 组合总和 class Solution { public: vector<vector<int>> res; vector<int> path;void dfs(vector<int>& candidates,int target,int star…...

Go学习第四章——程序流程控制

Go学习第四章——程序流程控制 1 分支结构1.1 单分支1.2 双分支1.3 多分支1.4 switch分支 2 循环结构2.1 for循环2.2 while和dowhile的实现2.3 经典案例——打印金字塔2.4 经典案例——打印九九乘法表 3 跳转控制语句3.1 break3.2 continue3.3 goto3.4 return 流程控制的作用&a…...

自然语言处理---Transformer机制详解之Decoder详解

1 Decoder端的输入解析 1.1 Decoder端的架构 Transformer原始论文中的Decoder模块是由N6个相同的Decoder Block堆叠而成&#xff0c;其中每一个Block是由3个子模块构成&#xff0c;分别是多头self-attention模块&#xff0c;Encoder-Decoder attention模块&#xff0c;前馈全…...

【读书笔记】《软技能》

句子摘抄&#xff1a; 软技能-代码之外的生存指南 “自强不息 孜孜不倦” 强调了坚持不懈、不断奋斗和追求进步的精神。无论遇到多少困难和挫折&#xff0c;都要坚持努力&#xff0c;不断提高自己&#xff0c;不知疲倦地追求目标。这句谚语鼓励人们积极进取&#xff0c;不轻言…...

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…...

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…...

julia 笔记:复合类型 struct

1 struct关键字 1.1 声明 struct关键字与复合类型一起引入&#xff0c;后跟一个字段名称的块&#xff0c;可选择使用 :: 运算符注释类型 struct Foobarbaz::Intqux::Float64end 没有类型注释的字段默认为 Any 类型&#xff0c;所以可以包含任何类型的值。 1.2 创建新对象 …...

【JavaEE初阶】 线程池详解与实现

文章目录 &#x1f334;线程池的概念&#x1f384;标准库中的线程池&#x1f340;ThreadPoolExecutor 类&#x1f6a9;corePoolSize与maximumPoolSize&#x1f6a9;keepAliveTime&#x1f6a9;ThreadFactory&#x1f6a9;workQueue&#x1f6a9;RejectedExecutionHandler handl…...

web:[极客大挑战 2019]HardSQL

题目 打开页面显示为 查看源代码没有发现其他的提示信息&#xff0c;随便尝试一下 错误 题目名为hardsql&#xff0c;先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询&#xff0c;但是页面没有…...

Android apkanalyzer简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...