32.云原生Istio流量管理之官网Bookinfo应用实战演示

云原生专栏大纲

文章目录

    • 流量管理
      • 基于版本的路由配置
      • 基于 Http header 的路由配置
      • 故障注入
        • 延迟故障注入
        • 异常故障注入
        • 故障注入测试
      • 比例分配流量
      • 请求超时
      • 熔断
        • 什么是熔断
        • 创建 httpbin 服务
        • 创建访问者服务

流量管理

Istio 是服务治理的工具,Istio 的流量管理能力,能解决微服务中关于服务治理的部分问题。
Istio 的流量管理模型源于和服务一起部署的 Envoy,网格内 Pod 中的应用发送和接收的所有流量(data plane流量)都经由 Envoy,而应用本身不需要对服务做任何的更改,这对业务来说是非侵入式的,却可以实现强大的流量管理。

常见服务治理的问题:

  1. 服务发现:在动态的微服务环境中,如何实时地发现和注册新的服务实例?
  2. 负载均衡:如何在服务实例之间有效地分配请求流量,以实现高性能和高可用性?
  3. 容错处理:如何处理服务之间的故障,例如服务实例故障、网络故障等?
  4. 流量管理:如何控制服务间的请求流量,例如请求路由、流量分割、金丝雀发布等?
  5. 服务监控:如何实时地监控服务的性能和健康状况?
  6. 链路追踪:如何跟踪和分析分布式系统中的请求调用链?
  7. 安全性:如何确保服务之间的通信安全,例如身份验证、授权和加密?
  8. 策略执行:如何实施和管理服务治理的策略,例如限流、熔断、访问控制等?
  9. 配置管理:如何在服务之间统一和动态地管理配置信息?
  10. 服务编排:如何协调服务之间的交互,以实现复杂的业务流程?

基于版本的路由配置

Kubenetes Service 通过标签中的 app: reviews 来绑定对应的 Pod,

  selector:
    app: reviews

正常情况下,Kubernetes 会将客户端的请求以轮询的方式转发到 Deployment 中的 Pod。

三个不同的 Reviews Deployment 都带有相同的 app: reviews 标签,标记不同的版本。所以 Service 会把它们的 Pod 放到一起,VirtualService 会将流量以轮询的方式分发到每个版本中。
如何将流量划分到不同的版本服务中?
Istio 通过 DestinationRule 定义了应用的版本,使用 Istio DestinationRule 设置 reviews v1/v2/v3 版本的定义如下所示:

  1. 编写service_br.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
  1. 部署br
kubectl -n bookinfo apply -f service_br.yaml
  1. 查看规则
# kubectl get destinationrules -o wide -n bookinfo
NAME          HOST          AGE
details       details       13s
productpage   productpage   13s
ratings       ratings       13s
reviews       reviews       13s
  1. 为微服务 productpage、ratings、details 定义 Istio VirtualService

因为它们都只有 v1 版本,所以在 VirtualService 中直接将流量转发的 v1 版本即可。
编写3vs.yaml,主要定义route目的地,若不定义则轮询方式访问,该三个微服务只有一个版本(此处也可不部署vs)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

部署

kubectl -n bookinfo apply -f 3vs.yaml
  1. reviews 服务,流量只进入v1版本配置

reviews_v1_vs.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
kubectl -n bookinfo apply -f reviews_v1_vs.yaml
  1. 查看vs
# kubectl get vs -n bookinfo
NAME          GATEWAYS               HOSTS             AGE
bookinfo      ["bookinfo-gateway"]   ["*"]             155m
details                              ["details"]       2m13s
productpage                          ["productpage"]   2m13s
ratings                              ["ratings"]       2m13s
reviews                              ["reviews"]       9s
  1. 访问测试

http://192.168.31.21:32666/productpage
此时无论怎么访问都不好出现星(v1版本没星星)
image.png
查看kiali链路图也可看到v2、v3没有流量
image.png
原理分析:

Istio 起作用的原理大概是这样的,首先是 istio-ingressgateway 将流量转发到 bookinfo 网关中,然后 productpage VirtualService 根据对应的路由规则,判断是否放通流量,最后转发到对应的 productpage 应用中。接着 productpage 需要访问其它服务例如 reviews,发出的请求会经过 Envoy,Envoy 根据配置的 VirtualService 规则,直接将流量转发到对应的 Pod 中。

基于 Http header 的路由配置

基于 Http header 的转发,是通过 HTTP 请求中的 header 值,将流量转发到对应的 Pod 中。

  1. 编写reviews_v2_vs.yaml

