Kong API网关

Kong API网关 API网关特点 集合多个API,统一API入口 避免内部信息泄露 提供安全认证 支持混合通讯协议 降低微服务复杂度 常用的API网关有:NGINX,Zuul,Kong Kong 介绍 kong是微服务中的一个网关组件,具有高可用和可扩展性,能提供易于使用的restful api来操作和配置API管理系统,同时它也可以通过负载均衡的功能把请求均匀的分发到各个服务器上,应对大量的请求。基于Nginx和OpenResty,是一个具有分布式、高性能、高并发、可伸缩…亚毫秒级延迟等特性和功能的微服务抽象层。 konga 是kong的UI界面 多用户管理 管理多个kong节点 使用快照备份,还原和迁移Kong节点 使用运行状态检查监控节点和API状态 数据库集成postgresSQL Kong 流程图 Kong 安装 Kong下载安装 Konga下载安装 API操作 文档地址 示例: 负载均衡 # 添加负载均衡 curl -i -X POST \ -H "Content-Type:application/x-www-form-urlencoded" \ -d "name=demo-upstream" \ 'http://127.0.0.1:8001/upstreams' #设置权重 curl -i -X POST \ -H "Content-Type:application/x-www-form-urlencoded" \ -d "target=127.0.0.1:8000" \ -d "weight=100" \ 'http://127.0.0.1:8001/upstreams/demo-upstream/targets' curl -i -X POST \ -H "Content-Type:application/x-www-form-urlencoded" \ -d "target=127.0.0.1:8080" \ -d "weight=500" \ 'http://127....

2023年08月01日 · 2 min · Leanku

Konga

Konga Konga的本质:Konga是一个图形化界面,它最终是通过调用你配置的 Kong Admin API 来修改Kong的配置的。 文档参考:遇到复杂场景时,最好的老师依然是Kong官方文档。 一、首次登录与初始化设置 访问Konga并注册:在浏览器中打开 http://<你的服务器IP>:1337。首次访问时,Konga会要求你注册一个管理员账户。填写用户名、邮箱和密码完成注册。 登录系统:注册成功后,Konga会自动跳转到登录页面,使用刚才注册的账号密码登录即可 二、 连接Konga与Kong网关 进入连接设置:登录成功后,你应该会看到"CONNECTIONS"或"Connections"界面。如果没有,请在左侧菜单或顶部导航栏中找到并点击 “Connections”。 填写Kong Admin API信息: Connection name:为你这个Kong连接起个名字,比如"My-Kong"或"Production"。 Kong Admin URL:这是你Kong网关的Admin API地址。非常重要! 格式通常是 http://:8001 如果你的Kong容器和Konga容器在同一个Docker网络(如 kong-net)中,你可以使用Kong的容器名和内部端口,例如:http://kong:8001。 如果你希望通过宿主机IP访问,可能需要使用宿主机的IP和映射给Kong Admin API的端口(例如 http://localhost:8001 或 http://<宿主机IP>:8001)。 激活连接:信息填写完毕后,点击 “Active” 或 “Connect” 等按钮来激活并测试连接。如果一切正常,Konga会提示连接成功。 三、 Konga核心功能与使用介绍 连接成功后,你就可以使用Konga来管理Kong了。Konga的核心功能围绕以下几个概念展开,理解它们之间的关系很重要: 概念 (Concept) 作用 (Role) 类比 (Analogy) 配置要点 (Key Configuration) Upstream 负载均衡组:代表一个虚拟主机名,用于对后端多个Target进行负载均衡。 球队的名称 Name:为Upstream命名(如 my-api-upstream)。 Target 具体目标:代表一个物理服务(IP+Port),是Upstream组内的一个具体后端实例。必须先创建Upstream,才能添加Target。 球队里的一个球员 Target:后端服务的IP或主机名及端口(如 192.168.1.100:8080)。Weight:权重,流量分配比例。 Service 服务抽象:是上游服务的抽象,可以直接指向一个具体的URL,也可以关联一个Upstream来实现负载均衡。 比赛的战术安排 Name:服务名称。Protocol:协议(HTTP/HTTPS)。Host:可填写具体URL或关联的Upstream名称。Port:端口。Path:路径(可选)。 Route 路由规则:定义客户端请求的匹配规则(如路径、域名),将匹配的请求路由到指定的Service。 根据球衣颜色决定把球传给谁 Paths:匹配的请求路径(如 /api)。Hosts:匹配的域名(可选)。Service:选择该路由要关联的Service。 四、 创建服务 (Services) 和路由 (Routes) 这是最常用的功能,用于将外部请求转发到你的后端服务。...

