跳到主要内容

14 篇博文 含有标签「APISIX」

查看所有标签

· 4 分钟阅读
CheverJohn

讲真为什么我会遇到这一块的问题呢?主要还是不熟悉开发流程。 虽然我已经安装好了APISIX,且APISIX的基本内容我都有所了解了。 可是在我实操过程中,还是遇到了很多问题,当然最终发现其实都是基本环境没做好(没有上游服务器端口应该算是基本环境吧?)

开干!

淦,拖了好久了,开始!——2022年2月13日

其实就是给 APISIX 的上游( upstream )添加一个服务器,这里边讨巧选择了 OpenResty。

首先我们已经按照 APISIX 的前置教程安装好了 OpenResty 了,这个必须先确定下来。

安装命令如下:

# 添加 OpenResty 源
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 安装 OpenResty 和 编译工具
sudo yum install -y openresty curl git gcc openresty-openssl111-devel unzip pcre pcre-devel

# 安装 LuaRocks
curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash -

然后这边再强化一下观念,安装之前本地的代理呀、基本软件(如 git、gcc、unzip等)都要先配置好!

然后我们本地的 OpenResty 的地址可以通过以下命令找回:

OpenResty 的位置

开始配置

跟配置 NGINX 一样

cd /usr/local/openresty/nginx/conf/vhost/1980.conf

首先你先在 conf 文件夹里创建 vhost 文件夹,然后在 /usr/local/openresty/nginx/conf/nginx.conf 文件最下面添加。

添加位置如图

NGINX 文件配置

然后添加如下内容

server {
listen 1980;
access_log logs/access-1980.log main;
error_log logs/error.log;
location / {
content_by_lua_block {
ngx.header["Content-Type"] = "text/html"
local headers = ngx.req.get_headers()
ngx.say("---Headers")
for k, v in pairs(headers) do
ngx.say(k .. ":" .. v)
end

local args = ngx.req.get_uri_args()
ngx.say("---Args")
for k, v in pairs(args) do
ngx.say(k .. ":" .. v)
end

ngx.say("---URI")
ngx.say(ngx.var.uri)

ngx.say("---Service Node")
ngx.say("Ubuntu-DEV-1980")
}
}
}

如图 1980 配置文件内容以及文件树

然后就直接

openresty

启动 1980 服务器即可。

可以看到后端端口,基本上应该打开的都打开咯!

所有端口

来一套基本操作

进行一套基本操作,来试试 APISIX 哈

使用 GraphQL 的配置请求说明问题

命令来自于下面的链接:https://www.cheverjohn.xyz/blog/%E5%9F%BA%E7%A1%80%E5%91%BD%E4%BB%A4_graphql%E5%9C%A8APISIX%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8

实现配置 GraphQL 在 APISIX 中

配置

然后发出请求

请求

如此以来,我就配置好了我的一系列测试,新春快乐!

· 21 分钟阅读
CheverJohn

了解网关

In computer networking and telecommunications, a gateway is a component that is part of two networks, which use different protocols. The gateway will translate one protocol into the other. A router is a special case of a gateway.

Gateways, also called protocol converters, can operate at any network layer. The activities of a gateway are more complex than that of the router or switch as it communicates using more than one protocol.

Both the computers of internet users that serve pages to users are host nodes. The nodes that connect the networks in between are gateways. These are gateway nodes:

  • the computers that control traffic between company networks
  • the computers used by internet service providers (ISPs) to connect users to the internet

gateway must be implied on larger networks to interconnect them.

计算机网络和通信交流中,网关是一个承载两个网络之间的一个部分,两个网络可能会使用不同的协议。网关将会进行对协议的翻译工作。路由是网关的一个特殊例子。

Gateway,也叫做协议转换。我们需要知道的是,网关它是可以在任何一个网络层进行操作的。此外,网关使用多个协议进行通信时,它的行为活动却远比路由器or交换机更为复杂。

Gateway_quick_look

在互联网中,假设有两个主机节点,其中一个主机节点为另外一个提供页面服务。这里面连接网络之间的节点称为网关。这些网关节点可以是:

  • 控制公司网络之间流量的计算机
  • 互联网服务提供商(ISP)所使用的将用户连接到互联网的计算机

以上便是主要来自于wiki的网关解释。其实还是有点虚,读完一切之后,我想你只会记住以下几点:协议转换、连接网络之间的节点

但其实这些感觉还是远远不够的,继续再找点资料吧。

从当代互联网业务层面去理解网关服务

没有Gateway服务之前

众所周知,现在的互联网中,碎片化的微服务一定是主流,比如会员、商品、推荐服务等都可以做其中一个小小的微服务。