将 header 带有 end-user: jason 的流量转发到 v2 中,其它情况依然转发到 v1 版本。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
kubectl -n bookinfo apply -f reviews_v2_vs.yaml
  1. 登录访问测试

然后在页面中的右上角点击 Sign in 进行登录,账号密码都是 jason。此时登录无论怎么刷新都显示黑色星星(v2版本)
image.png

  1. 查看 productpage 的日志

image.png
productpage 将这个 header 头转发给 http://reviews:9080/ ,然后流量经过 Envoy 时,Envoy 检测到 Http header 中带有 end-user ,通过规则决定将流量转发到 reviews v2。在这个过程中并不需要 Service 参与

  • 经过上面的配置,下面是请求的流程:
    • productpage → reviews:v2 → ratings (针对 jason 用户)
    • productpage → reviews:v1 (其他用户)

当然,我们也可以通过 URL 的方式划分流量,例如 /v1/productpage 、/v2/productpage 等

故障注入

故障注入是 Istio 模拟故障的一种手段,通过故障注入我们可以模拟一个服务出现故障的情况,然后从实际请求中看到出现故障时,整个微服务是否会乱套。通过故意在服务间通信中引入错误,例如延迟、中断或错误的返回值,可以测试系统在不理想的运行状况下的表现。这有助于发现潜在的问题,提高系统的健壮性和可靠性。

在 Istio 的 VirtualService 中,fault 配置用于注入故障,以模拟和测试应用程序在出现问题时的行为。主要有两种类型的故障注入:延迟(delay)和异常(abort)。

延迟故障注入

延迟故障注入用于在应答之前向请求添加指定的延迟时间。这可以测试应用程序在网络延迟或服务响应缓慢的情况下的表现。延迟故障注入配置如下:

http:  
  fault:  
  delay:  
    percentage:  
      value: 50.0  
    fixedDelay: 5s


延迟(delay)故障注入有两个主要属性。

  • percentage: 表示注入延迟的概率,取值范围为 0.0 到 100.0。例如,50.0 表示有 50% 的概率注入延迟。
  • fixedDelay: 表示注入的固定延迟时间,通常以秒(s)或毫秒(ms)为单位。例如,5s 表示 5 秒延迟。

异常故障注入

异常故障注入用于模拟请求失败的情况,例如 HTTP 错误状态码或 gRPC 状态码。这可以帮助测试应用程序在遇到故障时的恢复能力。以下是一个示例,演示了如何在 VirtualService 中添加一个异常故障注入:

http:  
  fault:  
  abort:  
    percentage:  
      value: 50.0  
    httpStatus: 503

也可以将延迟故障注入 和 异常故障注入两者放在一起同时使用。虽然放在一起使用,但是并不会两种情况同时发生,而是通过 percentage 来配置出现的概率。
异常(abort)故障注入有四个主要属性。

  • percentage: 表示注入异常的概率,取值范围为 0.0 到 100.0。例如,50.0 表示有 50% 的概率注入异常。
  • httpStatus: 表示要注入的 HTTP 错误状态码。例如,503 表示 HTTP 503 错误。
  • grpcStatus: 表示要注入的 gRPC 错误状态码。例如,UNAVAILABLE 表示 gRPC 服务不可用错误。
  • http2Error: 表示要注入的 HTTP/2 错误。例如,CANCEL 表示 HTTP/2 流被取消。

故障注入测试
  1. 编写ratings_vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 7s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1
  1. 访问测试

再次访问网页,因为超时,发现评论区已经加载不出来了
image.png

  1. 将ratings 服务恢复正常
kubectl -n bookinfo apply -f 3vs.yaml

注意kubectl -n bookinfo delete -f ratings_vs.yaml不是恢复,绑定关系是metadata:name: ratings,需更新。

比例分配流量

把 50% 的流量分配给 reviews:v1 和 reviews:v3

  1. 编写reviews_scale_v13_vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50
kubectl -n bookinfo apply -f reviews_scale_v13_vs.yaml

刷新浏览器中的 /productpage 页面,大约有 50% 的几率会看到页面中带 红色 星级的评价内容。这是因为 reviews 的 v3 版本可以访问带星级评价,但 v1 版本不能。

请求超时

在 Istio 中,服务间的调用由 Istio 进行管理,可以设置超时断开。

补充:除了像本文一样在路由规则中进行超时设置之外,还可以进行请求一级的设置,只需在应用的对外请求中加入 x-envoy-upstream-rq-timeout-ms 请求头即可。在这个请求头中的超时设置单位是毫秒而不是秒。

  1. 编写reviews_timeout.yaml

