云原生Istio案例实战

news2024/10/1 10:53:39

目录

  • 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: prometheus
    servicePort: 9090


  • 执行命令
kubectl apply -f prometheus-ingress.yaml和grafana-ingress.yaml

grafana-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: grafana
    servicePort: 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. 这个微服务会调用 detailsreviews 两个微服务,用来生成页面。
  • 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.com
   http:
     paths:
     - path: /
       backend:
         serviceName: productpage
         servicePort: 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: productpage
 subsets:
 - name: v1
   labels:
     version: v1 # 版本
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule  # 声明了一个资源,这个资源也是需要依赖于crd
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

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:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: 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:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50 # 50%的流量到v1
    - destination:
        host: reviews
        subset: v3
      weight: 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:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: 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:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - fault:
      delay:
        percent: 50
        fixedDelay: 2s
    route:
    - destination:
        host: reviews
        subset: 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使用情况了

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

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

相关文章

计算机视觉--图像拼接

图像拼接 单应性变换仿射变换图像扭曲实现图像嵌入&#xff08;图中图&#xff09; RANSAC算法算法介绍图片收集无RANSAC优化和有RANSAC优化的代码实现差别 总结 单应性变换 单应性变换是指一个平面上的点通过一个矩阵变换映射到另一个平面上的点&#xff0c;这个变换矩阵是一…

java聊天室的设计与实现代码

聊天室是一个简单的通信应用&#xff0c;可以帮助您与客户和朋友保持联系&#xff0c;并且可以让您更轻松地与其他员工联系。然而&#xff0c;您将不得不确保每个人都知道他们正在做什么。 一旦聊天室开始&#xff0c;它就会变得非常复杂&#xff0c;因为有许多用户可能会同时登…

【三十天精通Vue 3】第二十五天 Vue3 与 Axios 后端数据交互

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue3 与 Axios 概述二、Axios 安装与基本使用2.1 安装 Ax…

NECCS|全国大学生英语竞赛C类|词汇和语法|语法题|时态|22:30~11:44

15题 10min 10:20&#xff5e;10:25 test2 10:25&#xff5e;10:47 test1订正 10:44&#xff5e;11:47 理论学习 涉及的语法点主要包括&#xff1a; 动词的时态和语态 非谓语动词 虚拟语气 主谓一致 倒装句 强调句 比较级 名词性从句 定语…

【SQL篇】面试篇之子查询

1303 求团队人数 # 写法1 # Write your MySQL query statement below select employee_id, count(*) over(partition by team_id) as team_size from Employee# 写法2 # Write your MySQL query statement below select employee_id, team_size from Employee e join (select t…

优雅编程,从空格、空行、缩进、注释开始

很多初学者的代码其实都不够“漂亮”&#xff0c;那是因为没有养成好的编码习惯。本篇博客以C语言为例&#xff0c;总结一些好习惯。其实&#xff0c;很多习惯都是肌肉记忆&#xff0c;举个例子&#xff1a;请你写一个程序&#xff0c;输入2个整数并输出它们的和。有些朋友可能…

springboot+vue前后端分离项目打包成jar包及运行

将 Spring Boot 和 Vue.js 项目打包成 jar 包需要按照以下步骤操作&#xff1a; 在项目的根目录中&#xff0c;使用命令行进入 Vue.js 项目的根目录&#xff0c;然后运行以下命令&#xff1a; npm run build这个命令将会构建 Vue.js 项目&#xff0c;并在项目的 dist 目录中生…

Rust-Rocket框架笔记

Rust-Rocket框架笔记 Rocket-Learn-docRocket Addr视频地址 What is RocketQuickStart下载Rocket-Rust运行Rust-Rocket-Hello-错误-端口占用解决查看端口占用情况添加Rocket.toml配置文件更改Rocket默认启动端口启动成功 GetStart-Hello world创建项目cargoIDEA 添加依赖添加Ro…

使用eclipse创建一个图书管理系统(2)---------逻辑的实现

就像使用C语言写代码一样。比如要用​​​​​​C语言写一个小游戏的代码&#xff0c;我们的逻辑实现是在哪里实现的啊&#xff1f;是不是在一个test.c源文件里面啊&#xff1f;没错&#xff0c;就是的&#xff01;在之前的文章里&#xff0c;我说过我定义的Main函数就像C语言里…

