云原生Istio案例实战
目录
- 1 Istio监控功能
- 1.1 prometheus和grafana
- 1.2 访问prometheus
- 1.3 访问grafana
- 2 项目案例:bookinfo
- 2.1 理解什么是bookinfo
- 2.2 sidecar自动注入到微服务
- 2.3 启动bookinfo
- 2.4 通过ingress方式访问
- 2.5 通过istio的ingressgateway访问
- 2.5.1 确定 Ingress 的 IP 和端口
- 2.6 流量管理
- 2.6.1 放开bookinfo自定义路由权限
- 2.6.2 基于版本方式控制
- 2.6.3 基于权重的流量版本控制
- 2.6.4 基于用户来控制流量版本
- 2.7 故障注入
- 2.8 流量的迁移
- 2.9 体验Istio的Observe(观察)
1 Istio监控功能

1.1 prometheus和grafana
- Prometheus存储服务的监控数据,数据来自于istio组件mixer上报
- Grafana开源数据可视化工具,展示Prometheus收集到的监控数据
istio已经默认帮我们把grafana和prometheus已经默认部署好了
(1)执行命令查看istio自带的组件
kubectl get pods -n istio-ns

我们打开istio-demo.yaml文件找到找到prometheus和grafana


其实istio已经默认帮我们安装好了grafana和prometheus,只是对应的Service类型是clusterIP类型,表示集群内部可以访问,如果我们需要能够通过浏览器访问,我们只需要ingress访问规则即可,ingress之前已经介绍过了,这边就不在重复了
- 配置prometheus-ingress.yaml和grafana-ingress.yaml配置文件
prometheus-ingress.yaml
#ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: prometheus-ingress namespace: istio-system spec: rules: - host: prometheus.istio.qy.com http: paths:- path: /backend:serviceName: prometheusservicePort: 9090
- 执行命令
kubectl apply -f prometheus-ingress.yaml和grafana-ingress.yamlgrafana-ingress.yaml
#ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: grafana-ingress namespace: istio-system spec: rules: - host: grafana.istio.qy.com http: paths:- path: /backend:serviceName: grafanaservicePort: 3000 ~
- 执行命令
kubectl get ingress -n istio-system配置prometheus访问域名
在hosts文件里面增加ip域名的映射关系
192.168.187.137 prometheus.istio.qy.com配置grafana访问域名
在hosts文件里面增加ip域名的映射关系
192.168.187.137 grafana.istio.qy.com
1.2 访问prometheus
浏览器输入地址:prometheus.istio.qy.com

1.3 访问grafana
- 设置prometheus地址
找到prometheus在k8s里面服务地址
命令
kubectl get svc -o wide -n istio-system

选择DataSources

选择settings ,把url改成prometheus即可

2 项目案例:bookinfo
2.1 理解什么是bookinfo
这是istio官方给我们提供的案例,Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 `reviews` 服务具有多个版本。
下图展示了这个应用的端到端架构。

这个案例部署了一个用于演示Istio 特性的应用,该应用由四个单独的微服务构成。 这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo 应用分为四个单独的微服务:
productpage. 这个微服务会调用details和reviews两个微服务,用来生成页面。details. 这个微服务中包含了书籍的信息。reviews. 这个微服务中包含了书籍相关的评论。它还会调用ratings微服务。ratings. 这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
- v1 版本不会调用
ratings服务。 - v2 版本会调用
ratings服务,并使用 1 到 4个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings服务,并使用 1 到 4个红色星形图标来显示评分信息。
大家一定要从spring cloud思维模式里面跳出来,站着服务网格的立场上思考问题,我们是不需要了解服务的业务代码是什么样的,业务的服务只需要交给istio管理即可
所以大家一定要有一颗拥抱变化的心
2.2 sidecar自动注入到微服务
所以第一步我们需要给每一个服务配置一个Sidecar,但是配置sidecar我们前面也说过,可以有两种方式实现,一种是手动注入,一种是自动注入,如果自动注入需要与命名空间相关,需要准备一个命名空间
- 查看命名空间:
kubectl get ns这个时候我们需要创建一个命名空间,需要打上一个lable表示只要是在这个lable的命名空间里面的都自动注入
- 创建命名空间命令:
kubectl create namespace bookinfo-ns
- 给命名空间加上label命令
kubectl label namespace bookinfo-ns istio-injection=enabled
- 查看命名空间下有哪些label命
kubectl get ns bookinfo-ns --show-labels
2.3 启动bookinfo
进入istio安装目录:/home/tools/istio-1.0.6/samples/bookinfo/platform/kube
找到bookinfo.yaml文件
查看需要的image个数:
cat bookinfo.yaml | grep image:

