Skip to content

Commit

Permalink
Merge branch 'feature/buf_fix_ssl' into test
Browse files Browse the repository at this point in the history
  • Loading branch information
hmzzrcs committed May 5, 2023
2 parents bc6d998 + 59fbde2 commit 21b6fbd
Show file tree
Hide file tree
Showing 94 changed files with 1,750 additions and 1,263 deletions.
26 changes: 13 additions & 13 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
stages:
- notice
- check
# - check
- build
- deploy
- publish
Expand Down Expand Up @@ -30,23 +30,23 @@ merge-informer: # 飞书回调
curl -X POST -H "Content-Type: application/json" \
-d "{\"msg_type\":\"text\",\"content\":{\"text\":\"项目:${CI_PROJECT_NAME}\\n提交人:${GITLAB_USER_NAME}\\n提交信息:${CI_MERGE_REQUEST_TITLE}\\n合并分支信息:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} -> ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}\\n差异性地址:${DIFF_URL}\\n请及时review代码\"}}" \
https://open.feishu.cn/open-apis/bot/v2/hook/1c334752-2874-41a1-8f1b-3060f2d46b6c
checker:
stage: check
rules:
- if: $CI_COMMIT_BRANCH=="develop"
script:
- set +e
- go mod tidy
- go test -covermode=atomic -coverpkg=./... -coverprofile=coverage.data -timeout=1m ./...
- golangci-lint run --timeout=3m --out-format checkstyle --issues-exit-code 0 ./... > report.xml
- sonar-scanner
# checker:
# stage: check
# rules:
# - if: $CI_COMMIT_BRANCH=="develop"
# script:
# - set +e
# - go mod tidy
# - go test -covermode=atomic -coverpkg=./... -coverprofile=coverage.data -timeout=1m ./...
# - golangci-lint run --timeout=3m --out-format checkstyle --issues-exit-code 0 ./... > report.xml
# - sonar-scanner
builder:
stage: build
rules:
- if: $CI_COMMIT_BRANCH=="develop"
when: on_success
# when: on_success
- if: $CI_COMMIT_BRANCH=="test"
when: on_success
# when: on_success
script:
- sed -i '/replace github.com\/eolinker\/eosc => */d' go.mod
- go mod tidy
Expand Down
104 changes: 50 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,47 @@
## Apinto
# Apinto