那这个时候就会出现问题了, 开始描述场景:如果业务比较简单的话,我们可以通过给每个业务都分配一个独立的域名(https://service.api.company.com) 开始描述问题:

  • 每个业务都会需要进行鉴权、限流、权限校验等逻辑。这很麻烦,新增一个业务就得新增一套逻辑。

  • 如果业务简单,应该还是可以cover需求的。但是咱们比如说淘宝、亚马逊一类的公司业务,每次一打开页面,可能会涉及到数百个微服务系统工作,如果每一个微服务都分配一个域名的话

    • 一方面客户端代码会很难维护;
    • 另一方面是连接数会非常多,这在调用中会很低效
  • 采用域名的方法,对于环境的隔离也不太友好。

  • 另外一个最重要的问题,后端每个微服务可能都是由不同语言编写的,可能会采用不同的协议,比如HTTP、Dubbo、gRPC等等。我们不可能要求客户端适配这么多种协议,这是一项非常有挑战性的工作。项目会变得非常复杂且难以维护。

  • 后期如果微服务需要进行重构,那必须要客户端配合你一起进行改造,不合理呢。

    Gateway_service_in_internet

有了API Gateway服务之后

于是为了解决以上痛点,聪明的工程师们,实现了API网关,实现一个API网关接管所有的入口流量,类似于Nginx的作用,将所有用户的请求转发给后端的服务器们。但网关做的不仅仅只是简单的转发,也会针对流量做一些扩展,比如:

  • 鉴权
  • 限流
  • 熔断
  • 权限
  • 协议转换
  • 错误码统一
  • 缓存
  • 日志
  • 监控
  • 告警等

这样将通用的逻辑抽出来,由网关统一去做,业务方也能够更加专注于业务逻辑,提升迭代的效率。

Gateway_in_network_begin

通过引入API网关,客户端只需要与API网关交互,而不用与各个业务方的接口分别通讯。但是一个高性能、稳定的网关,也需要很多点。

对网关的一些功能进行解释

协议转换

内部的API可能是由很多种不同的协议实现的,比如HTTP、Dubbo、GRPC等,但对于用户来说其中很多都不是很友好,或者根本没法对外暴露,比如Dubbo服务,因此需要在网关层做一次协议转换,将用户的HTTP协议请求,在网关层转换成底层对应的协议,比如HTTP -> Dubbo, 但这里需要注意很多问题,比如参数类型,如果类型搞错了,导致转换出问题,而日志又不够详细的话,问题会很难定位。

服务发现

网关作为流量的入口,负责请求的转发,但首先需要知道转发给谁,如何寻址,这里有几种方式:

  • 写死在代码/配置文件里,这种方式虽然比较挫,但也能使用,比如线上仍然使用的是物理机,IP变动不会很频繁,但扩缩容、包括应用上下线都会很麻烦,网关自身甚至需要实现一套健康监测机制。
  • 域名。采用域名也是一种不错的方案,对于所有的语言都适用,但对于内部的服务,走域名会很低效,另外环境隔离也不太友好,比如预发、线上通常是同一个数据库,因此网关读取到的可能是同一个域名,这时候预发的网关调用的就是线上的服务。
  • 注册中心。采用注册中心就不会有上述的这些问题,即使是在容器环境下,节点的IP变更比较频繁,但节点列表的实时维护会由注册中心搞定,对网关是透明的,另外应用的正常上下线、包括异常宕机等情况,也会由注册中心的健康检查机制检测到,并实时反馈给网关。并且采用注册中心性能也没有额外的性能损耗,采用域名的方式,额外需要走一次DNS解析、Nginx转发等,中间多了很多跳,性能会有很大的下降,但采用注册中心,网关是和业务方直接点对点的通讯,不会有额外的损耗。

服务调用

网关由于对接很多种不同的协议,因此可能需要实现很多种调用方式,比如HTTP、Dubbo等,基于性能原因,最好都采用异步的方式,而Http、Dubbo都是支持异步的,比如apache就提供了基于NIO实现的异步HTTP客户端。 因为网关会涉及到很多异步调用,比如拦截器、HTTP客户端、dubbo、redis等,因此需要考虑下异步调用的方式,如果基于回调或者future的话,代码嵌套会很深,可读性很差,可以参考zuul和spring cloud gateway的方案,基于响应式进行改造。

优雅下线

优雅下线也是网关需要关注的一个问题,网关底层会涉及到很多种协议,比如HTTP、Dubbo,而HTTP又可以继续细分,比如域名、注册中心等,有些自身就支持优雅下线,比如Nginx自身是支持健康监测机制的,如果检测到某一个节点已经挂掉了,就会把这个节点摘掉,对于应用正常下线,需要结合发布系统,首先进行逻辑下线,然后对后续Nginx的健康监测请求直接返回失败(比如直接返回500),然后等待一段时间(根据Nginx配置决定),然后再将应用实际下线掉。另外对于注册中心的其实也类似,一般注册中心是只支持手动下线的,可以在逻辑下线阶段调用注册中心的接口将节点下线掉,而有些不支持主动下线的,需要结合缓存的配置,让应用延迟下线。另外对于其他比如Dubbo等原理也是类似。

性能

网关作为所有流量的入口,性能是重中之重,早期大部分网关都是基于同步阻塞模型构建的,比如Zuul 1.x。但这种同步的模型我们都知道,每个请求/连接都会占用一个线程,而线程在JVM中是一个很重的资源,比如Tomcat默认就是200个线程,如果网关隔离没有做好的话,当发生网络延迟、FullGC、第三方服务慢等情况造成上游服务延迟时,线程池很容易会被打满,造成新的请求被拒绝,但这个时候其实线程都阻塞在IO上,系统的资源被没有得到充分的利用。另外一点,容易受网络、磁盘IO等延迟影响。需要谨慎设置超时时间,如果设置不当,且服务隔离做的不是很完善的话,网关很容易被一个慢接口拖垮。

而异步化的方式则完全不同,通常情况下一个CPU核启动一个线程即可处理所有的请求、响应。一个请求的生命周期不再固定于一个线程,而是会分成不同的阶段交由不同的线程池处理,系统的资源能够得到更充分的利用。而且因为线程不再被某一个连接独占,一个连接所占用的系统资源也会低得多,只是一个文件描述符加上几个监听器等,而在阻塞模型中,每条连接都会独占一个线程,而线程是一个非常重的资源。对于上游服务的延迟情况,也能够得到很大的缓解,因为在阻塞模型中,慢请求会独占一个线程资源,而异步化之后,因为单条连接所占用的资源变的非常低,系统可以同时处理大量的请求。 如果是JVM平台,Zuul 2、Spring Cloud gateway等都是不错的异步网关选型,另外也可以基于Netty、Spring Boot2.x的webflux、vert.x或者servlet3.1的异步支持进行自研。

缓存

对于一些幂等的get请求,可以在网关层面根据业务方指定的缓存头做一层缓存,存储到Redis等二级缓存中,这样一些重复的请求,可以在网关层直接处理,而不用打到业务线,降低业务方的压力,另外如果业务方节点挂掉,网关也能够返回自身的缓存。

限流

限流对于每个业务组件来说,可以说都是一个必须的组件,如果限流做不好的话,当请求量突增时,很容易导致业务方的服务挂掉,比如双11、双12等大促时,接口的请求量是平时的数倍,如果没有评估好容量,又没有做限流的话,很容易服务整个不可用,因此需要根据业务方接口的处理能力,做好限流策略,相信大家都见过淘宝、百度抢红包时的降级页面。 因此一定要在接入层做好限流策略,对于非核心接口可以直接将降级掉,保障核心服务的可用性,对于核心接口,需要根据压测时得到的接口容量,制定对应的限流策略。限流又分为几种:

  • 单机。单机性能比较高,不涉及远程调用,只是本地计数,对接口RT影响最小。但需要考虑下限流数的设置,比如是针对单台网关、还是整个网关集群,如果是整个集群的话,需要考虑到网关缩容、扩容时修改对应的限流数。
  • 分布式。分布式的就需要一个存储节点维护当前接口的调用数,比如redis、sentinel等,这种方式由于涉及到远程调用,会有些性能损耗,另外也需要考虑到存储挂掉的问题,比如redis如果挂掉,网关需要考虑降级方案,是降级到本地限流,还是直接将限流功能本身降级掉。 另外还有不同的策略:简单计数、令牌桶等,大部分场景下其实简单计数已经够用了,但如果需要支持突发流量等场景时,可以采用令牌桶等方案。还需要考虑根据什么限流,比如是IP、接口、用户维度、还是请求参数中的某些值,这里可以采用表达式,相对比较灵活。

稳定性

稳定性是网关非常重要的一环,监控、告警需要做的很完善才可以,比如接口调用量、响应时间、异常、错误码、成功率等相关的监控告警,还有线程池相关的一些,比如活跃线程数、队列积压等,还有些系统层面的,比如CPU、内存、FullGC这些基本的。 网关是所有服务的入口,对于网关的稳定性的要求相对于其他服务会更高,最好能够一直稳定的运行,尽量少重启,但当新增功能、或者加日志排查问题时,不可避免的需要重新发布,因此可以参考zuul的方式,将所有的核心功能都基于不同的拦截器实现,拦截器的代码采用Groovy编写,存储到数据库中,支持动态加载、编译、运行,这样在出了问题的时候能够第一时间定位并解决,并且如果网关需要开发新功能,只需要增加新的拦截器,并动态添加到网关即可,不需要重新发布。

熔断降级

熔断机制也是非常重要的一项。若某一个服务挂掉、接口响应严重超时等发生,则可能整个网关都被一个接口拖垮,因此需要增加熔断降级,当发生特定异常的时候,对接口降级由网关直接返回,可以基于Hystrix或者Resilience4j实现。

日志

由于所有的请求都是由网关处理的,因此日志也需要相对比较完善,比如接口的耗时、请求方式、请求IP、请求参数、响应参数(注意脱敏)等,另外由于可能涉及到很多微服务,因此需要提供一个统一的traceId方便关联所有的日志,可以将这个traceId置于响应头中,方便排查问题。

隔离

比如线程池、http连接池、redis等应用层面的隔离,另外也可以根据业务场景,将核心业务部署带单独的网关集群,与其他非核心业务隔离开。

网关管控平台

这块也是非常重要的一环,需要考虑好整个流程的用户体验,比如接入到网关的这个流程,能不能尽量简化、智能,比如如果是dubbo接口,我们可以通过到git仓库中获取源码、解析对应的类、方法,从而实现自动填充,尽量帮用户减少操作;另外接口一般是从测试->预发->线上,如果每次都要填写一遍表单会非常麻烦,我们能不能自动把这个事情做掉,另外如果网关部署到了多个可用区、甚至不同的国家,那这个时候,我们还需要接口数据同步功能,不然用户需要到每个后台都操作一遍,非常麻烦。 这块个人的建议是直接参考阿里云、aws等提供的网关服务即可,功能非常全面。

其他

。。。当然可以扩展的功能还有很多很多。

· 4 分钟阅读
CheverJohn

grpc科普向介绍

This page introduces you to gRPC and protocol buffers. gRPC can use protocol buffers as both its Interface Definition Language (IDL) and as its underlying message interchange format.

什么是protocol buffer

Protocol Buffers是一种独立于语言和平台,可扩展的序列化结构数据格式,主要用于数据存储和RPC数据交换格式。目前google提供了多种语言的 API;包含一个Protocol Buffers编译器和一个Protocol Buffers使用的类库。

精简来说,PB就是一种与语言、平台无关,且扩展性好的用于通信协议、数据存储的结构化数据串行化方法(所以叫协议); 一种来自谷歌的数据交换格式方法; 类似于JSON、XML

好吧,这边有一点还是要强调一下的,Protocol BufferProtocol Buffers是两个不一样的东西。 Protocol Buffer是Google提供的一种数据序列化协议 Protocol Buffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或RPC数据交换格式。它可以用于通讯协议、数据存储等领域的语言无关平台无关可扩展的序列化结构数据格式。

通过将结构化的数据进串行化(序列化),从而实现数据存储/RPC数据交换的功能。

序列化:将数据结构或对象转换成二进制串的过程

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

Protocol Buffer特点

PB特点

注:图片地址转自链接

github地址:https://github.com/protocolbuffers/protobuf

应用场景

传输数据量大 & 网络环境不稳定 的数据存储、RPC 数据交换 的需求场景

如 即时IM (QQ、微信)的需求场景

正式使用

首先安装

首次安装

构建Protocol Buffer消息对象模型

image-20220120020747127

具体应用到平台

具体应用到平台一 具体应用到平台二

即,在 传输数据量较大的需求场景下,Protocol BufferXML、Json 更小、更快、使用 & 维护更简单!

这里有一篇关于基本内容的学习,很快就能上手。

https://juejin.cn/post/6844903605409955848

关于接客户咯的大部分内容需求都在这了 https://juejin.cn/post/7028576246501998605

一些引申

比如我们可以通过socket+PB协议来解决即时通讯问题,采用socket服务,依赖google的oc PB协议包来实现,socket是基于TCP协议,由通信协议和编程API组成,原理上一次HTTP协议握手成功后,与服务器建立双向连接,数据就可以直接从TCP通道传输了。基于事件的方式,二级制传输,反编译成json或者xml。

· 12 分钟阅读
CheverJohn

本篇博客第一部分受到了这篇博文的启发。

TL; DR

将结论写在前头

事实上,为什么我们很多人在接触一个新的项目时候会遇到各种各样的坑呢?

根据这一次的经历来看,其中的主要原因还是在于本地部署环境的不完备。本次踩坑经历,其实问题就是在 git 啦、gcc 啦等之类看似很常见的东西,实际并没有配置好,然后咱们的项目文档书写者呢,默认了你已经完全配置好这些基本的东西了。唉,但是谁能想到大多数人都会是在虚拟机、wsl、docker上配置,看来 docker 其实更具有实用性,可以当做乐高组件一样,什么时候想用哪几个,直接拼凑起来,就是一个了,不扯远了。

这边先说清楚成功部署APISIX项目,系统需要具备的最基本的东西:

  • git的安装
    • 与Github进行ssh连接得做好
    • git 代理得做好
  • 本地的ssh公钥密钥得有(具体查看.ssh文件夹)
  • centos7应该安装的基本库
    • wget
    • unzip
    • git
    • gcc
    • yum update(重要!!!)

第一部分:安装

安装 APISIX 运行环境依赖

基本方法内容来自于官方文档;

安装 etcd

命令:

wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
tar -xvf etcd-v3.4.13-linux-amd64.tar.gz && \
cd etcd-v3.4.13-linux-amd64 && \
sudo cp -a etcd etcdctl /usr/bin/

安装 OpenResty

命令:

sudo yum install yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 安装 OpenResty 和 编译工具
sudo yum install -y openresty curl git gcc openresty-openssl111-devel unzip pcre pcre-devel

# 安装 LuaRocks
curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash -

然后才能正常启动 etcd

nohup etcd &

第二部分:踩坑

问题一:

LUAROCKS_1

[root@MiWiFi-R4CM-srv apisix-2.10.3]# LUAROCKS_SERVER=https://luarocks.cn make deps
/bin/bash: luarocks: command not found
WARN: You're not using LuaRocks 3.x, please add the following items to your LuaRocks config file:
variables = {
OPENSSL_LIBDIR=/usr/local/openresty/openssl111/lib
OPENSSL_INCDIR=/usr/local/openresty/openssl111/include
}
luarocks install rockspec/apisix-master-0.rockspec --tree=deps --only-deps --local --server https://luarocks.cn
/bin/bash: luarocks: command not found
make: *** [deps] Error 127
[root@MiWiFi-R4CM-srv apisix-2.10.3]# ^C

解决方法

curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash -

问题二(接问题一):

当运行了上面的命令后,又出现新的问题,看来是治标不治本啊

Solved_crul_by_installing_sth

[root@MiWiFi-R4CM-srv apisix-2.10.3]# curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash -
+ '[' -z ']'
+ OPENRESTY_PREFIX=/usr/local/openresty
+ LUAROCKS_VER=3.8.0
+ wget https://github.com/luarocks/luarocks/archive/v3.8.0.tar.gz
--2022-01-18 04:53:17-- https://github.com/luarocks/luarocks/archive/v3.8.0.tar.gz
Resolving github.com (github.com)... 20.205.243.166
Connecting to github.com (github.com)|20.205.243.166|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/luarocks/luarocks/tar.gz/v3.8.0 [following]
--2022-01-18 04:53:18-- https://codeload.github.com/luarocks/luarocks/tar.gz/v3.8.0
Resolving codeload.github.com (codeload.github.com)... 20.205.243.165
Connecting to codeload.github.com (codeload.github.com)|20.205.243.165|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5389112 (5.1M) [application/x-gzip]
Saving to: ‘v3.8.0.tar.gz’

100%[====================================================================================================================================================================>] 5,389,112 1.71MB/s in 3.0s

2022-01-18 04:53:22 (1.71 MB/s) - ‘v3.8.0.tar.gz’ saved [5389112/5389112]

+ tar -xf v3.8.0.tar.gz
+ cd luarocks-3.8.0
+ OR_BIN=/usr/local/openresty/bin/openresty
++ /usr/local/openresty/bin/openresty -v
++ awk -F / '{print $2}'
++ awk -F . '{print $1"."$2}'
+ OR_VER=1.19
+ [[ -e /usr/local/openresty/bin/openresty ]]
+ [[ 1.19 == 1.19 ]]
+ WITH_LUA_OPT=--with-lua=/usr/local/openresty/luajit
+ ./configure --with-lua=/usr/local/openresty/luajit
+ cat build.log

Configuring LuaRocks version 3.8.0...

Lua version detected: 5.1
Lua interpreter found: /usr/local/openresty/luajit/bin/luajit
lua.h found: /usr/local/openresty/luajit/include/luajit-2.1/lua.h
Could not find 'unzip'.
Make sure it is installed and available in your PATH.

configure failed.

+ exit 1
[root@MiWiFi-R4CM-srv apisix-2.10.3]# sudo yum install wget sudo unzip
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.163.com
* updates: mirrors.163.com

解决方法:

sudo yum install wget sudo unzip

问题三(接问题二):

继续运行

[root@MiWiFi-R4CM-srv apisix-2.10.3]# curl https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh -sL | bash -

发现还有问题

install_gcc

解决方法:

yum -y install gcc

直接解决了问题

[root@MiWiFi-R4CM-srv apisix-2.10.3]# yum -y install gcc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.163.com
* updates: mirrors.163.com
Resolving Dependencies
--> Running transaction check
---> Package gcc.x86_64 0:4.8.5-44.el7 will be installed
--> Processing Dependency: cpp = 4.8.5-44.el7 for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: libmpfr.so.4()(64bit) for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: libmpc.so.3()(64bit) for package: gcc-4.8.5-44.el7.x86_64
--> Running transaction check
---> Package cpp.x86_64 0:4.8.5-44.el7 will be installed
---> Package glibc-devel.x86_64 0:2.17-325.el7_9 will be installed
--> Processing Dependency: glibc-headers = 2.17-325.el7_9 for package: glibc-devel-2.17-325.el7_9.x86_64
--> Processing Dependency: glibc = 2.17-325.el7_9 for package: glibc-devel-2.17-325.el7_9.x86_64
--> Processing Dependency: glibc-headers for package: glibc-devel-2.17-325.el7_9.x86_64
---> Package libmpc.x86_64 0:1.0.1-3.el7 will be installed
---> Package mpfr.x86_64 0:3.1.1-4.el7 will be installed
--> Running transaction check
---> Package glibc.x86_64 0:2.17-317.el7 will be updated
--> Processing Dependency: glibc = 2.17-317.el7 for package: glibc-common-2.17-317.el7.x86_64
---> Package glibc.x86_64 0:2.17-325.el7_9 will be an update
---> Package glibc-headers.x86_64 0:2.17-325.el7_9 will be installed
--> Processing Dependency: kernel-headers >= 2.2.1 for package: glibc-headers-2.17-325.el7_9.x86_64
--> Processing Dependency: kernel-headers for package: glibc-headers-2.17-325.el7_9.x86_64
--> Running transaction check
---> Package glibc-common.x86_64 0:2.17-317.el7 will be updated
---> Package glibc-common.x86_64 0:2.17-325.el7_9 will be an update
---> Package kernel-headers.x86_64 0:3.10.0-1160.49.1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================================================================================================
Installing:
gcc x86_64 4.8.5-44.el7 base 16 M
Installing for dependencies:
cpp x86_64 4.8.5-44.el7 base 5.9 M
glibc-devel x86_64 2.17-325.el7_9 updates 1.1 M
glibc-headers x86_64 2.17-325.el7_9 updates 691 k
kernel-headers x86_64 3.10.0-1160.49.1.el7 updates 9.0 M
libmpc x86_64 1.0.1-3.el7 base 51 k
mpfr x86_64 3.1.1-4.el7 base 203 k
Updating for dependencies:
glibc x86_64 2.17-325.el7_9 updates 3.6 M
glibc-common x86_64 2.17-325.el7_9 updates 12 M

Transaction Summary
==============================================================================================================================================================================================================
Install 1 Package (+6 Dependent packages)
Upgrade ( 2 Dependent packages)

Total download size: 48 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/9): cpp-4.8.5-44.el7.x86_64.rpm | 5.9 MB 00:00:04
(2/9): glibc-headers-2.17-325.el7_9.x86_64.rpm | 691 kB 00:00:00
(3/9): glibc-devel-2.17-325.el7_9.x86_64.rpm | 1.1 MB 00:00:05
(4/9): libmpc-1.0.1-3.el7.x86_64.rpm | 51 kB 00:00:00
(5/9): mpfr-3.1.1-4.el7.x86_64.rpm | 203 kB 00:00:00
(6/9): glibc-common-2.17-325.el7_9.x86_64.rpm | 12 MB 00:00:08
(7/9): gcc-4.8.5-44.el7.x86_64.rpm | 16 MB 00:00:08
(8/9): kernel-headers-3.10.0-1160.49.1.el7.x86_64.rpm | 9.0 MB 00:00:04
(9/9): glibc-2.17-325.el7_9.x86_64.rpm | 3.6 MB 00:00:10
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 4.7 MB/s | 48 MB 00:00:10
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : glibc-2.17-325.el7_9.x86_64 1/11
Updating : glibc-common-2.17-325.el7_9.x86_64 2/11
Installing : mpfr-3.1.1-4.el7.x86_64 3/11
Installing : libmpc-1.0.1-3.el7.x86_64 4/11
Installing : cpp-4.8.5-44.el7.x86_64 5/11
Installing : kernel-headers-3.10.0-1160.49.1.el7.x86_64 6/11
Installing : glibc-headers-2.17-325.el7_9.x86_64 7/11
Installing : glibc-devel-2.17-325.el7_9.x86_64 8/11
Installing : gcc-4.8.5-44.el7.x86_64 9/11
Cleanup : glibc-2.17-317.el7.x86_64 10/11
Cleanup : glibc-common-2.17-317.el7.x86_64 11/11
Verifying : mpfr-3.1.1-4.el7.x86_64 1/11
Verifying : glibc-devel-2.17-325.el7_9.x86_64 2/11
Verifying : gcc-4.8.5-44.el7.x86_64 3/11
Verifying : glibc-headers-2.17-325.el7_9.x86_64 4/11
Verifying : kernel-headers-3.10.0-1160.49.1.el7.x86_64 5/11
Verifying : libmpc-1.0.1-3.el7.x86_64 6/11
Verifying : glibc-common-2.17-325.el7_9.x86_64 7/11
Verifying : glibc-2.17-325.el7_9.x86_64 8/11
Verifying : cpp-4.8.5-44.el7.x86_64 9/11
Verifying : glibc-2.17-317.el7.x86_64 10/11
Verifying : glibc-common-2.17-317.el7.x86_64 11/11