里面就是bookinfo案例所需要依赖的镜像地址
- 执行命令
kubectl apply -f bookinfo.yaml -n bookinfo-ns
- 查看pod情况
kubectl get pods -n bookinfo-ns # 会发现有两个container,有两个container的原因是因为我们有自动注入,这边有六个服务,其实只要四个服务,有一个服务有三个版本仅此而已

- 查看pod明细
kubectl describe pods pod名字 -n bookinfo-ns # 例如:kubectl describe pods reviews-v1-fd6c96c74-cmqcx -n bookinfo-ns会发现有两个container,一个是我们自己的container,另外一个是自动注入的代理container
- 检查一下service
kubectl get svc -n bookinfo-ns

可以看到service的类似clusterip类型
- 验证Bookinfo 应用是否正在运行
请在某个 Pod 中用
curl命令对应用发送请求,例如ratings
- 执行命令
kubectl exec -it $(kubectl get pod -l app=ratings -n bookinfo-ns -o jsonpath='{.items[0].metadata.name}') -c ratings -n bookinfo-ns -- curl productpage:9080/productpage | grep -o "<title>.*</title>"

看到如图所示表示bookinfo启动成功
命令分析一下
kubectl get pod -l app=ratings -n bookinfo-ns -o jsonpath='{.items[0].metadata.name}';表示的是输出ratings 这个运行时pod的名字kubectl exec -it $(kubectl get pod -l app=ratings -n bookinfo-ns -o jsonpath='{.items[0].metadata.name}') -c ratings -n bookinfo-ns -- curl productpage:9080/productpage | grep -o "<title>.*</title>":进入到ratings内部,然后发送一个http测试,根据响应结果找到title标签思考:能否通过页面的方法访问bookinfo项目呢
所以下面我们用ingress方式访问bookinfo
2.4 通过ingress方式访问
- 找到productpage-service服务的端口,打开bookInfo.yaml文件

需要给productpage暴露的9080端口进行ingress域名绑定
- 新建productpageIngress.yaml
#ingress apiVersion: extensions/v1beta1 kind: Ingress metadata:name: productpage-ingress spec:rules:- host: productpage.istio.qy.comhttp:paths:- path: /backend:serviceName: productpageservicePort: 9080
- 查询productpage这个pod分布在那台服务上,执行命令
kubectl get pods -o wide -n bookinfo-ns

服务发现在w1机器上
- 配置hosts文件
192.168.187.137 productpage.istio.qy.com
- 执行命令
kubectl apply -f productpageIngress.yaml -n bookinfo-ns
- 访问地址:productpage.istio.qy.com

点击Normal user,查看书籍相关的评论

不停的刷新会有三个Reviews版本一个是不带星的一个是带黑色星的一个是带红星的,跟架构图一样的
2.5 通过istio的ingressgateway访问
2.5.1 确定 Ingress 的 IP 和端口
现在 Bookinfo 服务启动并运行中,需要使应用程序可以从外部访问 Kubernetes 集群,例如使用浏览器。可以用Istio Gateway来实现这个目标。
- 为应用程序定义 Ingress 网关
地址:/home/tools/istio-1.0.6/samples/bookinfo/networking有一个bookinfo-gateway.yaml
kubectl apply -f bookinfo-gateway.yaml -n bookinfo-ns
- 查看gateway
kubectl get gateway -n bookinfo-ns有了gateway之后我们需要配置一些环境变量
配置gateway ip环境
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}') # 把ingressgateway的ip设置成环境变量分析命令意思
kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}' # 表示获取istio组件ingressgateway组件的ip

也就是说192.168.187.137就是ingressgateway组件的ip
配置gateway端口
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')把ingressgateway的端口设置成环境变量
分析命令意思
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}' # 表示获取istio组件ingressgateway组件的端口设置gateway地址
把前面的host跟端口组成gateway地址
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT查看INGRESS_PORT环境端口
env | grep INGRESS_PORT