为 reviews 服务设置 http 入口超时时间,当其它服务 请求reviews 服务时,如果 http 请求超过 0.5s,那么 Istio 立即断开 http 请求。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    timeout: 0.5s
kubectl -n bookinfo apply -f reviews_timeout.yaml
  1. 注入延迟故障模拟超时

reviews 依赖于 ratings 服务,为了模拟这种超时情况,我们可以给 ratings 注入延迟故障。这样 ratings 会给所有请求都延迟 2s 才会返回响应,但是 reviews 要求所有请求 reviews 的流量在 0.5s 内响应。

kubectl -n bookinfo apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percent: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
EOF
  1. 访问测试

image.png

  1. 查看productpage 日志

image.png

  1. 恢复故障
kubectl -n bookinfo apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50
EOF
kubectl -n bookinfo apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
EOF

熔断

什么是熔断

熔断(Circuit Breaking)是微服务架构中的一种重要的弹性设计模式,在微服务环境中,不同的服务存在依赖关系,当其中一个依赖的服务出现问题时,可能导致请求积压,从而影响到其他服务和整个系统的稳定性。比如说,B 服务来了 100 个请求,B 需要请求 100 次 A 服务,但是 A 服务故障了,那么每次失败时都会重试一次,那么整体上就一共请求了 200 次。这样就会造成很大的浪费。而熔断器可以检测到这种情况,当检测到 A 服务故障之后,一段时间内所有对 A 的请求都会直接返回错误。
image.png
熔断器模式的工作原理如下:

  1. 正常状态:熔断器处于关闭状态,允许请求通过(熔断器会监控请求的成功和失败率)。
  2. 故障检测:当失败率达到预先定义的阈值时,熔断器就会启动。
  3. 熔断状态:熔断器处于打开状态时,将拒绝所有新的请求,并返回错误响应这可以防止故障级联和给故障服务带来更多的压力。
  4. 恢复状态:在一段时间后,熔断器会进入半打开状态,允许一部分请求通过。如果这些请求成功,则熔断器将返回到关闭状态;如果仍然存在失败请求,则熔断器继续保持打开状态。

使用熔断器模式可以提高微服务系统的弹性和稳定性。这些工具提供了熔断器模式的实现,以及其他弹性设计模式,如负载均衡、重试和超时等。

创建 httpbin 服务
  1. 部署httpbin

https://github.com/istio/istio/tree/release-1.11/samples/httpbin

kubectl -n bookinfo apply -f  httpbin.yaml
  1. 暴露httpbin

image.png

  1. 访问测试:

image.png

  1. 给httpbin 创建一个 DestinationRule ,里面配置了熔断规则

httpbin_circurt.yaml

apiVersion: networking.istio.io/v1alpha3
# (目标规则)用于定义访问特定服务的流量策略
kind: DestinationRule
metadata:
  name: httpbin
spec:
  # 指定了该规则适用于名为 httpbin 的主机
  host: httpbin
  # 允许为服务指定全局的流量策略,这些策略包括负载均衡设置、连接池设置、异常检测等。
  trafficPolicy: # 定义了连接池的配置,包括最大连接数限制
    connectionPool:
      tcp:
        maxConnections: 1 # 限制了 TCP 连接的最大数量为 1
      http:
        http1MaxPendingRequests: 1 # 限制了允许排队的最大 HTTP 请求数量为 1
        maxRequestsPerConnection: 1 # 限制了每个连接的最大请求数量为 1
    # 定义了异常检测的配置,用于检测出现异常的后端服务实例并对其进行隔离。
    outlierDetection:
      consecutive5xxErrors: 1 # 定义了允许的连续 5xx 错误次数为 1
      interval: 1s # 定义了异常检测的时间间隔为 1 秒
      baseEjectionTime: 3m # 定义了基础隔离时间为 3 分钟
      maxEjectionPercent: 100 # 定义了最大隔离百分比为 100%,表示当异常检测条件满足时,可以隔离的服务实例的最大比例为 100%

这个 DestinationRule 的配置限制了对名为 httpbin 的服务的流量,包括连接池的最大连接数限制和 HTTP 请求的限制,并配置了异常检测策略,以便在出现异常时对后端服务实例进行隔禽。

kubectl -n bookinfo apply -f  httpbin_circuit.yaml

创建熔断时也可以设置重试次数

    retries:
      attempts: 3
      perTryTimeout: 1s
      retryOn: 5xx

创建访问者服务

