高性能分布式API网关Kong

news2024/11/25 10:10:39

目录

  • 1 kong网关简介
  • 2 为什么需要 API 网关
    • 2.1 和Spring Cloud Gateway区别
  • 3 为什么要使用kong
    • 3.1 kong的组成部分
    • 3.2 Kong网关的特性
  • 4 kong网关架构
    • 4.1 Kong网关请求流程
  • 5 kong 部署
    • 5.1 搭建网络
    • 5.2 搭建数据库环境
    • 5.3 kong网关部署
      • 5.3.1 初始化kong数据
      • 5.3.2 启动Kong容器
      • 5.3.3 验证
  • 6 Kong配置
    • 6.1 nginx模板
    • 6.2 kong配置案例
    • 6.3 测试验证
    • 6.4 Kong关键术语
      • 6.4.1 Upstream
      • 6.4.2 Target
      • 6.4.3 Service
      • 6.4.4 Route
      • 6.4.5 Consumer
      • 6.4.6 Plugin
  • 7 kongAPI操作
    • 7.1 配置网关
      • 7.1.1 配置服务
      • 7.1.2 添加路由
      • 7.1.3 访问测试
    • 7.2 配置负载均衡
      • 7.2.1 配置 upstream 和 target
      • 7.2.2 配置service
      • 7.2.3 配置路由信息
      • 7.2.4 访问测试
  • 8 安装Kong 管理UI
    • 8.1 初始化konga数据
    • 8.2 启动konga
    • 8.3 验证
    • 8.4 连接kong网关
    • 8.5 限流插件
      • 8.5.1 路由配置限流
      • 8.5.2 测试验证
      • 8.5.3 配置属性如下


1 kong网关简介

在这里插入图片描述

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目

​ Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

2 为什么需要 API 网关

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。

在这里插入图片描述

​ 在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度。如上图左所示,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单独实现,这使得系统维护者没有一个全局的视图来统一管理这些功能。API 网关致力于解决的问题便是为微服务纳管这些通用的功能,在此基础上提高系统的可扩展性。如右图所示,微服务搭配上 API 网关,可以使得服务本身更专注于自己的领域,很好地对服务调用者和服务提供者做了隔离。

​ 目前,比较流行的网关有:Nginx 、 Kong 、Orange等等,还有微服务网关Zuul 、Spring Cloud Gateway等等

​ 对于 API Gateway,常见的选型有基于 Openresty 的 Kong、基于 Go 的 Tyk 和基于 Java 的 gateway,这三个选型本身没有什么明显的区别,主要还是看技术栈是否能满足快速应用和二次开发。

2.1 和Spring Cloud Gateway区别

  • 像Nginx这类网关,性能肯定是没得说,它适合做那种门户网关,是作为整个全局的网关,是对外的,处于最外层的;而Gateway这种,更像是业务网关,主要用来对应不同的客户端提供服务的,用于聚合业务的。各个微服务独立部署,职责单一,对外提供服务的时候需要有一个东西把业务聚合起来。
  • 像Nginx这类网关,都是用不同的语言编写的,不易于扩展;而Gateway就不同,它是用Java写的,易于扩展和维护
  • Gateway这类网关可以实现熔断、重试等功能,这是Nginx不具备的

所以,你看到的网关可能是这样的

在这里插入图片描述

3 为什么要使用kong

  • 插件市场丰富,很多插件可以降低开发成本;
  • 可扩展性,可以编写lua脚本来定制自己的参数验证权限验证等操作;
  • 基于openResty,openResty基于Nginx保障了强劲的性能;
  • 便捷性能扩容,只需要水平增加服务器资源性能就能提升 ;
  • 负载均衡健康检查

3.1 kong的组成部分

Kong主要有三个组件

  • Kong Server :基于nginx的服务器,用来接收API请求。
  • Apache Cassandra/PostgreSQL :用来存储操作数据。
  • Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api

