快速创建API服务


本章将会引导你使用HAS自带的"HelloService"快速创建一个API服务(你可以在githubopen in new window上看到HelloService的源码)。

安装

mkdir myProject
cd myProject
go mod init myProject
go get -u github.com/drharryhe/has
go mod tidy -compat=1.17

开始

1. main.go

在项目目录下编写main.go

package main

import (
	"github.com/drharryhe/has/connectors/hwebconnector"
	"github.com/drharryhe/has/core"
	"github.com/drharryhe/has/datapackers/hjsonpacker"
	"github.com/drharryhe/has/routers/hlocalrouter"
	"github.com/drharryhe/has/services/hellosvs"
)

func main() {
	// 创建gateway
	gateway := core.NewAPIGateway(&core.APIGatewayOptions{
		// Server配置
		ServerOptions: core.ServerOptions{
			// 路由配置
			Router: hlocalrouter.New(),
		},
		Connectors: []core.IAPIConnector{
			hwebconnector.New(), // Web服务
		},
		Packers: []core.IAPIDataPacker{
			hjsonpacker.New(),
		},
	})
	// 注册服务
	gateway.Server().RegisterService(&hellosvs.Service{}, nil)
	// 启动服务
	gateway.Start()
}

2. 配置文件

在项目目录下编写conf.toml

Debug = true # 是否开启Debug模式
LogFileName = 'run.log' # log输出文件名
LogOutputs = ['file', 'console'] # log 输出位置
Version = '1' # 项目版本
[APIGateway]
AddressField = 'IP' # 区分地址字段
UserField = 'User' # 区分用户字段
# 熔断设置 HAS的熔断使用hystrix-go 参考https://github.com/afex/hystrix-go/
BreakerDashboard = true # 是否开启面板 https://pkg.go.dev/github.com/afex/hystrix-go/hystrix#hdr-Enable_dashboard_metrics
BreakerErrorPercentThreshold = 10 # 错误百分比阈值
BreakerLimitAPI = true # API限流
BreakerLimitIP = true # IP限流
BreakerLimitUser = true #  用户限流
BreakerMaxConcurrentRequest = 10 # 最大并发请求
BreakerRequestTimeout = 10 # 请求超时设置
BreakerRequestVolumeThreshold = 10  # 一个统计窗口 10 秒内请求数量。达到这个请求数量后才去判断是否要开启熔断
BreakerSleepWindow = 10 # 当熔断器被打开后,SleepWindow 的时间就是控制过多久后去尝试服务是否可用了
UseBreaker = false # 通过用户熔断

[HelloService]
LimitedSlots = ''
Name = 'hello' # 服务名称

[JsonPacker]

[LocalRouter]

[Server]
MaxProcs = 0 # 使用 CPU核数,0为全部使用
PprofPort = 0 # 在Debug

[WebConnector]
AddressField = 'IP'
Packer = 'JsonPacker' # 数据解析
Port = 8989   # Web服务端口


3. api.json文件

在项目目录下编写api.json

{
  "name": "HAS api", // api描述
  "versions": [
    {
      "version": "v1", // api版本号
      "apis": [
        {
          "name": "hello", // 接口名,次接口地址为 http://127.0.0.1:<port>/v1/hello
          "desc": "hello",
          "disabled": false,
          "endpoint": {
            "service": "hello", // 配置文件中对应的name
            "slot": "HelloSlot" // 对应Slot文件中的方法名
          }
        }
      ]
    }
  ]
}

4.运行

全部编写完成后,项目结构如下:

.
├── api.json
├── conf.toml
├── go.mod
├── go.sum
└── main.go

在项目目录下执行以下命令运行

go run main.go

如出现以下输出,则说明启动成功!

[A] >生产环境<

 ┌───────────────────────────────────────────────────┐ 
 │                   Fiber v2.35.0                   │ 
 │               http://127.0.0.1:8989               │ 
 │       (bound on host 0.0.0.0 and port 8989)       │ 
 │                                                   │ 
 │ Handlers ............. 4  Processes ........... 1 │ 
 │ Prefork ....... Disabled  PID ............. 47185 │ 
 └───────────────────────────────────────────────────┘ 

[service.go:120] Service [HelloService] Registered...
[server.go:206] server started...

5.访问api

提示

注册一个服务后,会同时开启GETPOST2种方法的访问

在浏览器中访问以下网址

http://127.0.0.1:8989/v1/hello?name=has

浏览器返回json

{
  "data": "Hello has",
  "error": {
    "code": 0,
    "desc": "",
    "cause": ""
  }
}

相关信息

HAS启动后会对conf.toml自动排序,并加入一些字段;根目录会生成一个pid.pid文件,无需担心,这是正常的,如果你定义了日志文件,HAS会在根目录输出日志文件。
(如果你的项目需要使用git,你可以将pid.pid文件和日志文件写入.gitignore中)。