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

Istio 学习笔记

Istio 学习笔记

作者:王珂

邮箱:49186456@qq.com


文章目录

  • Istio 学习笔记
    • @[TOC]
  • 前言
  • 一、基本概念
    • 1.1 Istio定义
  • 二、Istio的安装
    • 2.1 通过Istioctl安装
    • 2.2 通过Helm安装
  • 三、Istio组件
    • 3.1 Gateway
    • 3.2 VirtulService
      • 3.2.1 route详解
      • 3.2.2 match详解
      • 3.2.3 路由目标
      • 3.2.4 HTTP重定向
      • 3.2.5 HTTP重写
      • 3.2.6 HTTP重试
      • 3.2.7 HTTP流量镜像
      • 3.2.8 HTTP故障注入
      • 3.2.9 HTTP跨域资源共享
    • 3.3 DestinationRule
      • 3.3.1 负载均衡器设置
      • 3.3.2 连接池配置
      • 3.3.3 异常点检查
      • 3.3.4 TLS设置
      • 3.3.5 端口流量策略
      • 3.3.6 服务子集
  • 四、Kiali组件
  • 五、实战
    • 5.1 Hello服务实战

前言

本文主要讲解在使用Istio开发微服务过程中涉及到的一些基本概念,Istio环境安装,Istio组件作用和使用方法。最后再通过实战讲解来结束Istio的学习。

我的Kubernetes信息

节点名称IP说明
node21192.168.1.21主节点名称为node21
node26192.168.1.26工作节点名称为node26
node27192.168.1.27工作节点名称为node27
node28192.168.1.28工作节点名称为node28

一、基本概念

服务网格

服务网格 Service Mesh

Kubernetes Ingress, Gateway和Istio Gateway的区别

2022年5月份Kubernetes Gateway API才发布了 Beta 版本,当前大多数组织应该还在使用稳定的 Ingress API。

  • Kubernetes Ingress

    Kubernetes Ingress 是一个资源对象,用于控制进入 Kubernetes 集群的流量。
    它可以配置外部 IP 地址、端口、域名、以及路径等信息,将流量路由到不同的服务。
    Ingress 通常使用 Nginx 或 HAProxy 等代理服务器来实现。
    在这里插入图片描述

  • Kubernetes Gateway

    Kubernetes Gateway 是一个 API 对象,用于定义网络流量的入口点。
    它可以配置服务、端口、协议等信息,以及如何将流量路由到不同的服务。
    Gateway 旨在替代 Ingress 成为 Kubernetes 中流量管理的标准 API。

    Gateway API 在 Ingress API 的基础上增加了更多特性,例如 HTTP 头匹配、加权流量分割、多协议支持(如 HTTP、gRpc)以及其他各种后端功能(如桶、函数)。

    Gateway API 比 Ingress API 更好的分离了关注点。使用 Ingress,集群运维人员和应用开发人员在同一个 Ingress 对象上操作,却不知道彼此的角色,可能会导致设置错误。

    Route 和 Gateway 对象是由 Gateway API 独立于配置创建的,从而为集群运维人员和应用开发人员提供了自主权。
    在这里插入图片描述

  • Istio Gateway

    Istio Gateway 是 Istio 服务网格中的一个组件,用于控制进入服务网格的流量。
    它可以配置虚拟服务、端口、协议等信息,以及如何将流量路由到不同的服务。
    Istio Gateway 使用 Envoy 代理来实现,并支持更丰富的流量管理功能,例如服务发现、负载均衡、熔断、超时、重试等。

简而言之:

Kubernetes Ingress 和 Gateway 都是用于控制进入 Kubernetes 集群的流量的资源对象。
Gateway 是 Ingress 的下一代 API,旨在提供更强大的功能和灵活性。
Istio Gateway 是 Istio 服务网格中用于控制进入服务网格的流量的组件,并支持更丰富的流量管理功能。

三个对象对比

特性 Kubernetes Ingress Kubernetes Gateway Istio Gateway
API 对象 Ingress Gateway Gateway
代理服务器 Nginx, HAProxy Envoy Envoy
支持的流量管理功能 基本 增强 丰富
服务发现 不支持 支持 支持
负载均衡 支持 支持 支持
熔断 不支持 支持 支持
超时 不支持 支持 支持
重试 不支持 支持 支持

使用场景:
如果您只需要基本的流量管理功能,可以使用 Kubernetes Ingress。
如果您需要更强大的流量管理功能,可以使用 Kubernetes Gateway 或 Istio Gateway。
如果您使用 Istio 服务网格,则建议使用 Istio Gateway。

1.1 Istio定义

官网(英文):

https://istio.io/latest/

官网(中文):

https://istio.io/latest/zh/

Istio是一个开源的服务网格。

特性

  • 自动负载均衡HTTP, gRPC, WebSocket和TCP流量

架构

Istio服务网格从逻辑上分为数据平面和控制平面

  • 数据平面

    由一组被部署为 Sidecar 的智能代理(Envoy) 组成。这些代理负责协调和控制微服务之间的所有网络通信。 它们还收集和报告所有网格流量的遥测数据。

  • 控制平面

    管理并配置代理来进行流量路由。
    在这里插入图片描述

二、Istio的安装

2.1 通过Istioctl安装

Kubernetes与Istio对应关系

https://istio.io/latest/docs/releases/supported-releases/#support-status-of-istio-releases

下载

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.16.6 sh -

目录说明

./istio-1.16.6
├── bin           # 存放istioctl二进制文件
├── LICENSE
├── manifests     # istio内置的chart目录,默认使用这些内置的chart生成安装清单,安装过程也可以自行设置
├── manifest.yaml # 指定外部chart
├── README.md 
├── samples       # 提供一些示例应用程序
└── tools         # 一些工具,如certs用于生成证书

1)配置环境变量

cat <<EOF > /etc/profile.d/custom.sh
#! /bin/bash
export ISTIO_HOME=/opt/istio/istio-1.16.6export PATH=$ISTIO_HOME/bin:$PATH
EOF

查看istio的profile

istioctl profile list

Istio configuration profiles:
ambient
default
demo
empty
external
minimal
openshift
preview
remote

① default: 根据 lstioOperator AP!的默认设置启动组件。建议用于生产部署和 Multicluster Mesh 中的 Primary Cluster。您可以运行 istioct profile dump 命令来查看默认设置,
② demo: 这一配置具有适度的资源需求,旨在展示lstio 的功能。它适合运行 Bookinfo 应用程序和相关任务。 此配置文件启用了高级别的追踪和访问日志,因此不适合进行性能测试。
③ minimal: 与默认配置文件相同,但只安装了控制平面组件。它允许您使用 Separate Profile 配置控制平面和数据平面组件(例如 Gateway)。
④ remote: 配置Multicluster Mesh 的 Remote Cluster.
⑤ empty: 不部署任何东西。可以作为自定义配置的基本配置文件。
⑥ preview: 预览文件包含的功能都是实验性。这是为了探索 lstio 的新功能。不确保稳定性、安全性和性能(使用风险需自负)。