部署一个服务请求 httpbin,才能观察到熔断过程。Istio 官方推荐使用 fortio 。

  1. 编写fortio_deploy.yaml
apiVersion: v1
kind: Service
metadata:
  name: fortio
  labels:
    app: fortio
    service: fortio
spec:
  ports:
  - port: 8080
    name: http
  selector:
    app: fortio
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fortio-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fortio
  template:
    metadata:
      annotations:
        # This annotation causes Envoy to serve cluster.outbound statistics via 15000/stats
        # in addition to the stats normally served by Istio. The Circuit Breaking example task
        # gives an example of inspecting Envoy stats via proxy config.
        proxy.istio.io/config: |-
          proxyStatsMatcher:
            inclusionPrefixes:
            - "cluster.outbound"
            - "cluster_manager"
            - "listener_manager"
            - "server"
            - "cluster.xds-grpc"
      labels:
        app: fortio
    spec:
      containers:
      - name: fortio
        image: fortio/fortio:latest_release
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http-fortio
        - containerPort: 8079
          name: grpc-ping
kubectl -n bookinfo apply -f  fortio_deploy.yaml
  1. 执行命令请求 httpbin
# 执行命令获取 fortio 的 Pod 名称
export FORTIO_POD=$(kubectl get pods -n bookinfo -l app=fortio -o 'jsonpath={.items[0].metadata.name}')
# 让 Pod 容器执行命令
kubectl -n bookinfo exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio curl -quiet http://httpbin:8000/get

或通过可视化界面进入到 fortio 容器中,执行命令请求 httpbin

/usr/bin/fortio curl -quiet http://httpbin:8000/get

image.png

  1. 模拟大量请求,触发熔断
kubectl -n bookinfo exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get

可以看到下图中返回 200 和 503 的比例
image.png

####创建 productpage 熔断

  1. 编写productpage_circuit.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
kubectl -n bookinfo apply -f productpage_circuit.yaml
  1. 使用 fortio 测试 productpage 应用

从 istio gateway 入口进行访问

kubectl -n bookinfo exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 200 -loglevel Warning http://192.168.31.21:32666/productpage
  1. 访问页面

发现被熔断了
image.png

  1. 删除熔断配置
kubectl -n bookinfo apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1DestinationRule
    labels:
      version: v1
EOF

再次访问页面正常

  1. 再次fortio 测试 productpage 应用
kubectl -n bookinfo exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 20 -loglevel Warning http://192.168.31.21:32666/productpage

image.png
请求全部成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的气象数据监测分析大屏

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Jetpack Compose 架构层

点击查看&#xff1a;Jetpack Compose 架构层 官网 本页面简要介绍了组成 Jetpack Compose 的架构层&#xff0c;以及这种设计所依据的核心原则。 Jetpack Compose 不是一个单体式项目&#xff1b;它由一些模块构建而成&#xff0c;这些模块组合在一起&#xff0c;构成了一个完…

大模型+影像:智能手机“上春山”

这个春节假期&#xff0c;一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”&#xff0c;了解了抢占C位的各种技巧。 假期过去&#xff0c;开工大吉&#xff0c;手机行业开始抢占今年的C位。那么问题来了&#xff0c;今年智能手机最大的机会点在哪里&#xff1f;答…

SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍 Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口&#xff0c;然后在上面添加注解。不需要拼接URL、参数等操作。项目主页&#xff1a;GitHub - OpenFeign/feign: Feign makes w…

leetcode刷题日志-98.验证二叉搜索树

思路&#xff1a;根据二叉搜索树的性质&#xff0c;中序遍历满足升序。那么我们就可以使用中序dfs&#xff0c;并且记录每个节点的前一个节点的值&#xff0c;如果前一个节点值比后一个大&#xff0c;返回false。 class Solution {Integer pre null; //记录前序节点boolean …

[NCTF2019]True XML cookbook --不会编程的崽

题目的提示很明显了&#xff0c;就是xxe攻击&#xff0c;直接抓包。 <?xml version "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <user><username> &xxe; </username><passwor…

如何将新标注的三元组数据转换成unicoqe可以处理的格式

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 原始的标注的三元组格式如下&#xff1a; 需要转换的格式如下&#xff1a; tips:有一个小的难点&#xff1a; 1. 针对多三元组的情况&#xff0c;需要额外考虑 2. 最后一个样本&#xff0c;也记得需要…

python程序设计基础:字符串与正则表达式