2023年08月01日 · 1 min · Leanku

VirtualBox+Vagrant使用

VirtualBox+Vagrant使用 一、 介绍 1. VirtualBox简介 VirtualBox是一个开源的 虚拟机管理软件,由 Oracle 开发。它的核心功能是允许你在一台物理机上运行多个虚拟机,每个虚拟机都可以装不同的操作系统。 特点: 跨平台:支持 Windows、Linux、macOS 主机上安装。 支持多种客操作系统:常见的 Linux 发行版(CentOS、Ubuntu)、Windows Server、BSD 等。 虚拟化功能: 配置虚拟 CPU、内存、磁盘、网卡等。 支持桥接网络、NAT、仅主机网络等多种网络模式。 GUI + CLI 管理:既可以用图形界面管理虚拟机,也可以用命令行 VBoxManage 控制。 适合个人和开发使用:开源免费,功能较全。 2. Vagrant简介 Vagrant 是一个虚拟机 自动化管理工具,它本身不提供虚拟化功能,而是调用 VirtualBox、VMware、Hyper-V、Docker 等“虚拟化提供者”(provider)来创建和管理虚拟机。 特点: 开发环境自动化: 通过 Vagrantfile 描述一台(或多台)虚拟机的配置,比如操作系统镜像、CPU/内存、网络、共享目录等。 跨平台一致性: 不同开发者只要用相同的 Vagrantfile,就能快速得到一模一样的开发环境,避免“在我机器上没问题”。 支持多种 Provider: 默认支持 VirtualBox,也可以配合 VMware、Hyper-V、Libvirt、Docker。 Provisioning(自动化配置): 可以在虚拟机启动时自动执行脚本(Shell、Ansible、Puppet、Chef)来安装软件和配置环境。 命令行简单: vagrant init → 生成配置文件 vagrant up → 启动虚拟机 vagrant ssh → 进入虚拟机 vagrant halt → 关闭虚拟机 vagrant destroy → 删除虚拟机...

2023年08月01日 · 4 min · Leanku

HTTP 详解:一次请求背后发生了什么?

HTTP 详解:一次请求背后发生了什么? 在 Web 开发中,HTTP 几乎无处不在。 浏览器访问一个页面,前端调用一个 API,PHP、Java、Go 服务之间进行 RPC,下载文件,提交表单,这些场景背后都可能使用 HTTP。 但很多开发者真正理解的 HTTP 只是: GET /users POST /login 200 OK Content-Type: application/json 如果继续往下追问: 浏览器输入一个 URL 后,到底发生了什么? 就会涉及 DNS、TCP、TLS、HTTP、连接复用、请求报文、响应报文、缓存等多个环节。 理解这些内容之后,很多常见问题都会变得容易: 为什么第一次请求比较慢? 为什么 HTTP/1.1 需要 Keep-Alive? HTTP/2 为什么能够同时处理多个请求? Cookie 和 Session 到底是什么关系? 304 是什么意思? 为什么 API 经常返回 401、403、404、409? HTTPS 到底保护了什么? HTTP 和 Socket、TCP 又是什么关系? 本文从一次实际请求开始,把这些概念串起来。 1. HTTP 到底是什么? HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个应用层的请求/响应协议。 它的核心模型非常简单: Client │ │ HTTP Request ▼ Server │ │ HTTP Response ▼ Client 客户端发送 Request,服务端返回 Response。...

2023年08月01日 · 7 min · Leanku

MySQL InnoDB 锁机制详解