Installed:
gcc.x86_64 0:4.8.5-44.el7

Dependency Installed:
cpp.x86_64 0:4.8.5-44.el7 glibc-devel.x86_64 0:2.17-325.el7_9 glibc-headers.x86_64 0:2.17-325.el7_9 kernel-headers.x86_64 0:3.10.0-1160.49.1.el7 libmpc.x86_64 0:1.0.1-3.el7 mpfr.x86_64 0:3.1.1-4.el7

Dependency Updated:
glibc.x86_64 0:2.17-325.el7_9 glibc-common.x86_64 0:2.17-325.el7_9

Complete!

Complete_by_install_gcc

问题四(搁浅中......):

这边的LUAROCKS是针对于

开始LUAROCKS_SERVER......

[root@MiWiFi-R4CM-srv apisix-2.10.3]# LUAROCKS_SERVER=https://luarocks.cn make deps

爆出问题

solve

分析问题:

[root@MiWiFi-R4CM-srv apisix-2.10.3]# LUAROCKS_SERVER=https://luarocks.cn make deps
…………………………………………………………………………………………………………………………………………………………………………
lua-resty-dns-client 5.2.0-1 depends on luaxxhash >= 1.0 (not installed)
Installing https://luarocks.cn/luaxxhash-1.0.0-1.rockspec