组件defaultdemominimalremoteemptypreview
核心组件
istio-ingressgateway
istio-egressgateway
istiod

2)执行安装

istioctl install --set profile=demo

3)给命名空间添加标签

创建ns-istio命名空间

kubectl create namespace ns-istio

给命ns-istio名空间添加标签,指示istio在部署应用的时候,自动注入Envoy边车代理

kubectl label namespace ns-istio istio-injection=enabled

查看安装结果

kubectl get svc,pod -n istio-system

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-egressgateway ClusterIP 10.102.75.82 80/TCP,443/TCP 14h
service/istio-ingressgateway LoadBalancer 10.108.158.227 15021:31495/TCP,80:30645/TCP,443:30754/TCP,31400:31434/TCP,15443:31846/TCP 14h
service/istiod ClusterIP 10.105.204.23 15010/TCP,15012/TCP,443/TCP,15014/TCP 14h

NAME READY STATUS RESTARTS AGE
pod/istio-egressgateway-66d96985c-2xc4x 1/1 Running 2 (10h ago) 14h
pod/istio-ingressgateway-c5fd879b5-f4wkh 1/1 Running 2 (10h ago) 14h
pod/istiod-98988c6b6-8qvr8 1/1 Running 2 (10h ago) 14h

4)卸载

istioctl uninstall --purge

删除istio-system命名空间

kubectl delete namespace istio-system

2.2 通过Helm安装

TODO

三、Istio组件

3.1 Gateway

在安装Istio的时候,安装了入口网关和出口网关。这两个网关实际都运行了一个Envoy代理实例,他们在网格的边缘做为负载均衡器运行。入口网关接收入站连接,而出口网关接收从集群出去的连接。

有一个指向入口网关单一的外部IP地址,并根据Header将流量路由到集团内的不同的服务。通过入口网关,可以对进入集群的流量应用路由规则。

使用Gateway配置网关资源

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: gateway-hellonamespace: ns-istio
spec:selector:istio: ingressgateway # 通过这个标签选中了istio=ingressgateway的serviceservers:- port:number: 80name: httpprotocol: HTTPhosts:- hello.alisls.com

上述配置解释:

  • 配置了一个代理,做为负载均衡器

  • 为入口暴露80端口

  • 配置应用于istio入口网关代理

  • hosts字段做为一个过滤器,只有以hello.alisls.com为目的地的流量才被允许通过

网关资源描述了负载均衡器的暴露端口、协议、SNI配置等

Gateway字段名称字段含义
metadata.nameGateway名称
metadata.namespace
spec.selectorGateway使用填写的标签键值对匹配配置下发的边缘代理网关实例
spec.servers.port.number端口
spec.servers.hosts域名,支持通配符*
spec.servers.tls.httpsRedirect值为true时,边缘代理网关会对所有http请求返回301重定向,要求客户端发起https请求
spec.servers.tls.mode配置当前端口的 TLS 安全认证模式,如需要开启当前端口的安全认证则需要填写。支持PASSTHROUGH, SIMPLE, MUTUALAUTO PASSTHROUGH, ISTIO MUTUAL
spec.servers.tls.credentialName配置发现 TLS 证书密钥的 secret 的名称
spec.servers.tls.serverCertificate设置端口的 TLS 证书密钥通过 file mount 形式(不推荐,推荐采用填写 credentialName 字段加载证书私钥)挂载时需要填写的证书路径字段Istio 默认使用网关所在命名空间下 istio-ingressgateway-certssecret加载证书至路径/etc/istio/ingressgateway-certs
spec.servers.tls.privateKey设置端口的 TLS 证书密钥通过 file mount 形式(不推荐,推荐采用填写 credentialName 字段加载证书私钥)挂载时需要填写的私钥路径字段Istio 默认使用网关所在命名空间下 istio.ingressgateway-certs secret 加载私钥至路径/etc/istio/ingressgateway-certs
spec.servers.tls.caCertificates设置端口的 TLS 证书密钥通过 file mount 形式(不推荐,推荐采用填写 credentialName 字段加载证书私钥)挂载时需要填写的跟证书路径字段Istio 默认使用网关所在命名空间下 istio-ingressgateway-ca-certs 加载根证书至路径/etc/istio/ingressgateway-ca-certs,双向认证时需要配置根证书

SNI, 服务器名称指示,是TLS协议的扩展。它指示在”握手“过程开始时浏览器正在联系哪个主机名;允许服务器为多个站点安全地托管多个SSL证书,多个网站存在于同一IP地址上。

为了控制和转发流量到集群内部运行实例的Kubernetes服务,我们必须用特定的主机名(例如:hello.alisls.com)配置一个VirtualService,让后将网关连接到它。
在这里插入图片描述

3.2 VirtulService

使用VirtualService资源在Istio服务网格中进行流量路由。通过VirtualService定义流量路由规则。