测试
http://192.168.187.137:31380/productpage不停的刷新会有三个Reviews版本一个是不带星的一个是带黑色星的一个是带红星的,跟架构图一样的
2.6 流量管理
2.6.1 放开bookinfo自定义路由权限
这个文件也是起到了一个路由的功能,必须先执行这个文件之后gateway路由规则才可以自定义
- 执行destination-rule-all.yaml
kubectl apply -f destination-rule-all.yaml -n bookinfo-ns
- 查看
kubectl get DestinationRule -n bookinfo-ns
- 打开destination-rule-all.yaml 分析一下
里面定义了各个微服务的路由资源
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule # 声明了一个资源,这个资源也是需要依赖于crd metadata:name: productpage spec:host: productpagesubsets:- name: v1labels:version: v1 # 版本 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule # 声明了一个资源,这个资源也是需要依赖于crd metadata:name: reviews spec:host: reviewssubsets:- name: v1labels:version: v1 # 版本- name: v2labels:version: v2 # 版本- name: v3labels:version: v3 # 版本 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: ratings spec:host: ratingssubsets:- name: v1labels:version: v1- name: v2labels:version: v2- name: v2-mysqllabels:version: v2-mysql- name: v2-mysql-vmlabels:version: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: details spec:host: detailssubsets:- name: v1labels:version: v1- name: v2labels:version: v2
2.6.2 基于版本方式控制
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-v3.yaml即可
- 打开virtual-service-reviews-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews
spec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v3
此时会把所有的路由的流量全部都切换到v3版本也就是全部都是红星的版本
- 执行命令
kubectl apply -f virtual-service-reviews-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage

- 删除版本控制命令
kubectl delete -f virtual-service-reviews-v3.yaml -n bookinfo-ns
再次刷新页面有其它版本了,这是基于版本的方式来控制流量
2.6.3 基于权重的流量版本控制
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-50-v3.yaml即可
- 打开virtual-service-reviews-50-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews
spec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v1weight: 50 # 50%的流量到v1- destination:host: reviewssubset: v3weight: 50 # 50%的流量到v3
此时会把所有的路由的流量会在v1和v3之间进行切换,也就是无星和红星页面
- 执行命令
kubectl apply -f virtual-service-reviews-50-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage
无星页面和红星页面之间切换
- 删除命令
kubectl delete -f virtual-service-reviews-50-v3.yaml -n bookinfo-ns
2.6.4 基于用户来控制流量版本
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-jason-v2-v3.yaml即可
- 打开virtual-service-reviews-jason-v2-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews
spec:hosts:- reviewshttp:- match:- headers:end-user:exact: jasonroute:- destination:host: reviewssubset: v2- route:- destination:host: reviewssubset: v3
在登录的时候会在header头部增加一个jason,如果是jason登录那么会访问v2版本,其它的人访问的是v3
- 执行命令
kubectl apply -f virtual-service-reviews-jason-v2-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage
全是红星页面,因为我不是jason用户所以流量全都在v3版本
- 删除命令
kubectl delete -f virtual-service-reviews-jason-v2-v3.yaml -n bookinfo-ns
2.7 故障注入
为了测试微服务应用程序 Bookinfo 的弹性,在访问的的时候会在header头部增加一个jason,如果是jason访问那么会访问v2版本,其它的人访问的是v3。 访问v3版本的人会注入一个50%几率的延迟2S请求访问。
故障注入:可以故意引发Bookinfo 应用程序中的 bug。尽管引入了 2 秒的延迟,我们仍然期望端到端的流程是没有任何错误的。
- 创建故障注入规则-执行:test.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: reviews spec:hosts:- reviewshttp:- match:- headers:end-user:exact: jasonroute:- destination:host: reviewssubset: v2- fault:delay:percent: 50fixedDelay: 2sroute:- destination:host: reviewssubset: v3
- 执行:test.yaml
kubectl apply -f test.yaml -n bookinfo-ns测试
1.通过浏览器打开 Bookinfo 应用。
2.使用headers头部不包含jason关机键, 访问到
/productpage页面。3.你期望 Bookinfo 主页在有50%几率大约 2 秒钟加载完成并且没有错误,有50%的几率正常加载
4.查看页面的响应时间:
- 打开浏览器的 开发工具 菜单
- 打开 网络 标签
- 重新加载
productpage页面。你会看到页面加载实际上用了大约 6s。