Error: Failed installing dependency: https://luarocks.cn/lua-resty-dns-client-5.2.0-1.src.rock - Failed installing dependency: https://luarocks.cn/luaxxhash-1.0.0-1.rockspec - 'git' program not found. Make sure Git is installed and is available in your PATH (or you may want to edit the 'variables.GIT' value in file '/root/.luarocks/config-5.1.lua')
make: *** [deps] Error 1
[root@MiWiFi-R4CM-srv apisix-2.10.3]# yum install -y git

很明显就是没有安装配置好git嘛

config_git

lua-resty-dns-client 5.2.0-1 depends on lua >= 5.1, < 5.4 (5.1-1 provided by VM)
lua-resty-dns-client 5.2.0-1 depends on penlight ~> 1 (1.12.0-1 installed)
lua-resty-dns-client 5.2.0-1 depends on lrandom (20180729-1 installed)
lua-resty-dns-client 5.2.0-1 depends on lua-resty-timer ~> 1 (1.1.0-1 installed)
lua-resty-dns-client 5.2.0-1 depends on binaryheap >= 0.4 (0.4-1 installed)
lua-resty-dns-client 5.2.0-1 depends on luaxxhash >= 1.0 (not installed)
Installing https://luarocks.cn/luaxxhash-1.0.0-1.rockspec
Cloning into 'luaxxhash'...
error: RPC failed; result=35, HTTP code = 0
fatal: The remote end hung up unexpectedly