VirtualService字段名称字段说明
spec.hosts定义路由规则关联一组的 hosts,可以是带有通配符的 DNS 名称或者IP 地址(IP 地址仅能应用于来源流量为边缘代理网关)。该字段能应用于HTTP 和 TCP 流量。在 Kubernetes 环境中,可以使用 service 的名称作为缩写,lstio 会按照VirtualService所在 namespace 补齐缩写,例如在default namespace 的VirtualService 包含host 缩写 reviews 会被补齐为reviews.default.svc.cluster.local。为避免误配置,推荐填写 host 全称
spec.gateways定义应用路由规则的来源流量,可以是一个或多个网关,或网格内部的 sidecar,指定方式为/,保留字段 mesh 表示网格内部所有的 sidecar,当该参数缺省时,会默认填写 mesh,即该路由规则的来源流量为网格内部所有 sidecar
spec.http定义一组有序的(优先匹配靠前的路由规则)应用于 HTTP 流量的路由规则,HTTP 路由规则会应用于网格内部的 service 端口命名为 http-,http2-,grpc-开头的流量以及来自 gateway 的协议为HTTP HTTP2,GRPC, TLS-Terminated-HTTPS 的流量
spec.http.match定义路由的匹配规则列表,单个匹配规则项内所有条件是且关系,列表中多个匹配规则之间为或关系
spec.http.route定义路由转发目的地列表,一条 HTTP 路由可以是重定向或转发(默认),转发的目的地可以是一个或多个服务(服务版本)。同时也可以配置权重、header 操作等行为
spec.http.redirect定义路由重定向,一条 HTTP 路由可以是重定向或转发(默认),如规则中指定了 passthrough 选项,route、redirect 均会被忽略。可将 HTTP301 重定向到另外的 URL 或 Authority
spec.http.rewrite定义重写 HTTP URL或 Authority headers,不能与重定向同时配置,重写操作会在转发前执行
spec.http.timeout定义HTTP请求的超时时间
spec.http.retries定义HTTP请求的重试策略
spec.http.fault定义HTTP流量的故障注入策略,开启时超时和重试策略不会开启
spec.http.mirror定义将 HTTP 流量复制到另一个指定的目的端,被复制的流量按照“best effort”原则,sidecar/网关不会等待复制流量的响应结果就会从源目的端返回响应。镜像流量的目的服务端会产生监控指标。
spec.http.mirrorPercent定义流量镜像的复制百分比,缺省时复制100%的流量。最大值为100
spec.http.corsPolicy定义 CORS 策略(跨域资源共享,Cross-OriginResource Sharing, CORS)
spec.http.headers定义 header 操作规则,包括 request 和response header 的更新,增加,移除操作
spec.tcp定义一组有序的(优先匹配靠前的路由规则)应用于 TCP 流量的路由规则,该路由规则会应用于任何非 HTTP 和 TLS 的端口
spec.tcp.match定义 TCP 流量路由的匹配规则列表,单个匹配规则项内所有条件是且关系,列表中多个匹配规则之间为或关系
spec.tcp.route定义 TCP 连接转发的目的端
spec.tls定义一组有序的(优先匹配靠前的路由规则)应用于未终止的 TLS 或 HTTPS 流量的路由规则,该路由规则会应用于网格内部的 service 端口命名为https-,tls-开头的流量,来自 gateway 的端口协议为 HTTPS, TLS 的未终止加密流量,ServiceEntry 使用 HTTPS, TLS 协议的端口。当 https-,tls-端口未关联 VirtualService 规则时将会被视为TCP 流量
spec.tls.match定义 TLS 流量路由的匹配规则列表,单个匹配规则项内所有条件是且关系,列表中多个匹配规则之间为或关系
spec.tls.route定义连接转发的目的端

3.2.1 route详解

HTTPRoute规则的功能是:满足HTTPMatchRequest条件的流量都被路由到HTTPRouteDestination,执行重定向(HTTPRedirect)、重写(HTTPRewrite)、重试(HTTPRetry)、故障注入(HTTPFaultlnjection)、跨站(CorsPolicy)策略等。HTTPRoute不仅可以做路由匹配,还可以做一些写操作来修改请求本身。

3.2.2 match详解

match定义路由的匹配条件。

支持以下字段的定义:

  • uri, schema, method, authority: 这四个字段都是StringMatch类型,匹配请求时都支持exact, prefix和regex三种模式的匹配

    - match:- uri:prefix: /hello
    
  • headers: 匹配请求中的Header,是一个map类型。map的key是字符串类型,value是StringMatch类型。即对每一个Header的值,都可以使用精确、前缀和正则三种方式进行匹配。

    - match:- headers:source:exact: north
    
  • port: 表示请求服务的端口,大多数服务只开放一个端口,这也是在微服务中推荐的做法,在这种场景下可以不指定port;

  • sourceLabels: 是一个map类型的键值对,表示请求来源负载匹配标签。这在很多情况有用,可以对一组服务都打一个相同的标签,然后使用sourceLabels字段对这些服务实施相同的流量规则。在Kubernetes平台上,这里的Label就是Pod上的标签。

    http:
    - match:- sourceLabels:app: testAversion: v2
    
  • gateway: 表示规则应用的Gateway名称,语义同VirtualService 上面的gateway定义,是一个更细的Match条件,会覆盖在VirtualService上配置的gateway。

在VirtualServite中match字段都是数组类型。HTTPMatchRequest中的诸多属性如uri、header、method等都是“与”逻辑,而数组中几个元素间关系是“或”逻辑。

- match:- headers:source:exact: northuri:prefix: "/hello"- uri:prefix: "/hello2"

match包含两个HTTPMatchRequest元素,其条件的语义是:headers中的source取值为“north”,且uri以“/hello”开头的请求,或者uri以“/hello2”开头的请求。

3.2.3 路由目标

路由目标,RouteDestination

route字段是一个HTTPRouteDestination类型的数组,表示满足条件的流量目标。

  • destination 请求目标,包含host, subset, port三个属性

    1)host 在istio中注册的服务名

    2)subset 表示在host上定义的一个子集

    3)port

    spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hello.alisls.comsubset: v2- destination:host: hello.alisls.comsubset: v1
    
  • weight 权重

    weight表示流量分配的比例,在一个route下多个destination的weight总和要求是100。默认也是100,必填字段。

    示例:从原有的v1版本中切分20%的流量到v2版本,这也是灰度发布常用的一个流量策略,即不区分内容,平等的从总流量中切出一部分给新版本。

    spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hello.alisls.comsubset: v2weight: 20- destination:host: hello.alisls.comsubset: v1weight: 80
    
  • headers

    提供了对HTTP header的一种操作机制,可以修改一次HTTP请求中的Request或Response的值。包含request和response两个字段。

    • request

      表示发请求给目标地址时修改request的header

    • response

      表示返回应答时修改response的header

    对应的类型都是HeaderOperation类型,使用set, add, remove字段来定义对Header的操作。

    • set: 使用map上的key和value覆盖request和response中对应的header

    • add: 追加map上的key和value到原有的header

    • remove: 删除在列表中指定的header

3.2.4 HTTP重定向

HTTPRedirect包括两个重要的字段来表示重定向的目标

  • uri 替换URL中的uri部分

  • authority 替换URL中的Authority部分

1)用户请求老地址

http://hello.alisls.com/hello

2)服务端返回301重定向新地址

http://welcom.alisls.com/welcome

3)用户请求新地址

http://welcom.alisls.com/welcome
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: gateway-hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- match:- uri:prefix: /helloredirect:uri: /welcomeauthority: welcome.alisls.com

对hello.alisls.com服务所有前缀是/hello的请求都会被重定向到welcome.alisls.com的/welcome地址。

3.2.5 HTTP重写

通过HTTP重写可以在将请求转发给目标服务前修改HTTP请求中指定部分的内容,不同于重定向,用户是可见的(HTTP重写对用户实不可见的,因为在服务端进行的)。

重写HTTP也包括uri和authority两个字段

  • uri 重写URL中的Path部分

  • authority 重写URL中的Authority

和HTTPRedirect规则稍有不同的是,HTTPRedirect替换全部的Path;HTTPRewrite的uri是可以重写前缀的,即如果原来匹配条件是前缀匹配,则修改后只修改匹配到的前缀。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- match:- uri:prefix: /hellorewrite:uri: /welcomeroute:- destination:host: hello