​ Kong采用插件机制进行功能定制,插件集(可以是0或N个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。

3.2 Kong网关的特性

Kong网关具有以下的特性

  • 可扩展性: 通过简单地添加更多的服务器,可以轻松地进行横向扩展,这意味着您的平台可以在一个较低负载的情况下处理任何请求;
  • 模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API轻松配置;
  • 在任何基础架构上运行: Kong网关可以在任何地方都能运行。您可以在云或内部网络环境中部署Kong,包括单个或多个数据中心设置,以及public,private 或invite-only APIs。

4 kong网关架构

  1. Kong核心基于OpenResty构建,实现了请求/响应的Lua处理化;
  2. Kong插件拦截请求/响应,如果接触过Java Servlet,等价于拦截器,实现请求/响应的AOP处理;
  3. Kong Restful 管理API提供了API/API消费者/插件的管理;
  4. 数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra;
  5. Kong集群中的节点通过gossip协议自动发现其他节点,当通过一个Kong节点的管理API进行一些变更时也会通知其他节点。每个Kong节点的配置信息是会缓存的,如插件,那么当在某一个Kong节点修改了插件配置时,需要通知其他节点配置的变更。

4.1 Kong网关请求流程

为了更好地理解系统,这是使用Kong网关的API接口的典型请求工作流程:

在这里插入图片描述

​ 当Kong运行时,每个对API的请求将先被Kong命中,然后这个请求将会被代理转发到最终的API接口。在请求(Requests)和响应(Responses)之间,Kong将会执行已经事先安装和配置好的任何插件,授权您的API访问操作。Kong是每个API请求的入口点(Endpoint)。

5 kong 部署

5.1 搭建网络

​ 首先我们创建一个Docker自定义网络,以允许容器相互发现和通信。在下面的创建命令中kong-net是我们创建的Docker网络名称。

xxxxxxxxxx
docker network create kong-net

5.2 搭建数据库环境

​ Kong 目前使用Cassandra(Facebook开源的分布式的NoSQL数据库) 或者PostgreSql,你可以执行以下命令中的一个来选择你的Database。请注意定义网络 --network=kong-net

xxxxxxxxxx
docker run -d --name kong-database --network=kong-net -p 5432:5432 -v /tmp/data/kong:/var/lib/postgresql/data -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:11.7

5.3 kong网关部署

5.3.1 初始化kong数据

使用docker run --rm来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。

xxxxxxxxxx
docker run --rm --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:latest kong migrations bootstrap

这个命令我们还是要注意的,一定要跟你声明的网络,数据库类型、host名称一致。同时注意Kong的版本号,本文是在Kong 1.4.x 版本下完成的。

出现如下信息说明数据初始化成功

在这里插入图片描述

5.3.2 启动Kong容器

完成初始化数据库后,我们就可以启动一个连接到数据库容器的Kong容器,请务必保证你的数据库容器启动状态,同时检查所有的环境参数 -e 是否是你定义的环境

xxxxxxxxxx
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest

5.3.3 验证

通过服务器执行curl访问尝试服务是否已经启动

xxxxxxxxxx
curl http://localhost:8001/status

在这里插入图片描述

出现如下信息说明服务已经启动

6 Kong配置

6.1 nginx模板

我们来看一个典型 Nginx 的配置对应在 Kong 上是怎么样的,下面是一个典型的 Nginx 配置

xxxxxxxxxx
upstream passportUpstream {
    server 192.168.64.1:9001 weight=10;
    server 192.168.64.1:9002 weight=10;
}
server {
    listen 80;
    location /hello {
        proxy_pass http://passportUpstream;
    }
}

6.2 kong配置案例

下面我们开看看其对应 Kong 中的配置

xxxxxxxxxx
# 配置 upstream 
curl -X POST http://localhost:8001/upstreams --data "name=passportUpstream" 

# 配置 target 
curl -X POST http://localhost:8001/upstreams/passportUpstream/targets  --data "target=172.16.44.47:9001" --data "weight=10" 

# 配置 service 
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=passportUpstream" 

# 配置 route 
curl -X POST http://localhost:8001/routes \
--data "paths[]=/hello" \
--data "service.id=2fa18352-2aed-449d-9707-8cbfadba3972"

​ 这一切配置都是通过其 Http Restful API 来动态实现的,无需我们再手动的 reload Nginx.conf

6.3 测试验证

可以通过如下URL进行测试

xxxxxxxxxx
http://192.168.245.145:8000/hello/index

在这里插入图片描述

6.4 Kong关键术语

​ 在上述的配置中涉及到了几个概念: Upstream、Target、Service、Route 等概念,它们是 Kong 的几个核心概念,也是我们在使用 Kong API 时经常打交道的,下面我们就其几个核心概念做一下简单的说明。

6.4.1 Upstream

​ Upstream 对象表示虚拟主机名,可用于通过多个服务(目标)对传入请求进行负载均衡。例如:service.v1.xyz 为 Service 对象命名的上游 Host 是 service.v1.xyz 对此服务的请求将代理到上游定义的目标。

6.4.2 Target

目标 IP地址/主机名,其端口表示后端服务的实例。每个上游都可以有多个 Target,并且可以动态添加 Target。

​ 由于上游维护 Target 的更改历史记录,因此无法删除或者修改 Target。要禁用目标,请发布一个新的 Targer weight=0,或者使用 DELETE 来完成相同的操作

6.4.3 Service

顾名思义,服务实体是每个上游服务的抽象,服务的示例是数据转换微服务,计费API等。

​ 服务的主要属性是它的 URL(其中,Kong 应该代理流量),其可以被设置为单个JSON串或通过指定其 protocol, host,port 和path。

​ 服务与路由相关联(服务可以有许多与之关联的路由),路由是 Kong 的入口点,并定义匹配客户端请求的规则。一旦匹配路由,Kong 就会将请求代理到其关联的服务。

6.4.4 Route

路由实体定义规则以匹配客户端的请求。每个 Route 与一个 Service 相关联,一个服务可能有多个与之关联的路由,与给定路由匹配的每个请求都将代理到其关联的 Service 上。可以配置的字段有:

  • hosts
  • paths
  • methods

Service 和 Route 的组合(以及它们之间的关注点分离)提供了一种强大的路由机制,通过它可以在 Kong 中定义细粒度的入口点,从而使基础架构路由到不同上游服务。

6.4.5 Consumer

​ Consumer 对象表示服务的使用者或者用户,你可以依靠 Kong 作为主数据库存储,也可以将使用者列表与数据库映射,以保持Kong 与现有的主数据存储之间的一致性。

6.4.6 Plugin

​ 插件实体表示将在 HTTP请求/响应生命周期 期间执行的插件配置。它是为在 Kong 后面运行的服务添加功能的,例如身份验证或速率限制。

​ 将插件配置添加到服务时,客户端向该服务发出的每个请求都将运行所述插件。如果某个特定消费者需要将插件调整为不同的值,你可以通过创建一个单独的插件实例,通过 service 和 consumer 字段指定服务和消费者。

7 kongAPI操作

7.1 配置网关

7.1.1 配置服务

xxxxxxxxxx
# 添加服务
curl -i -X POST http://192.168.64.181:8001/services/ -d 'name=test-service' -d 'url=http://116.62.213.90/1.html'

url 参数是一个简化参数,用于一次性添加 protocol,host,port 和 path。

7.1.2 添加路由

xxxxxxxxxx
# 添加service 的路由
curl -i -X POST http://192.168.64.181:8001/routes/ -d 'methods=GET' -d 'paths=/service' -d 'service.id=65c11356-e86d-431e-a76a-aa7c3acd9aeb'

7.1.3 访问测试

xxxxxxxxxx
# 通过如下URL访问
http://192.168.64.181:8000/service?a=123

7.2 配置负载均衡

7.2.1 配置 upstream 和 target

创建一个名称 load 的 upstream

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/upstreams --data "name=load"

添加3000 端口的负载

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/upstreams/load/targets --data "target=192.168.64.1:9001" --data "weight=10"

curl -X POST http://192.168.64.181:8001/upstreams/load/targets --data "target=192.168.64.1:9002" --data "weight=10"

如上的配置对应了 Nginx 的配置

xxxxxxxxxx
upstream load {
    server 192.168.64.181:9001 weight=10;
    server 192.168.64.181:9002 weight=10;
}

7.2.2 配置service

host 的值便对应了 upstream 的名称,配置成功后会返回生成的 service 的 id

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/services --data "name=load-service" --data "host=load"

7.2.3 配置路由信息

这里的service.id 就是上面添加service

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/routes --data "paths[]=/load" --data "service.id=3a6b839b-00c1-49b7-b271-8024a12d19be"

7.2.4 访问测试

http://192.168.64.181:8000/load/index

8 安装Kong 管理UI

Kong 企业版提供了管理UI,开源版本是没有的。但是有很多的开源的管理 UI ,其中比较好用的是Konga。项目地址:https://github.com/pantsel/konga

在这里插入图片描述

8.1 初始化konga数据

使用docker run --rm来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。

xxxxxxxxxx
docker run --name konga --rm \
--network=kong-net \
pantsel/konga -c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/kong

执行后出现如下界面说明执行成功

在这里插入图片描述

8.2 启动konga

xxxxxxxxxx
docker run -p 1337:1337 -d \
--network=kong-net \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=kong-database" \
-e "DB_USER=kong" \
-e "DB_PASSWORD=kong" \
-e "DB_DATABASE=kong" \
-e "KONGA_HOOK_TIMEOUT=120000" \
-e "DB_PG_SCHEMA=public" \
-e "NODE_ENV=production" \
--name konga \
pantsel/konga

8.3 验证

通过浏览器请求 http://IP:1337 检查是否能够访问,如果能够访问说明已经启动成功

在这里插入图片描述

8.4 连接kong网关

在这个界面添加一个用户 登录就可以看到如下页面

在这里插入图片描述

点击Connections 来填加kong的信息

在这里插入图片描述

添加kong名称以及API地址就可以管理kong了

在这里插入图片描述

添加后点击’active’激活按钮就可以激活kong网关

在这里插入图片描述

然后就会出现如下界面管理可以通过菜单操作管理kong

在这里插入图片描述

8.5 限流插件

限流的场景:服务提供的能力是有限的。为了防止大量的请求将服务拖垮,可以通过网关对服务的请求做限流。例如:某个服务1s只能处理100个请求,超过限流阈值的请求丢弃。

8.5.1 路由配置限流

为/load的路由添加限流插件

在这里插入图片描述

设置限流为每分钟2个

在这里插入图片描述

8.5.2 测试验证

多次访问 http://192.168.64.150:8000/load 发现已经被限流了

在这里插入图片描述

8.5.3 配置属性如下

属性说明是否必须默认示例
consumer设置消费之,当时用身份认证时能够识别出消费者所有消费者
second限制每秒最多有几个请求2
minute限制每分钟最多有几个请求10
hour限制每小时最多有几个请求100
day限制每天最多有几个请求100
year限制每年最多有几个请求100
limit by统计限额的标准,consumer, credential, ip, service,如果无法确定,将以IP为主consumerconsumer
policycluster:将计数器保存在数据库里,local:将计数器保存在本地,redsi:将计数器保存在redis里面clustercluster
fault tolerant第三方数据存储遇到问题时是否会代理请求,如果为YES,在数据库恢复正常前,限流将会禁用,如果为 NO,将会报500错误YESYES
redis host当 policy 为 redis 时设置
redis port当 policy 为 redis 时设置6379
redis password当 policy 为 redis 时设置
redis timeout当 policy 为 redis 时设置2000
redis database当 policy 为 redis 时设置0
hide client headers隐藏客户端响应头NONO

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

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

相关文章

【项目】树莓派4B镜像安装

本文主要记录下如何使用Raspberry Pi image 软件进行树莓派镜像进行安装。 官网:Raspberry Pi OS – Raspberry Pi 百度网盘: 链接:https://pan.baidu.com/s/1G7z1Fdvk5Chmhj894WPU3A 提取码:xnzw 一、格式化SD卡 若SD卡存在…

释放潜能——解读新时代OEM竞争规则,打造精雕细琢的用户体验

从消费零售全领域的实践观察来看,仅仅凭借产品赢得竞争的时代已经过去,商业模式创新体现在越来越多企业向“产品服务”转变,向用户全生命周期需求挖掘转变。企业与消费者之间的关系从过去的一次性、断点式产品交易,转向持续性、覆…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件?2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于:https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践 高分辨率大图像在 Web 中查看可以使用 Deep Zoom 技术,这是一种用于查看和浏览大型高分辨率图像的技术,它可以让用户以交互方式浏览高分辨率大图像,并且能够在不影响图像质量的情况下进行…

搭建个人网站 保姆级教程(四)Navicat链接mySql 失败

长时间没有折腾云服务器上的mysql了,今天再次使用Navicat连接云服务器上的mysql时,输入密码报错! 1130 - Host ‘119.130.212.168’ is not allowed to connect to this MySQL server 1.于是Royal TSX 远程服务器查看mysql的状态 systemctl …

通达信标记文字中可能用到的特殊符号大全

特殊符号是难以直接输入的符号,特殊符号是符号的一种,比如说圆圈(〇)、叉号(✕、✖、✘)、五角星(★、☆)、勾号(✓、✔) 。 01.特殊符号简表 ♠♣♧♡♥❤…

chatgpt赋能python:Python强制取整:如何在Python中正确进行取整操作

Python强制取整:如何在Python中正确进行取整操作 Python是一种广泛使用的编程语言,有许多不同的用途,包括数据分析、web开发、机器学习、科学计算等等。Python语言非常容易学习和使用,但有时候它的行为可能会出人意料&#xff0c…

alpa概览

文章目录 背景alpa简介DeviceMesh跨 DeviceMeshes 的 GPU Buffer管理Ray CollectivePipeline parallelism runtime orchestration运行时 背景 LLM训练有3D并行的需求(alpa将数据并行视为张量并行,即张量沿batch切分) 算子间并行的通信成本小…

【Vue】父子组件传参 孙子调用爷爷的方法 provide inject

一. 父传子 父组件先在data中定义要传给子组件的属性名父组件在中引入子组件在components中注册使用步骤 3 中注册好的子组件在 3 中,父传子 (1)利用 : 将父组件的对象、数组、字符串等传给子组件,供子组件使用 (2&am…

Rocky Linux9安装教程

序言 Centos废了,最近在考虑将服务器迁移至Rockylinux系统,在这里记录下安装过程 当前安装版本RockyLinux9.2(minimal版本),VMware Fusion专业版13.0.2 创建虚拟机 第一步: 先下载好ISO文件&#xff0c…

python-高级特性

文章目录 1.生成式2.生成器3.闭包4.装饰器(1)万能装饰器的实现(2)含参数的装饰器(3)多装饰器 5.内置高阶函数 1.生成式 列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表…

2023.6.7小记——什么是FPGA?

最近打算开始继续做一些个人分享,已经太久时间没有写文章了,感觉这样下去肯定不是个好事,当程序员当然是要保持分享~ 标题就暂时先以每天我认为最重要的一点来取,内容不仅限于此。 1. 什么是FPGA? 全称是Field-Progra…

PCL 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

Linux操作系统——第二章 进程控制

目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 进程常见退出方法 _exit函数 exit函数 return退出 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 进程程序…

接口测试框架实战 | 通用 API 封装实战

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

火龙果MM32F3273G8P开发板MindSDK开发教程3 - Sysclk的配置

Sysclk的配置 1、时钟初始化流程 一般流程为startup_mm32f3273g.s中调用system_mm32f3273g.c中的SystemInit函数完成系统时钟的初始,而system_mm32f3273g.c中函数是空的。 原来MindSdk时钟初始化的流程放到了clock_init.c中。 2、采用外部高速时钟源 先弄清几个…

Effective第三版 中英 | 第二章 创建和销毁对象 | 通过私有构造器强化不可实例化的能力

文章目录 Effective第三版前言第二章 创建和销毁对象通过私有构造器强化不可实例化的能力 Effective第三版 前言 大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记…

文本三剑客 之 grep

目录 一.grep 1.grep常用选项命令选项 2.grep 命令选项 3.简单的正则表达式 二.sort 命令 三.uniq 去重 四 .语法格式: tr 选项 参数 五.快速裁剪命令——cut: 六.split 文件拆分 七.文件合并——paste 一.grep 文本三剑客了之一,对文本内容进行…

网络通信 --- HTTP 协议初识

目录 🌲一、HTTP 协议是什么 🌳二、HTTP协议格式 🦪1.抓包工具的使用(以 Fiddler 为例) 🍣2. 抓包工具的原理 (以 Fiddler 为例) 🍤3. 抓包结果 🍥① HTTP 请求(request) 🥮②HTTP响应(re…

chatgpt赋能python:Python中的平均值如何计算?

Python中的平均值如何计算? 在Python编程中,求取列表、元组或数据集合的平均值是一个相当常见的操作。幸运的是,Python内置的统计模块提供了方便的方法去实现这个操作。在这篇文章里,我们将探讨计算平均值的方法,帮助…