EnvoyFilter API

news2025/1/11 18:31:48

目录

原文链接

https://onedayxyy.cn/docs/EnvoyFilter-API

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

本节实战

实战名称
🚩 实战:EnvoyFilter API-全局范围-2023.12.18(测试成功)
🚩 实战:EnvoyFilter API-配置优先级-2023.12.18(测试成功)
🚩 实战:EnvoyFilter API-添加 Lua 脚本-2023.12.18(测试成功)

EnvoyFilter API

前面我们介绍了可以使用 EnvoyFilter 对象来部署 Istio Wasm 插件,此外 EnvoyFilter 还可以实现很多其他的功能。EnvoyFilter 提供了一种机制来自定义 Istio Pilot 生成的 Envoy 配置,使用 EnvoyFilter 可以修改某些字段的值、添加特定过滤器,甚至添加全新的侦听器、集群等,当然我们必须谨慎使用此功能,因为不正确的配置可能会破坏整个网格的稳定性。

需要注意当多个 EnvoyFilter 绑定到指定命名空间中的相同工作负载时,所有补丁将按照创建时间的顺序依次处理,如果多个 EnvoyFilter 配置相互冲突,则会无效。要将 EnvoyFilter 资源应用于系统中的所有工作负载(sidecar 和网关),则根命名空间中定义该资源,而不使用工作负载选择器即可。

Patch 操作

EnvoyFilter 对象中有一个 configPatches 字段,这个字段属于核心字段,用于指定要对 Envoy 进行什么样的操作,对各种配置对象进行的更改,该字段下面主要包括三个字段:

  • applyTo:指定应在 Envoy 配置中的哪个位置应用补丁。根据 applyTo 的不同,匹配条件应选择相应的对象。例如,带有HTTP_FILTER的 applyTo 应该在监听器上有一个匹配条件,网络过滤器选择 envoy.filters.network.http_connection_manager,并在相对于插入应执行的 HTTP 过滤器上有一个子过滤器选择。类似地,对于 CLUSTER 的 applyTo,如果提供了匹配条件,应该在集群上匹配,而不是在监听器上。
  • match:在监听器/路由配置/集群上的匹配。
  • patch:要应用的补丁以及操作。

其中的 applyTo 指定了在 Envoy 配置中给定的补丁应该被应用的位置,这个字段的值可以使用的值如下所示:

名称描述
INVALID
LISTENER将补丁应用于监听器。
FILTER_CHAIN将补丁应用于过滤器链。
NETWORK_FILTER将补丁应用于网络过滤器链,以修改现有过滤器或添加新过滤器。
HTTP_FILTER将补丁应用于 HTTP 连接管理器中的 HTTP 过滤器链,以修改现有过滤器或添加新过滤器。
ROUTE_CONFIGURATION将补丁应用于 HTTP 连接管理器内的路由配置(rds 输出)。这不适用于虚拟主机。目前,仅允许在路由配置对象上进行MERGE操作。
VIRTUAL_HOST将补丁应用于路由配置中的虚拟主机。
HTTP_ROUTE将补丁应用于路由配置中匹配的虚拟主机内的路由对象。
CLUSTER将补丁应用于 CDS 输出中的集群。也用于添加新集群。
EXTENSION_CONFIG将补丁应用于或在 ECDS 输出中添加扩展配置。注意,ECDS 仅由 HTTP 过滤器支持。
BOOTSTRAP将补丁应用于引导配置。
LISTENER_FILTER将补丁应用于监听器过滤器。

根据我们的需求选择不同的 applyTo 值,然后在 match 字段中指定匹配条件,在将补丁应用于给定代理的生成配置之前,必须满足一个或多个匹配条件,match 下面可以配置的字段如下所示:

  • context:匹配特定的配置的生成上下文。Istio Pilot 在网关的上下文中、sidecar 的入站流量和出站流量中生成 envoy 配置。可以配置的包括:

    • ANY:Sidecar 和网关中的所有侦听器/路由/集群。
    • SIDECAR_INBOUND:Sidecar 中的入站侦听器/路由/集群。
    • SIDECAR_OUTBOUND:Sidecar 中的出站侦听器/路由/集群。
    • GATEWAY:网关中的侦听器/路由/集群。
  • proxy:匹配与代理关联的属性。

  • listener:匹配 envoy 监听器属性。

  • routeConfiguration:匹配 envoy HTTP 路由配置属性。

  • cluster:匹配 envoy 集群属性。