前缀匹配/hello的请求,其请求uri中的这部分前缀会被/welcome替换。

3.2.6 HTTP重试

HTTP重试是解决很多请求异常最直接、简单的方法。尤其是在工作环境比较复杂的场景下,可提高总体服务质量。

但重试使用不当也会有问题,最糟糕的情况是重试一直不成功,反而增加延迟和性能开销。所以根据系统运行环境、服务自身特点,配置适当的重试规则显得尤为重要。

HTTPRetry可以定义请求失败时的重试策略,重试策略包括重试次数,超时,重试条件等,这里分别描述相应的三个字段:

  • attempts

    必选字段,定义重试次数

  • perTryTimeout

    每次重试超时的时间,单位可以是ms, s, m和h

  • retryOn

    进行重试的条件,可以是多个条件,以逗号分隔。

    取值包括以下几种:

    • 5xx: 在上游服务返回5xx应答码,或者在没有返回时重试

    • gateway-error: 类似5xx异常,只对502,503和504应答码进行重试

    • connect-failure: 在链接上游服务失败时重试

    • retriable-4xx: 在上游服务返回可重试的4xx应答码时执行重试

    • refused-stream: 在上游服务使用REFUSED_STREAM错误码重置时执行重试

    • cancelled: gRPC应答的Header中状态码是cancelled时执行重试

    • deadline-exceeded: 在gRPC应答的Header中状态码是deadline-exceeded时执行重试

    • internal: 在gRPC应答的header中状态码是internal时执行重试

    • resource-exhausted: 在gRPC应答的Header中状态码是resource-exhausted时执行重试

    • unavailable: 在gRPC应答的Header中状态码是unavailable时执行重试

    示例:

    配置一个重试策略,在5xx, connect-failure条件下进行最多5次重试,每次重试超时为3秒

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:name: hellonamespace: ns-istio
    spec:hosts:- hello.alisls.comhttp:- route:- destination:host: helloretries:attempts: 3perTryTimeout: 3sretryOn: 5xx, connect-failure
    

3.2.7 HTTP流量镜像

HTTP流量镜像是指将流量转发到原目标地址的同时,将流量给另外一个目标地址镜像一份。把生产环境中的实际流量镜像一份到另一个系统上,完全不会对生产系统产生影响。这里只镜像了一份流量,数据面代理只需要关注原来转发的流量就可以,不用等待原镜像目标地址的返回。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hellosubset: v1mirror:host: hellosubset: v2

3.2.8 HTTP故障注入

延时故障注入HTTPFaultInjection通过delay和abort两个字段设置延时和中止两种故障,分别表示Proxy延时转发HTTP请求和中止HTTP请求。

延时故障注入

使用HTTPFaultInjection.Delay类型描述延时故障。表示发送请求前进行一段延时,模拟网络、远端服务负载均衡等各种原因导致的失败,主要有以下两个字段:

  • fixedDelay

    必选字段,表示延时时间,单位可也是毫秒、秒、分钟和小时。至少大于1毫秒。

  • percentage

    配置的延迟故障作用在多少比例的请求上,通过这种方式可以只让部分请求发生故障。

示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hellosubset: v1fault:delay:percentage:value: 1.5fixedDelay: 10s

请求中止故障注入

使用HTTPFaultInjection.Abort描述中止故障,模拟服务端异常,给调用的客户端返回预先预先定义的错误状态码,主要有以下两个字段:

  • httpStatus 是一个必选字段,表示中止的HTTP状态码

  • percentage 配置中止故障作用在多少比例的请求上,通过这种方式可以只能让部分请求发生故障,用法同延时故障

示例:让hello的v1版本的服务1.5%的请求返回500

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hellosubset: v1fault:abort:percentage:value: 1.5httpStatus: 500

3.2.9 HTTP跨域资源共享

HTTP跨域资源共享 CORS(Cross Origin Resource Sharing)

当一个资源向该资源所在服务器的不同领域发起请求时,就会产生一个跨域的HTTP请求。出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求。通过跨域资源共享CORS机制可以允许Web应用服务器进行跨域访问控制,使跨域数据传递安全进行。在实现上是在HTTP Header中追加一些额外的信息来通知浏览器准许以上访问。

在VirtualService中可以对满足条件的请求配置跨域资源共享。有allowOrigin, allowMethods, allowHeader, exposeHeader, maxAge, allowCredentials, 其实都是被转化成Access-Control-*的Header。

示例:允许来在news.com的GET方法的请求的访问:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: vs-hellonamespace: ns-istio
spec:hosts:- hello.alisls.comhttp:- route:- destination:host: hellocorsPolicy:allowOrigin:- news.comallowMethods:- GETmaxAge: "2d"

3.3 DestinationRule

VirtualService中的destination中会包含Service子集的subset字段,这个服务子集就是通过DestinationRule定义的。

字段名称字段含义
spec.host关联 DestinationRule 配置的服务名称,可以是自动发现的服务(例如 Kubernetes servicename),或通过ServiceEntry声明的 hosts。如填写的服务名无法在上述源中找到,则该DestinationRule 中定义的规则无效
spec.subsets定义服务的版本(subsets),版本可通过标签键值对匹配匹配服务中的endpoints。可以在subsets 级覆盖流量策略配置
spec.trafficPolicy定义流量策略,包括负载均衡、连接池、健康检查、TLS 策略
spec.trafficPolicy.loadBalancer配置负载均衡算法,可配置:简单负载均衡算法(round robin, least conn, random…),一致性哈希(会话保持,支持按 headername,cookie,IP,query parameter 哈希),地域感知负载均衡算法
spec.trafficPolicy.connectionPool配置与上游服务的连接量,可设置 TCP/HTTP 的连接池
spec.trafficPolicy.outlierDetection配置从负载均衡池中驱逐不健康的 hosts
spec.trafficPolicy.tls连接上游服务的 client 端 TLS 相关配置,与PeerAuthentication 策略(server 端 TLS 模式配置)配合使用
spec.trafficPolicy.portLevelSettings配置端口级别的流量策略,端口级别的流量策略会覆盖服务/subsets 级别的流量策略配置

通过DestinationRule,我们可以定义设置,如负载均衡配置,连接池大小,局部异常检测,在路由发生后应用于流量。我们可以在trafficPolicy字段下设置流量策略。

  • 负载均衡器设置

  • 连接池设置

  • 局部异常点检测

  • 客户端TLS设置

  • 端口流量策略

示例:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: dr-hellonamespace: ns-istio
spec:host: hello.ns-istio.svc.cluster.localsubsets:- name: v1labels:version: v1- name: v1labels:version: v2                 

3.3.1 负载均衡器设置