MySQL InnoDB 锁机制详解 在并发业务中,多个事务可能同时修改或者读取相同的数据。如果没有并发控制,就可能出现脏写、数据覆盖、幻读等问题。 InnoDB 通过锁机制和 MVCC 等机制共同实现事务的并发控制。 例如两个事务同时修改同一条订单: UPDATE orders SET status = 2 WHERE id = 100; 如果事务 A 尚未提交,事务 B 同时执行相同的 UPDATE,那么事务 B 通常不能立即完成,而是需要等待事务 A 释放相关锁。 因此,理解 InnoDB 锁机制,对于分析以下问题非常重要: 为什么 UPDATE 会等待? 为什么 SELECT 有时候也会加锁? 为什么一个 UPDATE 影响了一行,却可能产生多个锁? 为什么会出现 Gap Lock? 为什么会发生死锁? 1. InnoDB 为什么需要锁 假设账户余额为: balance = 1000 事务 A: UPDATE accounts SET balance = balance - 100 WHERE id = 1; 同时事务 B: UPDATE accounts SET balance = balance - 200 WHERE id = 1; 如果两个事务完全不进行并发控制,就可能发生:...

2023年07月21日 · 4 min · Leanku

ElasticSearch介绍

ElasticSearch 一、 ElasticSearch介绍 Elasticsearch 是一个分布式、可扩展、实时的搜索和分析引擎,基于 Apache Lucene 构建。它能够快速存储、搜索和分析大量数据,广泛应用于全文搜索、日志分析、业务指标监控等场景。 Lucene 介绍 Lucene是开源、免费、高性能、纯Java编写的全文检索工具包 他是一个全文检索的工具包,是一个全文检索框架,并不是一个全文检索引擎 它非常复杂,并且需要Java集成使用 Lucene 和 ElasticSearch ElasticSearch和solr是基于lucene的开源项目 ElasticSearch通过简单易用的restful api接口,隐藏了lucene的复杂性 ElasticSearch自带分布式管理,并且可以跨语言使用 Lucene 和 Solr ElasticSearch自带分布式管理而Solr需要借助Zookpeeper实现分布式管理 Solr支持多格式的数据,在传统搜索中表现好于ES,但是它的更新效率比较低 ElasticSearch只支持json格式的数据,在处理实时索引搜索时明显好于Solr 二、. 核心概念 与关系型数据库的类比 关系型数据库 (MySQL) Elasticsearch Database (数据库) Index (索引) Table (表) Type (类型,已弃用) Row (行) Document (文档) Column (列) Field (字段) Schema (模式) Mapping (映射) 注意:Elasticsearch 7.x 开始移除了 Type 概念,现在一个索引直接包含文档。 1. 文档(Document) Elasticsearch 中的基本数据单元,类似于关系数据库中的一行记录。 文档以 JSON 格式存储,包含多个字段。 示例: { "id": 1, "title": "Elasticsearch Guide", "content": "Elasticsearch is a distributed search engine....

2023年07月19日 · 3 min · Leanku

Socket 详解:应用程序如何进行网络通信

Socket 详解:应用程序如何进行网络通信 上一篇《TCP/IP 详解:理解互联网通信的基础》文章介绍了 TCP/IP。 我们知道: 应用层 ↓ TCP / UDP ↓ IP ↓ 网络 TCP/IP 负责完成网络通信,但应用程序并不会直接操作 TCP 报文或者 IP 数据包。 应用程序通常通过操作系统提供的 Socket API 来使用网络能力。 因此,如果 TCP/IP 是网络通信的基础,那么 Socket 就是: 应用程序进入网络世界的接口。 对于后端开发来说,理解 Socket 非常重要。 HTTP Server、MySQL、Redis、RPC、WebSocket,以及各种 TCP 长连接服务,底层都离不开 Socket。 1. Socket 到底是什么? Socket 通常翻译为“套接字”。 它不是一个网络协议,而是一种网络通信接口和抽象。 应用程序可以通过 Socket: 创建通信端点 绑定地址 建立连接 发送数据 接收数据 关闭连接 例如 TCP 服务端的典型流程: socket() ↓ bind() ↓ listen() ↓ accept() ↓ read() / write() ↓ close() 客户端则通常是:...

2023年07月18日 · 6 min · Leanku

TCP/IP 详解:理解互联网通信的基础

TCP/IP 详解:理解互联网通信的基础 我们每天都在使用网络。 打开浏览器访问一个网站、使用 SSH 登录服务器、调用 HTTP API、连接 MySQL、使用 Redis,甚至程序之间建立 TCP 长连接,本质上都离不开一套共同的网络通信基础: TCP/IP 协议族。 很多后端开发者知道 TCP、UDP、IP、端口这些概念,但如果把它们放在一起,经常会产生几个疑问: TCP/IP 到底是什么? TCP 和 IP 分别负责什么? IP 地址和端口有什么区别? TCP 为什么需要三次握手? 数据到底是如何从一台机器到另一台机器的? Socket 又处于什么位置? HTTP 和 TCP 又是什么关系? 理解这些问题之后,后面的 Socket、HTTP、HTTPS、WebSocket 才会真正容易理解。 本文不试图把计算机网络所有知识一次讲完,而是从后端开发最需要掌握的角度,建立一套完整的 TCP/IP 基础认知。 1. TCP/IP 到底是什么? 首先需要纠正一个常见认识: TCP/IP 不是一个单独的协议,而是一组用于网络通信的协议族。 TCP/IP Protocol Suite,也就是 TCP/IP 协议族,包含多个不同层次、不同职责的协议。 例如: 应用层 ├── HTTP ├── DNS ├── SMTP └── SSH 传输层 ├── TCP └── UDP 网际层 ├── IP ├── ICMP └── ....

2023年07月10日 · 5 min · Leanku

PHP 8 新特性之枚举

PHP 8 新特性之枚举 枚举概览 枚举,或称 “Enum”,能够让开发者自定义类型为一系列可能的离散值中的一个。 在定义领域模型中很有用,它能够“隔离无效状态”(making invalid states unrepresentable)。 枚举以各种不同功能的形式出现在诸多语言中。 在 PHP 中, 枚举是一种特殊类型的对象。Enum 本身是一个类(Class), 它的各种条目(case)是这个类的单例对象,意味着也是个有效对象 —— 包括类型的检测,能用对象的地方,也可以用它。 最常见的枚举例子是内置的 boolean 类型, 该枚举类型有两个有效值 true 和 false。 Enum 使开发者能够任意定义出用户自己的、足够健壮的枚举。 Enum 类似 class,它和 class、interface、trait 共享同样的命名空间。 也能用同样的方式自动加载。 一个 Enum 定义了一种新的类型,它有固定、数量有限、可能的合法值。 示例 #1 用注解实现接口的可选方法 <?php // 通过传入参数:待搜索的注解类名,可返回指定的注解类, 而不需要再到反射类中迭代循环获取所有注解。 示例 <?php <?php // 声明新的枚举类型 Suit,仅有四个有效的值: Suit::Hearts、Suit::Diamonds、 Suit::Clubs、Suit::Spades。 enum Suit { case Hearts; case Diamonds; case Clubs; case Spades; } // 变量可以赋值为以上有效值里的其中一个。 函数可以检测枚举类型,这种情况下只能传入类型的值。 function pick_a_card(Suit $suit) { /* ....

2023年06月11日 · 1 min · Leanku

PHP 8 新特性之注解

PHP 8 新特性之注解功能 注解概览 注解功能提供了代码中的声明部分都可以添加结构化、机器可读的元数据的能力, 注解的目标可以是类、方法、函数、参数、属性、类常量。 通过 反射 API 可在运行时获取注解所定义的元数据。 因此注解可以成为直接嵌入代码的配置式语言。 通过注解的使用,在应用中实现功能、使用功能可以相互解耦。 某种程度上讲,它可以和接口(interface)与其实现(implementation)相比较。 但接口与实现是代码相关的,注解则与声明额外信息和配置相关。 接口可以通过类来实现,而注解也可以声明到方法、函数、参数、属性、类常量中。 因此它们比接口更灵活。 注解使用的一个简单例子:将接口(interface)的可选方法改用注解实现。 我们假设接口 ActionHandler 代表了应用的一个操作: 部分 action handler 的实现需要 setup,部分不需要。 我们可以使用注解,而不用要求所有类必须实现 ActionHandler 接口并实现 setUp() 方法。 因此带来一个好处——可以多次使用注解。 示例 #1 用注解实现接口的可选方法 <?php interface ActionHandler { public function execute(); } #[Attribute] class SetUp {} class CopyFile implements ActionHandler { public string $fileName; public string $targetDirectory; #[SetUp] public function fileExists() { if (!file_exists($this->fileName)) { throw new RuntimeException("File does not exist"); } } #[SetUp] public function targetDirectoryExists() { if (!...

2023年06月11日 · 2 min · Leanku