第四章&#xff1a;字符串与正则表达式 4.1字符串 最早的字符串编码是美国标准信息交换码ASCII&#xff0c;仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII码采用1个字节来对字符进行编码&#xff0c;最多只能表示256个符号。 随着信息技…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架&#xff0c;通过提供默认配置和约定大于配置的方式&#xff0c;快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写&#xff0c;不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包&#xff0c;不用从…

2023年12月CCF-GESP编程能力等级认证C++编程三级真题解析

一、单选题(共15题,共30分) 第1题 下面C++数组的定义中,会丢失数据的是( )。 A:char dict_key[] = {‘p’,‘t’,‘o’}; B:int dict_value[] = {33,22,11}; C:char dict_name[]={‘chen’,‘wang’,‘zhou’}; D:float dict_value[]={3,2,1}; 答案:C 第2题 在下…

通过北辰以太网模块BCnet-FX实现与FX3U系列PLC进行以太网通信的具体方法

通过北辰以太网模块BCnet-FX实现与FX3U系列PLC进行以太网通信的具体方法 首先,在电脑的网络和Internet设置中,找到自己当前使用的网卡,如下图所示,设置该网卡的IP地址和子网掩码,(和想要连接的FX3U PLC设置在同一网段即可), 如下图所示,点击下方的连接目标,然后双击当…

Java学习笔记2024/2/23

今日内容 多态 包 final 权限修饰符 代码块 教学目标 能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点描述final修饰的变量的特点 第…

QEMU之CPU虚拟化

概述 KVM是由以色列初创公司Qumranet在CPU推出硬件虚拟化之后开发的一个基于内核的虚拟机监控器。 KVM是一个虚拟化的统称方案&#xff0c;除了x86外&#xff0c;ARM等其他架构也有自己的方案&#xff0c;所以KVM的主体代码位于内核树virt/kvm目录下面&#xff0c;表示所有CP…

音频常用测试参数(一)

一、总谐波失真&#xff08;THDN&#xff09; 总谐波失真指音频信号源通过功率放大器时&#xff0c;由于非线性元件所引起的输出信号比输入信号多出的额外谐波成份。谐波失真是由于系统不是完全线性造成的&#xff0c;我们用新增加总谐波成份的均方根与原来信号有效值的百分比来…

【更新】ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的成片区开发方案报备格式是按湖北省的标准定制的&#xff0c;目前&#xff0c;自然资源部又有了新的格式要求&#xff0c;现在新增国标版的成片区开发方案报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&…

如何避免软件测试的遗漏或重复?

在实际软件测试中&#xff0c;经常遇到遗漏测试点&#xff0c;测试不充分&#xff1b;或者重复测试&#xff0c;造成资源浪费的情况。因此如何避免软件测试遗漏或重复&#xff0c;非常重要。 1、实施过程 首先&#xff0c;通过梳理某个领域的相关项目&#xff0c;分析相关业务规…

第九届大数据与计算国际会议 (ICBDC 2024) 即将召开!

2024年第九届大数据与计算国际会议&#xff08;ICBDC 2024&#xff09;将于2024年5月24至26日在泰国曼谷举行。本次会议由朱拉隆功大学工程学院工业工程系主办。ICBDC 2024的宗旨是展示大数据和计算主题相关科学家的最新研究和成果&#xff0c;为来自不同地区的专家代表们提供一…

TSL四次握手

HTTPS 常用的密钥交换算法有两种&#xff0c;分别是 RSA 和 ECDHE 算法。 其中&#xff0c;RSA 是比较传统的密钥交换算法&#xff0c;它不具备前向安全的性质&#xff0c;因此现在很少服务器使用的。而 ECDHE 算法具有前向安全&#xff0c;所以被广泛使用。 1. ECDHE算法 1.…

台式电脑电源功率越大越费电吗?装机选购多少W电源

要组装一台电脑&#xff0c;我们首先需要选择硬件。 硬件搭配最关键的一点就是CPU和主板的兼容性。 硬件、电源等之间的平衡都需要仔细考虑。 那么台式电脑电源多大功率合适呢&#xff1f; 下面分享组装电脑电源瓦数选购指南&#xff0c;教您正确选择合适的电源瓦数。 让我们来…

备战蓝桥杯————双指针技巧巧解数组1

利用双指针技巧来解决七道与数组相关的题目。 两数之和 II - 输入有序数组&#xff1a; 给定一个按升序排列的数组&#xff0c;找到两个数使它们的和等于目标值。可以使用双指针技巧&#xff0c;在数组两端设置左右指针&#xff0c;根据两数之和与目标值的大小关系移动指针。 …