通过负载均衡器设置,我们可以控制目的地使用哪种负载均衡算法。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: dr-hellonamespace: ns-istio
spec:host: hello.ns-istio.svc.cluster.localtrafficPolicy:loadBalancer:simple: ROUND_ROBIN # 轮询算法subsets:- name: v1labels:version: v1- name: v2labels:version: v2
  • simple字段指定负载均衡算法

    1)ROUND_ROBIN 轮询算法,默认

    2)LEAST_CONN 最少连接算法

    3)RANDOM 随机

    4)PASSTHROUGH 直接转发连接到客户端连接的目标地址,即没有做负载均衡

  • consistentHash字段

    一致性hash,并根据HTTP头,cookies或其他请求属性提供会话亲和性。

    httpHeaderName: 基于Header

    httpCookie: 基于Cookie

    useSourceIP: 基于源IP计算哈希值

    minimumRingSize: 哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细

    ...trafficPolicy:loadBalancer:consistentHash:httpCookie:name: locationttl: 4s
    

3.3.2 连接池配置

可以在TCP和HTTP层面应用于上游服务的每个主机,可用用来控制连接数量。

TCP连接池配置

1)maxConnections

上游服务的所有实例建立的最大连接数,默认是1024,属于TCP层面的配置,对于HTTP,只用于HTTP/1.1,因为HTTP/2对每个主机都使用单个连接。

2)connectTimeout: TCP连接超时,表示主机网络连接超时,可以改善因调用服务变慢导致整个链路变慢的情况。

3)tcpKeepalive: 设置TCP keepalives,属于istio1.1新支持的配置,定期给端发送一个keepalive的探测包,判断连接是否可用。

spec:host: hello.ns-istio.svc.cluter.localtrafficPolicy:connectionPool:tcp:maxConnections: 50connectTimeout: 25mstcpKeepalive:probes: 5time: 3600interval: 60s

Http连接池配置

1)http1MaxPendingRequests: 最大等待 HTTP 请求数,默认值是 1024,只适用于HTTP/1.1 的服务,因为 HTTP/2 协议的请求在到来时会立即复用连接,不会在连接池等待。

2)http2MaxRequests: 最大请求数,默认是1024。只适用于HTTP/2服务,因为HTTP/1.1使用最大连接数maxConnections即可,表示上游服务的所有实例处理的最大请求数。

3)maxRetries: 最大重试次数,默认是3,表示服务可以执行的最大重试次数。如果调用端因为偶尔抖动导致请求直接失败,则可能会带来业务损失,一般建议配置重试,若重试成功则可正常返回数据,只不过比原来响应得慢一点,但重试次数太多会影响性能,要谨使用。

4)idleTimeout: 空闲超时,定义在多长时间内没有活动请求则关闭连接。

http可用和tcp配合使用,示例:

spec:host: hello.ns-istio.svc.cluter.localtrafficPolicy:connectionPool:tcp:maxConnections: 80connectTimeout: 25mshttp:http2MaxRequests: 800maxRequestsPerConnection: 10

配置最大80个连接,只允许最多800个并发请求,每个连接的请求数不超过10个,连接超时是25毫秒。

3.3.3 异常点检查

异常点检测是一个断路器的实现,它跟踪上游服务中每个主机(Pod)的状态。如果一个主机开始返回5xx HTTP错误,它就会在预定的时间内被从负载均衡池中弹出。对于TCP服务,Envoy将连接超时或失败计算为错误。

两种健康检测:

  • 主动性

    定期探测目标服务实例,根据应答来判断服务实例的健康状态。如负载均衡器中的健康检查。

  • 被动性

    通过实际的访问情况来找出不健康的实例,如istio中的异常检查点。

异常实例检查相关配置:

  • consecutiveErrors:

    实例被驱逐前的连续错误次数,默认是5。

    对于HTTP服务,返回502,503和504的请求会被认为异常;

    对于TCP服务,连接超时或者连接错误事件会被认为异常;

  • interval

    驱逐的时间间隔,默认值为10s, 要求大于1ms,单位可以是时、分、毫秒;

  • baseEjectionTime

    最小驱逐时间。一个实例被驱逐的时间等于这个最小驱逐时间*驱逐次数。这样一个因多次异常被驱逐的实例,被驱逐的时间会越来越长。默认为30s,要求大于1ms,单位可以是时、分、毫秒。

  • maxEjectionPercent

    负载均衡池中可以被驱逐的故障实例的最大比例,默认为10%,设置这个值是为了避免太多的服务实例被驱逐导致服务整体能力下降。

  • minHealthPercent

    最小健康实例比例,是lstio 1.1新增的配置。当负载均衡池中的健康实例数的 例大于这个比例时,异常点检查机制可用;当可用实例数的比例小于这个比例时,异常点检查功能将被禁用,所有服务实例不管被认定为健康还是不健康,都可以接收请求。参数的默认值为50%。

trafficPolicy:connectionPool:http:http2MaxRequests: 500maxRequestsPerConnection: 10outlierDetection:consecutiveErrors: 10interval: 5mbaseEjectionTime: 10m

3.3.4 TLS设置

包含任何与上游服务连接的 TLS 相关设置。下面是一个使用提供的证书配置 mTLS 的例子:

...
trafficPolicy:tls:mode: MUTUALclientCertificate: /etc/certs/cert.pemprivateKey: /etc/certs/key.pemcaCertificates: /etc/certs/ca.pem

mtls: 双向认证,客户机和服务器都通过证书颁发机构彼此验证身份。

由同一个 root ca 生成两套证书,即客户端证书和服务端证书。客户端使用 https 访问服务端时,双方会交换证书,并进行认证,认证通过方可通信。

其他支持的 TLS 模式有 DISABLE(没有 TLS 连接),SIMPLE(在上游端点发起 TLS 连接),以及ISTIO MUTUAL(与MUTUAL类似,使用Istio的mTLS 证书)。

3.3.5 端口流量策略

在端口上配置流量策略,且端口上流量策略会覆盖全局的流量策略。

trafficPolicy:connectionPool:tcp:maxConnections: 80portLevelSettings:- port:number: 80loadBalancer:simple: LEAST_CONNconnectionPool:tcp:maxConnections: 100- port:number: 8000loadBalancer:simple: ROUND_ROBIN

3.3.6 服务子集

subset,定义服务子集

  • name 服务子集的名字

  • labels subset上的标签,通过一组标签定义了属于这个subset的服务实例。比如最常用的标识服务版本version标签

  • trafficPolicy 应用到这个subset上的流量策略

示例:

......
spec:hosts: hellosubsets:- name: v2labels:version: v2trafficPolicy:connectionPool:tcp:maxConnections: 80 # 给一个特定的subset配置最大连接数

四、Kiali组件