最后的 patch 字段用于指定要应用的补丁以及操作,这个字段的值可以使用的值如下所示:

  • operation:指定 path 应该如何被应用,可以配置的值包括:

    • INVALID:无效的操作。
    • MERGE:将补丁与现有配置合并,如果要指定整个配置,请使用用 REPLACE
    • ADD:将提供的配置添加到现有列表中(侦听器、集群、虚拟主机、网络过滤器或 HTTP 过滤器)。当 applyTo 设置为 ROUTE_CONFIGURATIONHTTP_ROUTE 时,此操作将被忽略。
    • REMOVE:从列表(侦听器、集群、虚拟主机、网络过滤器、路由或 http 过滤器)中删除选定的对象,不需要指定 value。当 applyTo 设置为 ROUTE_CONFIGURATIONHTTP_ROUTE 时,此操作将被忽略。
    • INSERT_BEFORE:在指定的对象之前插入提供的配置。此操作通常仅在过滤器或路由的上下文中有用,其中元素的顺序很重要。路由应根据最具体的匹配条件进行排序,因为会选择第一个匹配的元素。对于集群和虚拟主机,数组中的元素的顺序并不重要。在选择的过滤器或子过滤器之前插入。如果未选择任何过滤器,则指定的过滤器将插入到列表的最前面。
    • INSERT_AFTER:在指定的对象之后插入提供的配置。
    • INSERT_FIRST:根据所选的过滤器的存在与否,在列表中首先进行插入。当您希望根据 Match 子句中指定的匹配条件将您的过滤器排在列表的第一位时,这特别有用。
    • REPLACE:用新内容替换过滤器的内容。REPLACE 操作仅适用于 HTTP_FILTERNETWORK_FILTER
  • value :指定要应用的补丁,被修补的对象的 JSON 配置。将使用 proto 合并语义与路径中现有的 proto 进行合并。

  • filterClass:确定过滤器插入顺序,它与 ADD 操作结合使用,如果您的过滤器依赖于或影响过滤器链中另一个过滤器的功能,则过滤器排序非常重要。在过滤器类中,过滤器按照处理顺序插入。可以配置的值包括:

    • UNSPECIFIED:控制平面决定在哪里插入过滤器,如果过滤器独立于其他过滤器,则不要指定 FilterClass
    • AUTHN:在 Istio 身份验证过滤器之后插入过滤器。
    • AUTHZ:在 Istio 授权过滤器之后插入过滤器。
    • STATS:在 Istio 统计过滤器之前插入过滤器。

接下来我们就用几个例子再来熟悉下 EnvoyFilter 的使用。

全局范围

🚩 实战:EnvoyFilter API-全局范围-2023.12.18(测试成功)

  • 测试环境
k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)

tinygo version 0.30.0

实验软件:

链接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb
提取码:7yqb
2023.11.5-实战:BookInfo 示例应用-2023.11.5(测试成功)

image-20231105111842627

  • 比如我们创建一个如下所示的 EnvoyFilter 资源对象,这个资源对象是在根命名空间中定义的,并且没有使用工作负载选择器,这样就会应用到系统中的所有工作负载(sidecar 和网关):
# access-log-filter.yaml
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: access-log
  namespace: istio-system
spec:
  configPatches:
    - applyTo: NETWORK_FILTER
      match:
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
      patch:
        operation: MERGE
        value:
          typed_config:
            "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
            access_log:
              - name: envoy.access_loggers.file
                typed_config:
                  "@type": "type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog"
                  path: /dev/stdout
                  log_format:
                    text_format: "[%START_TIME%] \" %RESPONSE_CODE% \n"

在上面的这个资源对象中我们重新定义了 Envoy 的的访问日志,将日志输出到标准输出中,并重新定义了日志的格式。

  • 先看下默认时应用的访问日志
[root@master1 ~]#kubectl logs -f productpage-v1-564d4686f-7vhks
……
INFO:werkzeug:::ffff:10.244.2.18 - - [18/Dec/2023 11:48:32] "GET /metrics HTTP/1.1" 200 -
INFO:werkzeug:::ffff:10.244.2.18 - - [18/Dec/2023 11:48:47] "GET /metrics HTTP/1.1" 200 -
INFO:werkzeug:::ffff:10.244.2.18 - - [18/Dec/2023 11:49:02] "GET /metrics HTTP/1.1" 200 -
INFO:werkzeug:::ffff:10.244.2.18 - - [18/Dec/2023 11:49:17] "GET /metrics HTTP/1.1" 200 -
INFO:werkzeug:::ffff:10.244.2.18 - - [18/Dec/2023 11:49:32] "GET /metrics HTTP/1.1" 200 -
  • 直接应用上面的资源对象即可:
kubectl apply -f access-log-filter.yaml
  • 然后我们可以重新访问下 Bookinfo 应用,看下是否能够看到新的日志:
export GATEWAY_URL=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingressgateway -n istio-system -o 'jsonpath={.spec.ports[?(@.name=="http2")].nodePort}')
curl -v http://$GATEWAY_URL/productpage
  • 访问后我们可以查看下 productpage 的日志,正常情况下应该能够看到如下所示的日志:
$ kubectl logs -f $(kubectl get po -l app=productpage -o 'jsonpath={.items[0].metadata.name}') -c istio-proxy
# ......
[2023-12-11T06:39:06.955Z] " 200
[2023-12-11T06:39:06.945Z] " 200

从上面的结果可以看到,我们通过 EnvoyFilter 自定义的日志已经生效了。

  • 同样也可以查看下其他服务的日志,比如 details 服务,正常也能看到如下所示的日志:
$ kubectl logs -f $(kubectl get po -l app=details -o 'jsonpath={.items[0].metadata.name}') -c istio-proxy
[2023-12-11T06:39:06.948Z] " 200
  • 其它

如果设置一个其他的命名空间,比如 default,那么这个 EnvoyFilter 就只会应用到 default 命名空间中的工作负载,而不会应用到其他命名空间中的工作负载。同样再次加上工作负载选择器,那么这个 EnvoyFilter 就只会应用到 default 命名空间中特定的工作负载了,而不会应用到工作负载。

测试结束。😘

配置优先级

🚩 实战:EnvoyFilter API-配置优先级-2023.12.18(测试成功)

  • 测试环境
k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)

tinygo version 0.30.0

实验软件:

链接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb
提取码:7yqb
2023.11.5-实战:BookInfo 示例应用-2023.11.5(测试成功)

image-20231105111842627

EnvoyFilter 对象中有一个 priority 字段,该字段用于指定 EnvoyFilter 的优先级,优先级低的 EnvoyFilter 会先于优先级高的 EnvoyFilter 应用。如果两个 EnvoyFilter 的优先级相同,那么就会按照创建时间的顺序依次处理。

  • 比如我们创建一个如下所示的 EnvoyFilter 资源对象:
# priority-20-filter.yaml
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: priority-20
spec:
  workloadSelector:
    labels:
      app: productpage
  priority: 20
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: ANY
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.fault"
      patch:
        operation: MERGE
        value:
          name: envoy.filters.http.fault
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
            abort:
              http_status: 503
              percentage:
                numerator: 100
                denominator: HUNDRED

在上面的这个资源对象中我们定义了一个 EnvoyFilter,这个 EnvoyFilter 的优先级为 20,我们将会在 Productpage 服务中应用这个 EnvoyFilter,这个 EnvoyFilter 的作用是在 Productpage 服务中添加一个故障注入的过滤器,当我们访问 Productpage 服务时,会全部返回 503 错误。

  • 然后我们再创建一个如下所示的 EnvoyFilter 资源对象:
# priority-10-filter.yaml
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: priority-10
spec:
  workloadSelector:
    labels:
      app: productpage
  priority: 10
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: ANY
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.fault"
      patch:
        operation: MERGE
        value:
          name: envoy.filters.http.fault
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
            abort:
              http_status: 500
              percentage:
                numerator: 50
                denominator: HUNDRED

这个资源对象和前面的资源对象基本一样,只是将优先级设置为 10,另外将故障注入的概率都设置为 50%, 并且中断的状态码为 500。

  • 接下来我们同时应用上面的两个资源对象:
kubectl apply -f priority-10-filter.yaml
kubectl apply -f priority-20-filter.yaml
  • 应用后我们再多次访问 Productpage 服务,看下会得怎样的结果:
$ curl -v http://$GATEWAY_URL/productpage
> GET /productpage HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.20:31896
> Accept: */*
>
< HTTP/1.1 503 Service Unavailable
< content-length: 18
< content-type: text/plain
< date: Mon, 11 Dec 2023 07:08:33 GMT
< server: istio-envoy
< x-envoy-upstream-service-time: 58
<

从结果看每次请求都会返回 503 错误,这是因为优先级为 10 的 EnvoyFilter 先于优先级为 20 的 EnvoyFilter 应用,所以优先级为 20 的 EnvoyFilter 覆盖了优先级为 10 的 EnvoyFilter,这也是符合我们的预期的。

  • 记得回收掉刚才创建的资源
kubectl delete -f priority-10-filter.yaml
kubectl delete -f priority-20-filter.yaml

测试结束。😘

添加 Lua 脚本

🚩 实战:EnvoyFilter API-添加 Lua 脚本-2023.12.18(测试成功)

  • 测试环境
k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)

tinygo version 0.30.0

实验软件:

链接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb
提取码:7yqb
2023.11.5-实战:BookInfo 示例应用-2023.11.5(测试成功)

image-20231105111842627

比如现在我们想要在 Productpage 服务中添加一个 Lua 脚本,当我们收到 Productpage 服务的请求后,会发起一个 HTTP 请求到 baidu.com,并将 baidu.com 的搜索结果作为原始请求的响应。

首先我们需要在 EnvoyFilter 中添加一个 Lua 过滤器,然后再添加一个 lua_cluster 集群,用来发起 HTTP 请求到 baidu.com,用来实现我们的逻辑。

  • 创建一个如下所示的 EnvoyFilter 资源对象:
# productpage-lua-filter.yaml
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: productpage-lua
  namespace: default
spec:
  workloadSelector:
    labels:
      app: productpage
  configPatches:
    # 第一个 patch 将 lua 过滤器添加到监听器/HTTP连接管理器中。
    - applyTo: HTTP_FILTER # HTTP_FILTER 用于 HTTP 连接管理器中的 HTTP 过滤器链
      match:
        context: SIDECAR_INBOUND
        listener:
          portNumber: 9080
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
      patch:
        operation: INSERT_BEFORE
        value: # lua filter specification
          name: envoy.filters.http.lua
          typed_config:
            "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
            defaultSourceCode:
              inlineString: |
                function envoy_on_response(response_handle)
                  response_handle:headers():add("lua-filter", "true")
                  response_handle:headers():add("website", "youdianzhishi.com")
                end
                function envoy_on_request(request_handle)
                  -- 发起 HTTP 调用到 lua_cluster (即 baidu.com),并附加搜索词
                  local response_headers, response_body = request_handle:httpCall(
                      "lua_cluster",
                      {
                          [":method"] = "GET",
                          [":path"] = "/s?wd=优点知识",
                          [":authority"] = "baidu.com"
                      },
                      "",
                      5000
                  )
                  -- 使用 baidu.com 的搜索结果作为原始请求的响应
                  request_handle:respond(response_headers, response_body)
                end
    # 第二个 path 需要添加上面 lua 脚本里面指定的 lua_cluster 集群
    - applyTo: CLUSTER
      match:
        context: SIDECAR_OUTBOUND
      patch:
        operation: ADD
        value: # cluster specification
          name: "lua_cluster"
          type: STRICT_DNS
          connect_timeout: 0.5s
          lb_policy: ROUND_ROBIN
          load_assignment:
            cluster_name: lua_cluster
            endpoints:
              - lb_endpoints:
                  - endpoint:
                      address:
                        socket_address:
                          protocol: TCP
                          address: "baidu.com"
                          port_value: 80

上面的资源对象中我们定义了两个 patch,第一个用于将 lua 过滤器添加到监听器/HTTP 连接管理器中,并添加上 Lua 代码,第二个补丁用于添加 lua_cluster 集群。

envoy_on_request 这是一个定义在 Envoy 的 Lua 环境中的函数,它在请求被处理时被调用。这个函数名是 Envoy 约定的特定名称,Envoy 会在处理请求时自动调用这个函数。

  • 直接应用上面的资源对象即可:
kubectl apply -f productpage-lua-filter.yaml
  • 应用后,当我们再次请求 Productpage 服务就会发现请求会被重定向到 baidu.com,并且响应头中会添加我们定义的 Header:

img

  • 同样我们可以使用 istioctl proxy-config 命令来查看下 Envoy 的配置, 比如查看 Productpage 服务的监听器配置:
istioctl proxy-config listener productpage-v1-564d4686f-sgzkw --port 15006 -oyaml

在上面的结果中可以看到我们添加的 Lua 过滤器:

img

  • 同样查看 Endpoint 的配置正常可以看到我们添加的 lua_cluster 集群:
istioctl proxy-config endpoint productpage-v1-564d4686f-sgzkw -oyaml

正常可以看到如下所示的结果:

img

除此之外还有非常多的使用场景,总之,只要能够通过 Envoy 的配置来实现的,都可以通过 EnvoyFilter 来实现。

测试结束。😘

作业

假设有一个需求是有好几万的租户在使用一个云服务,这个云服务会自动为所有的租户分配一个二级域名,配置 HTTPS 证书,这个场景我们直接通过 Gateway API 里面配置一个通配符的域名和对应的证书是不是就可以了。

现在的需求是有很多用户有自定义域名的一个需求,也需要支持这些用户配置证书,由于现在的 443 端口已经被通用的 Gateway 对象占用了,所以不能为每一个租户添加一个 Gateway API,那么应该如何使用同一个 Gateway API 来支持通配符的证书以及用户自定义的域名和证书的配置呢?

直接在 Gateway API 里面是不是加上这些自定义的域名和证书就可以了?确实可以,但是这个功能是开放给用户去使用的,这样的话是不是就会对其他用户可能产生影响,肯定是不希望用户能够去更新 Gateway API 对象的,那么这个时候应该如何实现呢?

不希望修改 Gateway API 对象,就能够支持很多用户的自定义域名和证书的需求(使用同一个 443 端口)?

使用我们今天讲的 EnvoyFilter 是不是就可以可以了?一个租户去自定义域名或者证书的时候单独就创建一个 EnvoyFilter 是不是就可以了(针对 Gateway)。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号
《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发企业展示小程序的关键步骤和技巧

随着移动互联网的快速发展&#xff0c;小程序已经成为企业展示形象、推广产品和服务的重要工具。拥有一个优秀的小程序可以帮助企业提高品牌知名度&#xff0c;吸引更多潜在客户&#xff0c;提升用户体验。以下是拥有一个展示小程序的步骤&#xff1a; 确定需求和目标 首先&am…

实时时钟(RTC)的选择与设计:内置晶体与外置晶体的优缺点对比

实时时钟(RTC)作为一种具备独立计时和事件记录功能的设备&#xff0c;现已广泛应用于许多电子产品中&#xff0c;并对时钟的精度要求越来越高。根据封装尺寸、接口方式、附加功能、时钟精度和待机功耗等因素进行分类&#xff0c;市场上有各种种类的RTC产品可供选择。 而在设计…

计网01 计算机网络基础

一、计算机网络基本概念 1、什么是计算机网络 网络&#xff1a;由两台或多台计算机通过网络设备串联&#xff08;网络设备通过传输介质串联&#xff09;而形成的网络网络设备&#xff1a;计算机、路由交换、防火墙、上网行为管理等传输介质&#xff1a;双绞线&#xff08;网线…

Unity中URP下的顶点偏移

文章目录 前言一、实现思路二、实现URP下的顶点偏移1、在顶点着色器中使用正弦函数&#xff0c;实现左右摇摆的效果2、在正弦函数的传入参数中&#xff0c;加入一个扰度值&#xff0c;实现不规则的顶点偏移3、修改正弦函数的振幅 A&#xff0c;让我们的偏移程度合适4、修改正弦…

使用特殊打字机键入单词的最少时间(贪心算法)

有一个特殊打字机&#xff0c;它由一个圆盘 和一个 指针组成&#xff0c; 圆盘上标有小写英文字母 a 到 z。只有 当指针指向某个字母时&#xff0c;它才能被键入。指针初始时指向字符 a 。 每一秒钟&#xff0c;你可以执行以下操作之一&#xff1a; 将指针顺时针或者逆时针移…

BearPi Std 板从入门到放弃 - 先天神魂篇(9)(RT-Thread DAC->ADC)

简介 RT-Thread DAC->ADC 使用, 就是DAC1输出模拟量, ADC1 读取模拟量转化成电压值, 基于开发板 &#xff1a; Bearpi Std(小熊派标准板)主芯片: STM32L431RCT6串口: Usart1DAC1: PA5, OUT2ADC1: PC2, IN3将板子上的E53 接口, 5 和 6用排线相连, 即实现内部DAC1->ADC1 …

TDDL笔记

TDDL分三层: Matrix层; 规则的管理 固定哈希算法&#xff0c;基本能保证数据均匀分布&#xff0c;它也是 TDDL 的默认路由算法。根据某个字段(如整形的 id 或者字符串的 hashcode)对分库的数量或者分表的数量进行取模&#xff0c;根据余数路由到对应的位置。一致性哈希算法&a…

【Docker】Docker安装部署maven私服

文章目录 镜像拉取构建nexus实例登录maven私服如何查看实例初始化的admin密码呢&#xff1f;1.查看容器挂载卷2.找到nexus_nexus_data查看挂载卷详情3.查看admin账号密码4.登录并重置密码 使用nexus私服1.设置settings.xml2.设置idea pom 出现的问题小插曲 镜像拉取 docker pu…

大数据Doris(三十八):Aggregate 和 Uniq 模型中的 ROLLUP

文章目录 Aggregate 和 Uniq 模型中的 ROLLUP 一、获得每个用户的总消费

Intel® Enclave Exiting Events(四)

文章目录 前言一、Compatible Switch to the Exiting Stack of AEX二、State Saving by AEX三、Synthetic State on Asynchronous Enclave Exit3.1 Processor Synthetic State on Asynchronous Enclave Exit3.2 Synthetic State for Extended Features3.3 Synthetic State for …

C# WPF上位机开发(usb设备访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前很多嵌入式设备都支持usb访问&#xff0c;特别是很多mcu都支持高速usb访问。和232、485下个比较&#xff0c;usb的访问速度和它们基本不在一个…

Python 全栈体系【四阶】(七)

第四章 机器学习 六、多项式回归 1. 什么是多项式回归 线性回归适用于数据呈线性分布的回归问题。如果数据样本呈明显非线性分布&#xff0c;线性回归模型就不再适用&#xff08;下图左&#xff09;&#xff0c;而采用多项式回归可能更好&#xff08;下图右&#xff09;。例…

100GPTS计划-AI写诗PoetofAges

地址 https://chat.openai.com/g/g-Cd5daC0s5-poet-of-ages https://poe.com/PoetofAges 测试 创作一首春天诗歌 创作一首夏天诗歌 创作一首秋天诗歌 创作一首冬天诗歌 微调 诗歌风格 语气&#xff1a;古典 知识库

打响指针的第一枪:指针家族

前言 指针其实是我们学习C语言中最难的知识点&#xff0c;很多人在学习指针的时候会被绕晕&#xff0c;包括博主也是&#xff0c;当初百思不得其解&#xff0c;脑袋都要冒烟了&#xff0c;本来打算在学习指针的时候就写一篇博客&#xff0c;但是当初自己的能力还是没有办法去完…

智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工电场算法4.实验参数设定5.算法结果6.…

Linux发行版比较:Ubuntu、CentOS、Red Hat与其他系统的优劣分析

导言 Linux作为开源操作系统&#xff0c;有众多不同的发行版&#xff0c;每个发行版都有其独特的特性和适用场景。本文将聚焦于比较Ubuntu、CentOS、Red Hat和其他系统&#xff0c;深入分析它们的优势、用途以及在不同领域的应用。Linux操作系统的生态系统中&#xff0c;Ubuntu…

【Hive】——DDL(TABLE)

1 查询指定表的元数据信息 如果指定了EXTENDED关键字&#xff0c;则它将以Thrift序列化形式显示表的所有元数据。 如果指定了FORMATTED关键字&#xff0c;则它将以表格格式显示元数据。 describe formatted student&#xff1b;2 删除表 如果已配置垃圾桶且未指定PURGE&…

用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式

1、模式标准 模式名称&#xff1a;解析器模式 模式分类&#xff1a;行为型 模式意图&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 结构图&#xff1a; 适用于&#xff1…

【论文阅读笔记】A Recent Survey of Vision Transformers for Medical Image Segmentation

Khan A, Rauf Z, Khan A R, et al. A Recent Survey of Vision Transformers for Medical Image Segmentation[J]. arXiv preprint arXiv:2312.00634, 2023. 【论文概述】 本文是关于医学图像分割中视觉变换器&#xff08;Vision Transformers&#xff0c;ViTs&#xff09;的…

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库&#xff0c;专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式&…