【《中国工业经济》数据复现】数字化转型与企业分工:专业化还是纵向一体化

一.研究内容 本文使用机器学习方法刻画微观企业数字化水平&#xff0c;并在构建数理模型的基础上实证考察了企业数字化转型对企业分工的影响及其机理。结果表明&#xff0c;企业数字化转型显著提升了中国上市企业专业化分工水平。机制分析表明&#xff0c;数字化转型对企业专业…

实现chatgpt自然对话

1.概述 ChatGPT是当前自然语言处理领域的重要进展之一&#xff0c;通过预训练和微调的方式&#xff0c;ChatGPT可以生成高质量的文本&#xff0c;可应用于多种场景&#xff0c;如智能客服、聊天机器人、语音助手等。本文将详细介绍ChatGPT的原理、实战演练和流程图&#xff0c…

C/C++每日一练(20230503)

目录 1. 输出最长的递增数字字符串 &#x1f31f;&#x1f31f; 2. 缺失的第一个正数 &#x1f31f;&#x1f31f;&#x1f31f; 3. 最大矩形 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日…

SaaS模医学检验信息管理系统源码,系统预设几十种报告模板,可在几分钟内批量生成报告

实验室信息管理系统云LIS源码 SaaS模式运维管理系统 云LIS系统源码是一款全面的实验室信息管理系统源码&#xff0c;其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&#xff0c;支持远程运维&…

Redis高频面试题,使用场景

一、缓存 1、什么是缓存穿透 ? 怎么解决 ? 缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库。 解决 方案一&#xff1a;缓存空数据&#xff0c;查询返回的数据为空&#xff0c;仍把这个空结果进行…

《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!

引言&#xff1a; 如果您想写篇有吸引力的文章&#xff0c;或者您是一个博客和网站的拥有者&#xff0c;那么您一定知道 SEO&#xff08;搜索引擎优化&#xff09;的重要性。SEO 可以帮助您提高相应的流量、转化率和收入&#xff0c;但是 SEO 也是一个复杂和耗时的过程&#x…

【开源项目】Dynamic-Tp核心流程源码解读

序.介绍 dynamic-tp 是一款动态线程池组件&#xff0c;可以实现线程池的实时动态调参及监控报警&#xff0c;线程池配置放在配置中心统一管理&#xff0c;达成业务代码零侵入&#xff0c;支持多配置中心的选择和常见的第三方组件的线程池的集成管理。 官网: https://dynamict…

C++学习day--01 C生万物

1、C/C学习中遇到的问题&#xff1a; 1. 大部分初学者&#xff0c;学习 C/C 都是从入门到放弃。 C/C太难吗&#xff1f; 2. 90% 以上的初学者&#xff0c;学完 C/C 以后&#xff0c;考试完了&#xff0c;书看完了&#xff0c; 但还是不会做项目 是学的不够好吗&#xff1…

基于KZG多项式承诺方案的RLN

1. 引言 RLN——Rate-Limiting Nullifier为PSE团队主导的项目&#xff0c;源自&#xff1a; Barry White Hat 2019年博客 Semaphore RLN, rate limiting nullifier for spam prevention in anonymous p2p setting RLN&#xff08;Rate-Limiting Nullifier&#xff09;是一种…

Servlet原理

什么是Servlet? Servlet是JavaWeb应用程序中的一种Java类&#xff0c;用于接收和处理来自客户端的请求&#xff0c;并将生成的响应发送回客户端。 Servlet是按照Java Servlet规范开发的&#xff0c;可以通过Servlet容器&#xff08;如Tomcat&#xff09;来管理和运行。Servl…

二十二、SQL 数据分析实战(案例1~案例10)

文章目录 案例1&#xff1a;用户信息表 stu_table案例2&#xff1a;员工绩效表 score_table案例3&#xff1a;销售冠军信息表 month_table案例4&#xff1a;月销售额记录表 sale_table案例5&#xff1a;每季度员工绩效得分表 score_info_table案例6&#xff1a;员工信息表 stu_…