kiali组件位于:安装包/samples/addons,将这个目录下的所有插件都安装

执行安装

kubectl apply -f ./addons/

注意:如果在安装插件时出错,再运行一次命令。有一些和时间相关的问题,再次运行就能解决。

查看安装结果

kubectl get svc,pod -n istio-system
[root@node21 samples]# kubectl get svc,pod -n istio-system
NAME                           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
service/grafana                ClusterIP      10.99.8.238      <none>        3000/TCP                                                                     6m50s
service/istio-egressgateway    ClusterIP      10.102.75.82     <none>        80/TCP,443/TCP                                                               16h
service/istio-ingressgateway   LoadBalancer   10.108.158.227   <pending>     15021:31495/TCP,80:30645/TCP,443:30754/TCP,31400:31434/TCP,15443:31846/TCP   16h
service/istiod                 ClusterIP      10.105.204.23    <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        16h
service/jaeger-collector       ClusterIP      10.96.79.13      <none>        14268/TCP,14250/TCP,9411/TCP                                                 6m49s
service/kiali                  NodePort       10.96.12.6       <none>        20001:30418/TCP,9090:30171/TCP                                               17m
service/prometheus             ClusterIP      10.99.107.205    <none>        9090/TCP                                                                     6m49s
service/tracing                ClusterIP      10.111.187.36    <none>        80/TCP,16685/TCP                                                             6m49s
service/zipkin                 ClusterIP      10.98.207.250    <none>        9411/TCP                                                                     6m49sNAME                                       READY   STATUS    RESTARTS      AGE
pod/grafana-b854c6c8-ts8c5                 1/1     Running   0             6m50s
pod/istio-egressgateway-66d96985c-2xc4x    1/1     Running   2 (12h ago)   16h
pod/istio-ingressgateway-c5fd879b5-f4wkh   1/1     Running   2 (12h ago)   16h
pod/istiod-98988c6b6-8qvr8                 1/1     Running   2 (12h ago)   16h
pod/jaeger-54b7b57547-k5jxh                1/1     Running   0             6m49s
pod/kiali-5ff88f8595-7m4qb                 1/1     Running   0             17m
pod/prometheus-7b8b9dd44c-smvnn            2/2     Running   0             6m49s

修改kiali的Service类型为NodePort,方便外部可以访问

kubectl edit service kiali -n istio-system

访问

http://node21:30418/

五、实战

5.1 Hello服务实战

1)开发一个SpringBoot服务

2)发布Docker镜像

3)部署服务到Kubernetes

hello.yaml

apiVersion: v1
kind: Service
metadata:name: hellonamespace: ns-istio
spec:type: ClusterIP # Service的类型:ClusterIP, NodePort, LoadBalancer, ExternalNameports: # 端口信息- port: 8080 # service端口targetPort: 8080 # pod端口selector: # 标签选择器,用于确定当前service代理哪些podapp: hello
---
apiVersion: apps/v1
kind: Deployment
metadata:name: hellonamespace: ns-istio
spec:replicas: 1 # 副本数量selector: # 选择器,通过它指定该控制器管理哪些podmatchLabels:app: hellotemplate:metadata:labels:app: hellospec:containers:- name: helloimage: com.alisls/hello:1.0ports:- containerPort: 8080protocol: TCPnodeName: node26 # 为了调试方便,只发布到node26节点

4)部署Gateway和VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: gateway-hellonamespace: ns-istio
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:protocol: HTTPname: httpnumber: 80hosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: hellonamespace: ns-istio
spec:hosts:- "*"gateways:- gateway-hellohttp:- match:- uri:prefix: /helloroute:- destination:host: hello # service nameport:number: 8080 # service port

相关文章:

Istio 学习笔记

Istio 学习笔记 作者&#xff1a;王珂 邮箱&#xff1a;49186456qq.com 文章目录 Istio 学习笔记[TOC] 前言一、基本概念1.1 Istio定义 二、Istio的安装2.1 通过Istioctl安装2.2 通过Helm安装 三、Istio组件3.1 Gateway3.2 VirtulService3.2.1 route详解3.2.2 match详解3.2.3…...

测试面试宝典(三十三)—— 接口测试有没有测试出什么问题?

在之前的接口测试工作中&#xff0c;确实发现了一些问题。比如&#xff0c;在对某关键业务接口进行测试时&#xff0c;发现当输入的参数值超出正常范围时&#xff0c;接口没有按照预期返回错误提示&#xff0c;而是出现了系统崩溃的情况。 还有一次&#xff0c;在测试一个数据…...

YOLOV8模型转TFJS 在Mac下遇到的版本的坑

1.目的&#xff1a;将训练好的yolov8模型转化成TFJS格式&#xff0c;用于在浏览器中通过tensorflow调用&#xff1b; 遇到问题&#xff1a; A KerasTensor cannot be used as input to a TensorFlow function. 本地环境&#xff1a; python :3.11 自动安装的版本为&#xf…...

vue、react前端框架实现TodoList页面案例

原始TodoList网页&#xff08;主要就是链接里网页应用ndex.html、styles.css、script.js &#xff09;&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140657576 node、npn安装参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/…...

el-date-picker 时间控件校验选择时间必须早于当前时间(带时分秒)

el-date-picker 时间控件校验选择时间必须遭早于当前时间&#xff08;带时分秒&#xff09;&#xff0c;然后监控时间控件&#xff0c;当时间改变的时候&#xff0c;如果不是当天&#xff0c;那时间可以选择全天也就是00-24时&#xff0c;如果是当天&#xff0c;就是当前时间之…...

godot新建项目及设置外部编辑器为vscode

一、新建项目 初次打开界面如下所示&#xff0c;点击取消按钮先关闭掉默认弹出的框 点击①新建弹出中间的弹窗②中填入项目的名称 ③中设置项目的存储路径&#xff0c;点击箭头所指浏览按钮&#xff0c;会弹出如下所示窗口 根据图中所示可以选择或新建自己的游戏存储路径&…...

vue中无法调试