2.8 流量的迁移
一个常见的用例是将流量从一个版本的微服务逐渐迁移到另一个版本。在 Istio 中,您可以通过配置一系列规则来实现此目标, 这些规则将一定百分比的流量路由到一个或另一个服务。在本任务中,您将会把 50% 的流量发送到
reviews:v1,另外 50% 的流量发送到reviews:v3。然后,再把 100% 的流量发送到reviews:v3来完成迁移。(1)让所有的流量都到v1
kubectl apply -f virtual-service-all-v1.yaml(2)将v1的50%流量转移到v3
kubectl apply -f virtual-service-reviews-50-v3.yaml(3)确保v3版本没问题之后,可以将流量都转移到v3
kubectl apply -f virtual-service-reviews-v3.yaml(4)访问测试,看是否都访问的v3版本
2.9 体验Istio的Observe(观察)
观察mixer组件上报的服务数组
采集指标:自动为Istio生成和收集的应用信息,可以配置的YAML文件
进入bookinfo/telemetry目录下面
- 如果需要metrics收集日志,需要先执行
kubectl apply -f metrics-crd.yaml
- 检查一下
kubectl get instance -n istio-system多次属性页面让metrics收集数据:http://192.168.187.137:31380/productpage
现在需要访问普罗米修斯看看有没有拿到metrics收集到的数据,我们可以通过ingress来访问
- 检查普罗米修斯ingress存不存在
kubectl get ingress -n istio-system
- 不存在则启动ingress
kubectl apply -f prometheus-ingress.yaml
- 访问普罗米修斯域名
prometheus.istio.qy.com
检查一下有没有数据筛选选择: istio_requests_total
收集原理:

- 启动grafana来可视化查看,检查grafana的ingress存不存在
kubectl get ingress -n istio-system
- 启动
kubectl apply -f grafana-ingress.yaml
- 访问grafana域名
grafana.istio.qy.com
- 配置grafana对应的普罗米修斯ip
- 查找普罗米修斯ip
kubectl get svc -o wide -n istio-system


- 访问istio mixer