Error: Failed installing dependency: https://luarocks.cn/lua-resty-dns-client-5.2.0-1.src.rock - Failed installing dependency: https://luarocks.cn/luaxxhash-1.0.0-1.rockspec - Failed cloning git repository.
make: *** [deps] Error 1
[root@MiWiFi-R4CM-srv apisix-2.10.3]# ls
apisix bin CHANGELOG.md CODE_OF_CONDUCT.md CODE_STYLE.md conf CONTRIBUTING.md deps LICENSE Makefile NOTICE powered-by.md README.md rockspec v3.8.0.tar.gz v3.8.0.tar.gz.1
[root@MiWiFi-R4CM-srv apisix-2.10.3]#
[root@MiWiFi-R4CM-srv apisix-2.10.3]# cd ..
[root@MiWiFi-R4CM-srv api7]# ls
apache-apisix-2.10.3-src.tgz apisix-2.10.3
[root@MiWiFi-R4CM-srv api7]# git clone git@github.com:Chever-John/JohnChever-Blog.git
Cloning into 'JohnChever-Blog'...
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
ECDSA key fingerprint is MD5:7b:99:81:1e:4c:91:a5:0d:5a:2e:2e:80:13:3f:24:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
[root@MiWiFi-R4CM-srv api7]# git clone git@github.com:Chever-John/JohnChever-Blog.git
Cloning into 'JohnChever-Blog'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
[root@MiWiFi-R4CM-srv api7]# git config --global user.name "CheverJohn"
[root@MiWiFi-R4CM-srv api7]# git config --global user.email "cheverjonathan@gmail.com"
[root@MiWiFi-R4CM-srv api7]# git config --list
user.name=CheverJohn
user.email=cheverjonathan@gmail.com
[root@MiWiFi-R4CM-srv api7]# ssh-keygen -t rsa -C "cheverjonathan@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XVvMrYv9c92MVJm8CMUmZA44WgYv+atEOydMkpWc0I8 cheverjonathan@gmail.com
The key's randomart image is:
+---[RSA 2048]----+
| .... ...o. |
| o.== +. * . |
| B*.. .= = +|
| oEo. . o o =.|
| o o .S . o o..|
| = . . +.o |
| * o ..ooo|
| . = .o=|
| . +|
+----[SHA256]-----+
[root@MiWiFi-R4CM-srv api7]# cat /root/.ssh
cat: /root/.ssh: Is a directory
[root@MiWiFi-R4CM-srv api7]# ls
apache-apisix-2.10.3-src.tgz apisix-2.10.3
[root@MiWiFi-R4CM-srv api7]# cd /root/.ssh
[root@MiWiFi-R4CM-srv .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@MiWiFi-R4CM-srv .ssh]# cat id_rsa.pub
接下来显示就是生成的ssh密钥了,将其复制到github上的ssh里即可