vue.config.js中增加 devtool configureWebpack: {name: name,resolve: {alias: {: resolve(src)}},devtool: "cheap-module-source-map" // add},然后重启即可。 顺便招聘&#xff1a;1.需要会日语。2.Java&#xff0c;JS&#xff0c;Vue&#xff0c;DB任一会者皆…...

python机器学习8--自然语言处理(2)

1&#xff0e;移除用词 在很多情况下&#xff0c;有一些文章内的英文字符、标点符号分词的结果不符合自己的预期&#xff0c;会出现一些不想要的分词&#xff0c;此时就能通过以下的函数自己设定用词&#xff0c;并且删除。 jieba.analyse.set_stop_words("stop_words.tx…...

LinkedList底层原理

节点&#xff08;Node&#xff09;结构 LinkedList 的核心是一个内部类 Node&#xff0c;每个 Node 对象代表链表中的一个元素&#xff0c;并且每个节点包含三个部分&#xff1a; 元素值 (item)&#xff1a;存储实际的数据。前驱节点引用 (prev)&#xff1a;指向当前节点前面…...

CSS技巧专栏:一日一例 11 -纯CSS实现多彩渐变按钮系列特效

CSS技巧专栏:一日一例 11 -纯CSS实现多彩渐变按钮系列特效 本篇,推荐给你几个按钮,先看一下图片 本例图片 案例分析 这是一个系列的按钮,它们具有共同的特点: 底层按钮层,具有一个彩色的渐变边框,上层是依据hover效果需要,可以是渐变,可以时白色。 鼠标hover效果…...

基于微信小程序+SpringBoot+Vue的自助点餐系统(带1w+文档)

基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序的自助点餐系统前后台分离&#xff0c;让商品订单&#xff0c;用户反馈信息&#xff0c;商品信息等相关信息集中在后台让管理员管理&#xff0c;让用…...

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A&#xff0c;但是接口A的响应结果不能满足需求&#xff1b;此时&#xff0c;有另一个…...

R语言优雅的进行广义可加模型泊松回归分析

泊松回归&#xff08;Poisson regression&#xff09;是以结局变量为计数结果时的一种回归分析。泊松回归在我们的生活中应用非常广泛&#xff0c;例如&#xff1a;1分钟内过马路人数&#xff0c;1天内火车站的旅客流动数&#xff0c;1天内的银行取钱人数&#xff0c;一周内的销…...

大模型学习笔记十四:Agent模型微调

文章目录 一、大模型需要Agent技术的原因二、Prompt Engineering可以实现Agent吗&#xff1f;&#xff08;1&#xff09;ReAct原理展示和代码&#xff08;2&#xff09;ModelScope&#xff08;3&#xff09;AutoGPT&#xff08;4&#xff09;ToolLLaMA 三、既然AutoGPT可以满足…...

大疆创新2025校招内推

大疆2025校招-内推 一、我们是谁&#xff1f; 大疆研发软件团队&#xff0c;致力于把大疆的硬件设备和大疆用户紧密连接在一起&#xff0c;我们的使命是“让机器有温度&#xff0c;让数据会说话”。 在消费和手持团队&#xff0c;我们的温度来自于激发用户灵感并助力用户创作…...

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…...

声音克隆一键本地化部署 GPT-SoVITS

文章目录 GPT-SoVITS 介绍1:GPT-SoVITS安装2:GPT-SoVITS使用2.1 人声伴奏分离,去混响去延时工具2.2 语音切分工具2.3 语音降噪工具2.4 中文批量离线ASR工具2.5 语音文本校对标注工具GPT-SoVITS 介绍 GPT-SoVITS: 是一个由RVC变声器创始人“花儿不哭”推出的免费开源项目。…...

使用【Easypoi】实现百万数据导出

本文使用easypoi实现百万级数据导出 文章目录 前言一、一般情况下导出二、解决思路三、实现步骤导入依赖重写方法调用实现 结束 前言 下文实现了通过easypoi实现将百万级数据导出 一、一般情况下导出 一般导出流程&#xff08;简单导出&#xff09;&#xff1a; 创建对应的…...

GRL-图强化学习

GRL代码解析 一、agent.py二、drl.py三、env.py四、policy.py五、utils.py 一、agent.py 这个Python文件agent.py实现了一个强化学习&#xff08;Reinforcement Learning, RL&#xff09;的智能体&#xff0c;用于在图环境&#xff08;graph environment&#xff09;中进行学习…...

昇思25天学习打卡营第22天|Pix2Pix实现图像转换

Pix2Pix图像转换学习总结 概述 Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的深度学习模型&#xff0c;旨在实现不同图像风格之间的转换&#xff0c;如从语义标签到真实图像、灰度图到彩色图、航拍图到地图等。这一模型由Phillip Isola等人在2017年提出&…...

全感知、全覆盖、全智能的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI安全管理平台&…...

ABC364:D - K-th Nearest(二分)

题目 在一条数线上有 NQNQ 个点 A1,…,AN,B1,…,BQA1​,…,AN​,B1​,…,BQ​ &#xff0c;其中点 AiAi​ 的坐标为 aiai​ &#xff0c;点 BjBj​ 的坐标为 bjbj​ 。 就每个点 j1,2,…,Qj1,2,…,Q 回答下面的问题&#xff1a; 设 XX 是 A1,A2,…,ANA1​,A2​,…,AN​ 中最…...

hive中分区与分桶的区别

过去&#xff0c;在学习hive的过程中学习过分桶与分区。但是&#xff0c;却未曾将分区与分桶做详细比较。今天&#xff0c;回顾skew join时涉及到了分桶这一概念&#xff0c;一时间无法区分出分区与分桶的区别。查阅资料&#xff0c;特地记录下来。 一、Hive分区 1.分区一般是…...

Blender材质-PBR与纹理材质

1.PBR PBR:Physically Based Rendering 基于物理的渲染 BRDF:Bidirection Reflectance Distribution Function 双向散射分散函数 材质着色操作如下图&#xff1a; 2.纹理材质 左上角&#xff1a;编辑器类型中选择&#xff0c;着色器编辑器 新建着色器 -> 新建纹理 -> 新…...

微软的Edge浏览器如何设置兼容模式

微软的Edge浏览器如何设置兼容模式&#xff1f; Microsoft Edge 在浏览部分网站的时候&#xff0c;会被标记为不兼容&#xff0c;会有此网站需要Internet Explorer的提示&#xff0c;虽然可以手动点击在 Microsoft Edge 中继续浏览&#xff0c;但是操作起来相对复杂&#xff0c…...

SpringBoot开启多端口探究(1)

文章目录 前情提要发散探索从management.port开始确定否需要开启额外端口额外端口是如何开启的ManagementContextFactory的故事从哪儿来创建过程 management 相关API如何被注册 小结 前情提要 最近遇到一个需求&#xff0c;在单个服务进程上开启多网络端口&#xff0c;将API的…...

优化算法:2.粒子群算法(PSO)及Python实现

一、定义 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物&#xff0c;每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息&#xff0c;逐渐向食物最多的地方聚集。PSO就是基于这…...

ThreadLocal面试三道题

针对ThreadLocal的面试题&#xff0c;我将按照由简单到困难的顺序给出三道题目&#xff0c;并附上参考答案的概要。 1. 简单题&#xff1a;请简述ThreadLocal是什么&#xff0c;以及它的主要作用。 参考答案&#xff1a; ThreadLocal是Java中的一个类&#xff0c;用于提供线…...

Git操作指令(已完结)

Git操作指令 一、安装git 1、设置配置信息&#xff1a; # global全局配置 git config --global user.name "Your username" git config --global user.email "Your email"# 显示颜色 git config --global color.ui true# 配置别名&#xff0c;各种指令都…...

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一&#xff1a;概要 Flume 是一个可配置、可靠、高可用的大数据采集工具&#xff0c;主要用于将大量的数据从各种数据源&#xff08;如日志文件、数据库、本地磁盘等&#xff09;采集到数据存储系统&#xff08;主要为Had…...

C语言 #具有展开功能的排雷游戏

文章目录 前言 一、整个排雷游戏的思维梳理 二、整体代码分布布局 三、游戏主体逻辑实现--test.c 四、整个游戏头文件的引用以及函数的声明-- game.h 五、游戏功能的具体实现 -- game.c 六、老六版本 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 一、整个排…...

npm publish出错,‘proxy‘ config is set properly. See: ‘npm help config‘

问题&#xff1a;使用 npm publish发布项目依赖失败&#xff0c;报错 proxy config is set properly. See: npm help config 1、先查找一下自己的代理 npm config get proxy npm config get https-proxy npm config get registry2、然后将代理和缓存置空 方式一&#xff1a; …...

Springboot 多数据源事务

起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate&#xff0c; 这个流程更简单一点)。 入口&#xff1a;ProxyTransa…...

Python每日学习

我是从c转来学习Python的&#xff0c;总感觉和c相比Python的实操简单&#xff0c;但是由于写c的代码多了&#xff0c;感觉Python的语法好奇怪 就比如说c的开头要有库&#xff08;就是类似于#include <bits/stdc.h>&#xff09;而且它每一项的代码结束之后要有一个表示结…...

数据库 执行sql添加删除字段

添加字段&#xff1a; ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果&#xff1a; 删除字段&#xff1a; ALTER TABLE 表明 DROP COLUMN 字段;...

前端开发:HTML与CSS

文章目录 前言1.1、CS架构和BS架构1.2、网页构成 HTML1.web开发1.1、最简单的web应用程序1.2、HTTP协议1.2.1 、简介1.2.2、 http协议特性1.3.3、http请求协议与响应协议 2.HTML概述3.HTML标准结构4.标签的语法5.基本标签6.超链接标签6.1、超链接基本使用6.2、锚点 7.img标签8.…...

ctfshow解题方法

171 172 爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -1 union select 1,group_concat(…...

探索 Blockly:自定义积木实例

3.实例 3.1.基础块 无输入 , 无输出 3.1.1.json var textOneJson {"type": "sql_test_text_one","message0": " one ","colour": 30,"tooltip": 无输入 , 无输出 };javascriptGenerator.forBlock[sql_test_te…...

MongoDB教程(二十三):关于MongoDB自增机制

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…...

展馆导览系统架构解析,从需求分析到上线运维

在物质生活日益丰富的当下&#xff0c;人们对精神世界的追求愈发强烈&#xff0c;博物馆、展馆、纪念馆等场所成为人们丰富知识、滋养心灵的热门选择。与此同时&#xff0c;人们对展馆的导航体验也提出了更高要求&#xff0c;展馆导览系统作为一种基于室内外地图相结合的位置引…...

Servlet详解(超详细)

Servlet详解 文章目录 Servlet详解一、基本概念二、Servlet的使用1、创建Servlet类2、配置Servleta. 使用web.xml配置b. 使用注解配置 3、部署Web应用4、处理HTTP请求和生成响应5、处理表单数据HTML表单Servlet 6、管理会话 三、servlet生命周期1、加载和实例化2、初始化3、 请…...

Meta AI引入Imagine Me功能,上传图片输入提示词即可实现个性化照片

AITOP100平台获悉&#xff0c;Meta 公司在 AI 领域再次迈出了重要的步伐&#xff0c;其发布的 Llama 3.1 开源 AI 模型以及对 Meta AI 功能的更新扩充引发了广泛关注。 其中&#xff0c;新引入的“Imagine Me”功能尤为引人注目。在这一功能下&#xff0c;美国地区的用户只需上…...

常用自启设置

一、开机自启动 1、编辑 vi /lib/systemd/system/nginx.service 文件&#xff0c;没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后&#xff0c;添加到nginx.service文件中&#xff1a; [Unit] Descriptionnginx Afternetwork.target remote-fs.targ…...

模块与组件、模块化与组件化的理解

在React或其他现代JavaScript框架中&#xff0c;模块与组件、模块化与组件化是核心概念&#xff0c;它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解&#xff1a; 模块与组件 模块&#xff08;Module&#xff09; 定义&#xff1a;模块是…...

Rust:cargo的常用命令

1.查看版本 $ cargo --version cargo 1.79.0 (ffa9cf99a 2024-06-03) 2.创建新的项目 $ cargo new hello 创建后的目录结构为 $ tree hello/ hello/ ├── Cargo.toml └── src └── main.rs 3.运行项目 $ cd hello $ cargo run Compiling hello v0.1.0 (/home/c…...

LeetCode 3106.满足距离约束且字典序最小的字符串:模拟(贪心)

【LetMeFly】3106.满足距离约束且字典序最小的字符串&#xff1a;模拟&#xff08;贪心&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/lexicographically-smallest-string-after-operations-with-constraint/ 给你一个字符串 s 和一个整数 k 。 定义函…...

Elasticsearch 与 MySQL 在查询和插入性能上的深度剖析

在当今的数据处理领域&#xff0c;选择合适的数据库对于应用的性能和效率至关重要。Elasticsearch 和 MySQL 作为两款常用的数据库&#xff0c;它们在查询和插入操作上的性能表现各有千秋。本文将对这两款数据库在这两个关键操作上进行详细的对比分析。 一、引言 随着数据量的…...

day4 vue2以及ElementUI

创建vue2项目 可能用到的命令行们 vue create 项目名称 // 创建项目 cd 项目名称 // 只有进入项目下&#xff0c;才能运行 npm run serve // 运行项目 D: //切换盘符 cd .. // 返回到上一级目录 clear // 清空终端 更改 Vue项目的端口配置 基础语法 项目创建完成之后&#…...

把redis用在Java项目

1. Java连接redis Java连接redis的方式是通过jedis&#xff0c;连接redis需要遵循jedis协议。 1.1 引入依赖 <!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…...

GORM:优雅的Go语言ORM库

文章目录 引言GORM原理基础使用安装GORM定义模型连接数据库CRUD操作 高级使用关联事务回调 优点结论 引言 在Go语言开发中&#xff0c;数据库操作是不可或缺的一部分。虽然直接使用SQL语句可以灵活地与数据库交互&#xff0c;但随着项目规模的扩大&#xff0c;SQL语句的编写、…...