[![Go Report Card](https://goreportcard.com/badge/github.com/eolinker/apinto)](https://goreportcard.com/report/github.com/eolinker/apinto) [![Releases](https://img.shields.io/github/release/eolinker/apinto/all.svg?style=flat-square)](https://github.com/eolinker/apinto/releases) [![LICENSE](https://img.shields.io/github/license/eolinker/apinto.svg?style=flat-square)](https://github.com/eolinker/apinto/blob/main/LICENSE)![](https://shields.io/github/downloads/eolinker/apinto/total)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT_CN.md)

------------
![](http://data.eolinker.com/course/eaC48Js3400ffd03c21e36b3eea434dce22d7877a3194f6.png)

Apinto是一个基于 Golang 开发的微服务网关,能够实现高性能 HTTP API 转发、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,能够快速帮助企业进行 API 服务治理、提高 API 服务的稳定性和安全性。未来我们将提供插件市场,通过**Apinto**强大的插件拓展能力,用户可像乐高积木一样根据需要自行拓展**Apinto**的插件,丰富**Apinto**的能力。
**Apinto是一款高性能、可扩展、易维护的云原生API网关。**

注意:**main**分支为开发主要分支,频繁更新可能导致使用不稳定,若需要使用稳定版本,请查看[release](https://github.com/eolinker/apinto/releases)
Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单、易于维护,支持集群与动态扩容,并且提供几十款网关插件和实用的企业级插件,让用户开箱即用。

**Apinto** 集合了配置和转发功能,使用者可以通过openAPI进行配置,也可通过可视化UI项目[Apinto Dashboard](https://github.com/eolinker/apinto-dashboard)进行配置,相关文档可点击[Apinto Dashboard部署文档](https://help.apinto.com/docs/dashboard/quick/arrange)
### 概况 | [English Introduction](https://github.com/eolinker/apinto/blob/main/README_EN.md)
## Demo
体验地址:[demo-dashboard.apinto.com](https://demo-dashboard.apinto.com/)

- [为什么要使用Apinto](#为什么要使用Apinto "Apinto")
- [产品特性](#产品特性 "产品特性")
- [基准测试](#基准测试 "基准测试")
- [部署](#部署 "部署")
- [启动](#启动 "启动")
- [联系我们](#联系我们 "联系我们")
- [关于我们](#关于我们 "关于我们")
- [授权协议](#授权协议 "授权协议")
快速入门:https://help.apinto.com/docs/dashboard-v2/quick/quick_start.html

### 为什么要使用Apinto
Apinto Dashboard github地址: https://github.com/eolinker/apinto-dashboard

**Apinto**是运行在企业系统服务边界上的API网关。当您构建网站、App、IOT甚至是开放API交易时,Apinto 能够帮你将内部系统中重复的组件抽取出来并放置在Apinto网关上运行,如进行用户授权、访问控制、防火墙、数据转换等;并且Apinto 提供服务编排的功能,让企业可以快速从各类服务上获取需要的数据,对业务实现快速响应。
## Apinto功能架构图:
<img width="1664" alt="img_v2_22590d84-f8a4-4d3a-9c67-b481ecfdf1fg" src="https://user-images.githubusercontent.com/18322454/228448223-515a7feb-0c65-496e-85bc-1581b7a89cfe.png">

**Apinto**具有以下优势:

- 完全开源:Apinto 项目由 Eolinker 发起并长期维护,我们希望与全球开发者共同打造微服务生态的基础设施。
- 优异的性能表现:相同环境下,Apinto比Nginx、Kong等产品快约50%,并且在稳定性上也有所优化。
- 丰富的功能:Apinto 提供了一个标准网关应有的所有功能,并且你可以快速连接你的各个微服务以及管理网络流量。
- 极低的使用和维护成本:Apinto 是纯 Go 语言开发的开源网关,没有繁琐的部署,没有外部产品依赖,只需要下载并运行即可,极为简单。
- 良好的扩展性:Apinto 的绝大部分功能都是模块化的,因此你可以很容易扩展它的能力。

总而言之,Apinto 能让业务开发团队更加专注地实现业务。

### Star 历史

[![Star History Chart](https://api.star-history.com/svg?repos=eolinker/apinto&type=Date)](https://star-history.com/#eolinker/apinto&Date)
## Apinto亮点特性
Apinto API 网关以出色的用户体验和适用于各种企业级业务场景的控制台为特色。控制台具有四大亮点功能:集群管理、应用管理、精细服务治理和企业插件,能够满足企业对 API 网关更高级场景化需求的要求。
### 集群管理
Apinto 提供集群管理功能,可以一次性配置业务并将其发布到相应的集群。这解决了多集群维护多套业务配置的问题,显著提高了运维效率,并降低了繁杂配置时的事故率。
![](http://data.eolinker.com/course/Cdkvdtkdcc50a65d3e5b068bae658c343d7b6a188730218.png)
### 应用管理
Apinto 网关推出应用管理概念,统一管理应用及其生命周期。作为业务通讯的发起者,应用贯穿整个调用链。Apinto 网关对应用请求的流量进行鉴权认证和服务治理,并对请求的流量进行监控告警,统计应用调用情况。
### 精细化服务治理
Apinto提出精细化流量管理方案,即所有调用方的请求流量都经过网关,通过对应用、API、上游服务、请求方式、IP、请求路径、应用自定义标签等组合条件筛选请求流量,执行限量、访问、熔断、灰度、缓存等策略规则,帮助企业快速、灵活地制定策略,以满足不同业务场景的需求,并全方位治理好服务。
![](http://data.eolinker.com/course/zqIaYaa0ac1273511504a4bad96e0e78de56e8e12850677.png)
### 企业插件
Apinto网关即将推出企业插件模块,并且陆续提供业务型企业插件如:用户角色权限、监控告警、日志、API文档、开放平台、安全防护、数据分析、调用链、mock、在线调测、安全测试、国密、多协议等。支持用户自定义企业插件,支持独立部署。
## Apinto功能
Apinto网关可以作为业务流量的入口,可以对业务流量进行处理,如动态路由、负载均衡、服务发现、熔断降级、身份认证、监控与告警等。
Apinto网关不受云平台限制,也能在Kubernetes运行。


### 产品特性

| 功能 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 集群 | 集群不限制网关节点,自由剔除或加入网关节点,主从网关节点具备无缝切换功能,提升网关高可用性 |
| 动态路由 | 可通过设置location、query、header、host、method等参数匹配对应的服务 |
| 服务发现 | 支持对接Eureka、Nacos、Consul |
| 负载均衡 | 支持轮询权重算法 |
Expand All @@ -58,42 +55,44 @@ Apinto是一个基于 Golang 开发的微服务网关,能够实现高性能 HT
| 日志 | 提供节点的运行日志,可根据日志设置的等级输出 |
| 多种日志输出 | 可将节点的请求日志输出到不同的日志接收器,如file、nsq、kafka等 |
| Cli命令支持 | 通过Cli命令操控网关,插件安装、下载和网关的开启、关闭等操作均可使用一键命令操控 |
| 黑白名单 | 支持设置黑白名单IP,拦截非法IP |
| 黑白名单 | 支持多维度筛选流量,设置黑白名单IP,拦截非法IP |
| 访问策略 | 支持多维度筛选流量,可针对应用、IP、应用与IP、应用与API、应用与上游等多维组合设置黑白名单 |
| 流量策略 | 支持多维度筛选流量,控制应用、应用与API、应用与上游之间的请求次数和请求报文大小限制 |
| 熔断策略 | 支持多维度筛选流量,熔断上游或API |
| 灰度策略 | 支持多维度筛选流量,按百分比或高级规则灰度流量到目标节点 |
| 缓存策略 | 支持多维度筛选流量,缓存API响应内容 |
| 参数映射 | 将客户端的请求参数映射到转发请求中,可按需改变参数的位置及名称 |
| 额外参数 | 转发请求时,额外加上后端验证参数,如apikey等 |
| 转发重写 | 支持对 `scheme``uri``host` 的重写,同时支持对转发请求的请求头部header的值进行新增或者删除 |
| 流量控制 | 拦截异常流量 |

#### 迭代计划
| 流量镜像 | 线上流量或请求内容进行拷贝到镜像服务中 |
| MOCK | 模拟web服务器端API的响应 |
| CORS | 支持api请求跨域 |
| 同步API | 提供OpenAPI同步API文档,支持swagger3.0 json或yaml格式文件 |

- **UI界面支持**: 通过UI界面操作网关配置,可以通过需要加载定制不同的UI界面(主题)
## 迭代计划
![image](https://user-images.githubusercontent.com/18322454/226301243-d69a1a5e-22eb-48d4-8fd1-52ec1cf8237b.png)
如果您是个人开发者,可基于API网关相关的业务场景开发有价值的网关插件或企业级插件,并且愿意分享给Apinto,您将会成为Apinto的杰出贡献者或得到一定的收益。
如果您是企业,可基于Apinto网关开发企业级插件,成为Apinto的合作伙伴。

- **多协议支持**:支持多种协议,包括但不限于:gRPC、Websocket、tcp/udp、Dubbo
### Star历史

- **插件市场**:由于apinto主要是通过插件加载的方式加载所需模块,用户可将所需功能编译成插件,也可从插件市场中下载更新贡献者开发的插件,一键安装使用

- **服务编排**:一个编排API对应多个backend,backend的入参支持客户端传入,也支持backend间的参数传递;backend的返回数据支持字段的过滤、删除、移动、重命名、拆包和封包;编排API能够设定编排调用失败时的异常返回

- **监控**:捕获网关请求数据,并可将其导出到promethus、Graphite中进行分析
- .....
[![Star History Chart](https://api.star-history.com/svg?repos=eolinker/apinto&type=Date)](https://star-history.com/#eolinker/apinto&Date)

#### 2022年迭代计划
![roadmap_cn](https://user-images.githubusercontent.com/14105999/170409057-407055ef-2d30-4272-ae8c-3c46b95af8d1.jpeg)

### 基准测试
## 基准测试


![image](https://user-images.githubusercontent.com/25589530/149748340-dc544f79-a8f9-46f5-903d-a3af4fb8b16e.png)

### 部署
## 部署

* 直接部署:[部署教程](https://help.apinto.com/docs/apinto/quick/arrange)
* [快速入门教程](https://help.apinto.com/docs/apinto/quick/quick_course)
* [快速入门教程](https://help.apinto.com/docs/dashboard-v2/quick/quick_start.html)
* [源码编译教程](https://help.apinto.com/docs/apinto/quick/arrange)
* [Docker部署](https://hub.docker.com/r/eolinker/apinto-gateway)
* Kubernetes部署:后续支持

### 启动
## 启动

1.下载安装包并解压(此处以v0.12.1版本的安装包示例)

Expand All @@ -117,10 +116,13 @@ Apinto支持在arm64、amd64架构上运行。
apinto start
```

3.如需可视化界面请点击[Apinto Dashboard](https://github.com/eolinker/apinto-dashboard)
### Bug 和需求反馈
如果想要反馈 Bug、提供产品意见,可以创建一个 Github issue 联系我们,十分感谢!

如果你希望和 Apinto 团队近距离交流,讨论产品使用技巧以及了解更多产品最新进展,欢迎加入以下渠道。

- ### **联系我们**

- ## **联系我们**


* **帮助文档**[https://help.apinto.com](https://help.apinto.com/docs)
Expand All @@ -133,10 +135,4 @@ apinto start
- **论坛**[https://community.apinto.com](https://community.apinto.com/)
- **微信群**:<img src="https://user-images.githubusercontent.com/25589530/149860447-5879437b-3cda-4833-aee3-69a2e538e85d.png" style="width:150px" />

### 关于我们

EOLINK 是领先的 API 管理服务供应商,为全球超过3000家企业提供专业的 API 研发管理、API自动化测试、API监控、API网关等服务。是首家为ITSS(中国电子工业标准化技术协会)制定API研发管理行业规范的企业。

官方网站:[https://www.eolink.com](https://www.eolink.com "EOLINK官方网站")

免费下载PC桌面端:[https://www.eolink.com/pc/](https://www.eolink.com/pc/ "免费下载PC客户端")
2 changes: 1 addition & 1 deletion README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Apinto is a microservice gateway developed based on golang. It can achieve the p

**Apinto** integrates configuration and forwarding functions. Users can configure it through OpenAPI or through visual UI items [apinto dashboard](https://github.com/eolinker/apinto-dashboard) for configuration, click [apinto dashboard deployment document](https://help.apinto.com/docs/dashboard/quick/arrange) for relevant documents

### Summary / [中文介绍](https://github.com/eolinker/apinto/blob/main/README.md)
### Summary / [中文介绍](./README.md)

- [Why Apinto](#WhyApinto "Why Apinto")
- [Feature](#Feature)
Expand Down
7 changes: 7 additions & 0 deletions checker/multiple.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ func (ls listChecker) Check(v string, has bool) bool {

func (m *multipleChecker) Check(v string, has bool) bool {
if has && m.equals != nil {
//全选逻辑处理
for k, _ := range m.equals {
if k == "ALL" {
return true
}
}

if ok := m.equals[v]; ok {
return true
}
Expand Down
124 changes: 42 additions & 82 deletions discovery/app.go
Original file line number Diff line number Diff line change
@@ -1,106 +1,66 @@
package discovery

import (
"github.com/google/uuid"
"github.com/eolinker/eosc/eocontext"
"sync"
"sync/atomic"
)

type app struct {
id string
nodes map[string]INode
healthChecker IHealthChecker
attrs Attrs
locker sync.RWMutex
container IAppContainer
}

// Reset 重置app的节点列表
func (s *app) Reset(nodes Nodes) {

tmp := make(map[string]INode)
var (
_ IAppAgent = (*_AppAgent)(nil)
_ IApp = (*_App)(nil)
)

for _, node := range nodes {
type IAppAgent interface {
reset(nodes []eocontext.INode)
Agent() IApp
}

if n, has := s.nodes[node.ID()]; has {
n.Leave()
}
tmp[node.ID()] = node
type IApp interface {
Nodes() []eocontext.INode
Close()
}

}
s.locker.Lock()
s.nodes = tmp
s.locker.Unlock()
type _AppAgent struct {
locker sync.RWMutex
nodes []eocontext.INode
use int64
}

// GetAttrs 获取app的属性集合
func (s *app) GetAttrs() Attrs {
s.locker.RLock()
defer s.locker.RUnlock()
return s.attrs
func (a *_AppAgent) Agent() IApp {
atomic.AddInt64(&a.use, 1)
return &_App{_AppAgent: a, isClose: 0}
}

// GetAttrByName 通过属性名获取app对应属性
func (s *app) GetAttrByName(name string) (string, bool) {
s.locker.RLock()
defer s.locker.RUnlock()
attr, ok := s.attrs[name]
return attr, ok
type _App struct {
*_AppAgent

isClose int32
}

// NewApp 创建服务发现app
func NewApp(checker IHealthChecker, container IAppContainer, attrs Attrs, nodes Nodes) IApp {
if attrs == nil {
attrs = make(Attrs)
func (a *_App) Close() {
if atomic.SwapInt32(&a.isClose, 1) == 0 {
atomic.AddInt64(&a.use, -1)
}
return &app{
attrs: attrs,
nodes: nodes,
locker: sync.RWMutex{},
healthChecker: checker,
id: uuid.NewString(),
container: container,
}
}

// ID 返回app的id
func (s *app) ID() string {
return s.id
}

// Nodes 将运行中的节点列表返回
func (s *app) Nodes() []INode {
s.locker.RLock()
defer s.locker.RUnlock()
nodes := make([]INode, 0, len(s.nodes))
for _, node := range s.nodes {
if node.Status() != Running {
continue
}
nodes = append(nodes, node)
}
return nodes
func newApp(nodes []eocontext.INode) *_AppAgent {

return &_AppAgent{nodes: nodes}
}

// NodeError 定时检查节点,当节点失败时,则返回错误
func (s *app) NodeError(id string) error {
s.locker.Lock()
defer s.locker.Unlock()
if n, ok := s.nodes[id]; ok {
n.Down()
if s.healthChecker != nil {
err := s.healthChecker.AddToCheck(n)
return err
}
}
return nil
func (a *_AppAgent) reset(nodes []eocontext.INode) {

a.locker.Lock()
defer a.locker.Unlock()
a.nodes = nodes
}

// Close 关闭服务发现的app
func (s *app) Close() error {
//
s.container.Remove(s.id)
if s.healthChecker != nil {
return s.healthChecker.Stop()
}
return nil
func (a *_AppAgent) Nodes() []eocontext.INode {
a.locker.RLock()
defer a.locker.RUnlock()
l := make([]eocontext.INode, len(a.nodes))
copy(l, a.nodes)
return l
}
8 changes: 8 additions & 0 deletions discovery/check.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package discovery

// IHealthChecker 健康检查接口
type IHealthChecker interface {
Check(nodes INodes)
Reset(conf interface{}) error
Stop()
}
Loading

0 comments on commit 21b6fbd

Please sign in to comment.