继续LUAROCKS_SERVER......

LUAROCKS_SERVER=https://luarocks.cn make deps

还是出现了问题

maybe_git_proxy

怀疑是git代理的问题!!!

这边开始暂时不搞apisix中的LUAROCKS了,开始按照官网的需求准备

未解决!!!

问题五:前提需求准备中的wget问题

然后遇到了wget问题

如果使用wget的话,会出现一个

just_yum_update

遇到Unable to establish SSL connection的报错

这个时候,只需要轻轻yum update即可,原因是未更新前的centos里的库大部分是老旧的,特别是导致这个问题的openssl。

此处(指yum update)收到了该链接的灵感。

当我们yum update之后,即可成功

然后运行wget,至此wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz完美解决,结束了。

成功结束的样子

finish

问题六:继续回到问题四

LUAROCKS_SERVER继续在apisix-2.10.3文件中进行运行

// 遇到问题!
apisix master-0 depends on lua-resty-ngxvar 0.5.2 (not installed)
Installing https://luarocks.cn/lua-resty-ngxvar-0.5.2-0.rockspec
Cloning into 'lua-var-nginx-module'...
fatal: unable to access 'https://github.com/api7/lua-var-nginx-module/': Encountered end of file

Error: Failed installing dependency: https://luarocks.cn/lua-resty-ngxvar-0.5.2-0.rockspec - Failed cloning git repository.
make: *** [deps] Error 1
[root@MiWiFi-R4CM-srv apisix-2.10.3]#

完成etcd的安装

finish_etcd

这边根据链接讲的东西从而进行etcd的安装。

All Done

上一张证明自己All Done的截图照片

All-Done-Solved_Problems

试试证明确实使用git proxy代理好,一下子就能解决所有问题了。

git_proxy

列出一些算是对我有所帮助的链接地址吧

https://www.mihu.live/archives/208/ https://zhuanlan.zhihu.com/p/120038973

晚上再来把文字搞好看一点

请忽略的etcd文件夹目录,刚刚运行起etcd了。so就急匆匆curl咯,根据这处链接及其提供的命令和结果,得以判断咱们的Apache APISIX是否已经成功启动。