这边就可以看到内存和CPU使用情况了
相关文章:
云原生Istio案例实战
目录 1 Istio监控功能1.1 prometheus和grafana1.2 访问prometheus1.3 访问grafana 2 项目案例:bookinfo2.1 理解什么是bookinfo2.2 sidecar自动注入到微服务2.3 启动bookinfo2.4 通过ingress方式访问2.5 通过istio的ingressgateway访问2.5.1 确定 Ingress 的 IP 和端…...
解读赛力斯年报:华为智选车的B面
作者 | Amy 编辑 | 德新 赛力斯,华为智选车的B面。 2021年,赛力斯SF5进入华为渠道销售,华为自此开启了智选车模式。到年末,双方更是推出AITO品牌。AITO凭借M5/M7等车型在2022年拿下了超过7.5万台的销量,成为增长最快的…...
互联网内卷严重?你咋不看看其他行业呢?无非是三十晚上无月亮,大家都一样
一千个人眼中有一千个哈姆雷特,互联网行业就像一座围城,城外的人想进来,城内的人要么卷要么躺要么润 真实的感受你可以现在约几个面试体验一下。内卷到什么程度? 产品和运营岗,业务经验不完全对口简历都过不了&am…...
CompletableFuture异步任务编排使用
CompletableFuture异步任务编排使用 runAsync 和 supplyAsyncallOf 和 anyOfjoin 和 getwhenComplete 和 whenCompleteAsync 和 exceptionallyhandle 和 handleAsync 串行编排runAsync().thenRunAsync()supplyAsync().thenAcceptAsync((res) ->{})supplyAsync().thenApplyAs…...
Scala的高级用法
文章目录 1. 默认参数值1.1 方法默认参数1.2 类默认参数 2. 特质 (Traits)2.1 子类型2.2 扩展特征,当做接口来使用 3.元组3.1 定义与取值3.2 元组用于模式匹配3.3 用于for循环 4 高阶函数4.1 常见的高阶函数map4.2 简化涨薪策略代码 5.嵌套方法6.多参数列表…...
【31.在排序数组中查找元素的第一个和最后一个位置】
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1:…...
如何构建“Buy Me a Coffee”DeFi dApp
🥸 本教程来自官网:https://docs.alchemy.com/docs。对原文部分内容进行了修改。教程中所有实例经过本人实践,代码可见:https://github.com/ChuXiaoYi/web3Study 区块链技术令人惊叹,因为它使我们能够使用代码和软件编…...
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
目录 二值状态统计判断用户登陆态SETBIT 命令GETBIT 命令第一步,执行以下指令,表示用户已登录。第二步,检查该用户是否登陆,返回值 1 表示已登录。第三步,登出,将 offset 对应的 value 设置成 0。 用户每个…...
3 天,入门 TAURI 并开发一个跨平台 ChatGPT 客户端
TAURI 是什么 TAURI 是一个使用 Rust 编写的程序框架,它允许我们使用 Web 技术和 Rust 语言构建跨端应用。它提供了大量特性,例如系统通知、网络请求、全局快捷键、本地文件处理等,它们都可以在前端通过 JavaScript 便捷的调用。 TAURI 应用…...
14个最佳创业企业WordPress主题
要创建免费网站?从易服客建站平台免费开始 500M免费空间,可升级为20GB电子商务网站 创建免费网站 您网站的设计使您能够展示产品的独特卖点。通过正确的主题,您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中࿰…...
MySQL基础(三十)PowerDesigner的使用
1 PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具,用户利用该软件可以方便地制作 数据流程图 、概念数据模型 、 物理数据模型,它几乎包括了数据库模型设计的全过程,是Sybase公司为企业建模和设计提供的一套完整的集…...
nginx 服务器总结
一. 负载均衡的作用有哪些? 1、转发功能 按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高 系统并发量。 2、故障移除 通过心跳检测的方式,判断应用服务器当前是否可以正常…...
基于Hebb学习的深度学习方法总结
基于Hebb学习的深度学习方法总结 0 引言1 前置知识1.1 Hebb学习规则1.2 Delta学习规则 2 SoftHebb学习算法2.1 WTA(Winner Take All)2.2 SoftHebb2.3 多层Hebb网络2.4 Hebb学习的性能测评 3 参考文献 0 引言 总所周知,反向传播算法(back-propagating, B…...
思科模拟器 | 访问控制列表ACL实现网段精准隔绝
文章目录 一、ACL工作原理二、ACL分类初步介绍三、标准ACL1、标准ACL的决策过程2、标通配符掩码关键字3、标准ACL网络拓扑4、标准ACL演示5、实战讲解 四、扩展ACL1、基础语法明细2、扩展ACL示例3、扩展ACL网络拓扑4、实战讲解 五、总结与提炼 一、ACL工作原理 ACL(A…...
Python os模块详解
1. 简介 os就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页也可以极大增强代码的可移植性。如果该模块中相…...
Oracle PL/SQL基础语法学习13:比较运算符
系列文章目录 Oracle PL/SQL基础语法学习12:短路求值 Oracle PL/SQL基础语法学习13:比较运算符 Oracle PL/SQL基础语法学习14:BOOLEAN表达式 文章目录 系列文章目录Oracle PL/SQL基础语法学习13:比较运算符比较运算符介绍官方文档…...
金仓数据库适配记录
金仓数据库适配记录 人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。 金仓数据库主要面向事务处理类应用,兼顾各类数据分析类应用,可用做管理信息系统、…...
ElasticSearch 学习 ==ELK== 进阶
二、ElasticSearch 学习 ELK 进阶 (1)文档局部更新 我们也说过文档是不可变的——它们不能被更改,只能被替换。 update API必须遵循相同的规则。表面看来,我们似乎是局部更新了文档的位置,内部却是像我们之前说的一样…...
【数据结构 -- C语言】 双向带头循环链表的实现
目录 1、双向带头循环链表的介绍 2、双向带头循环链表的接口 3、接口实现 3.1 开辟结点 3.2 创建返回链表的头结点 3.3 判断链表是否为空 3.4 打印 3.5 双向链表查找 3.6 双向链表在pos的前面进行插入 3.6.1 头插 3.6.2 尾插 3.6.3 更新头插、尾插写法 3.7 双向链…...
自然语言处理与其Mix-up数据增强方法报告
自然语言处理与其Mix-up数据增强方法 1绪论1.课题背景与意义1.2国内外研究现状 2 自然语言经典知识简介2.1 贝叶斯算法2.2 最大熵模型2.3神经网络模型 3 Data Augmentation for Neural Machine Translation with Mix-up3.1 数据增强3.2 对于神经机器翻译的软上下文的数据增强3.…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
