# BaseService/gateway
`BaseService/gateway` 剑鱼网关服务。为剑鱼网站商品标准化,提供统一权限校验，资源扣减。

## 网关配置


## 
##

## 服务注册与服务发现

服务注册与发现依赖`go.etcd.io/etcd/client/v3`库。
> 服务注册

注册时向etcd中put `scheme/serverCode@serverAddr` key并设置租期
- `scheme` 默认为 `etcd:///com.gateway`
- `serverCode` 为服务code，在系统中需要唯一
- `serverAddr` 为服务ip+端口

服务注册[例子](https://bp.jydev.jianyu360.cn/BaseService/gateway/src/master/core/node/hellowrold/main.go) 。服务已注册，但服务不可用可能有以下操作*造成。但服务有重试机制，并常识可用节点，不会造成影响。
```go
server := g.Server()

// 向网关注册表注册服务。*此步骤应在服务启动后注册
// NewNode可传入etcd节点，默认http://127.0.0.1:2379
closeNotify, err := node.NewNode(etcdNode1,etcdNode2...).Register(serverCode, serverPort)
if err != nil { 
    panic(err)
}

go func() {
    server.Run()
}()

// 阻塞主进程,接受退出消息。关闭服务，从注册表中删除。
// kill -9 信号接受不到，*会有2～3秒延迟。
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
closeNotify()
```

>服务发现

服务发现是网关程序依赖`etcd`中`watch`监听系统`scheme`中所有的服务节点。当有服务启动或关闭时，网关程序能够实时进行服务节点的增加与删除。
```go
    //创建节点发现，并持续监听
    watchNode := node.NewNode(etcdNode1,etcdNodes2,..)
    go watchNode.NewWatcher(ctx, resolver)
```

## 反爬虫策略配置


```json
          checkIdBlock      是否开启用户session校验
          idThreshold       用户请求阈值 [[a,b],[c,d],[m,n]] a秒b次、c秒d次请求出验证码,并清空次阈值内容；m秒n次出验证码，不清除阈值内容，每超出idFreq次，出现一次验证码
          idTimeRange       阈值有效时长
          idFreq            超出最大阈值后，每超出idFreq次，出现一次验证码
          idMax             超出此阈值后直接进入临时黑名单
          idMaxBlockTimes   临时黑名单超出此阈值后直接进入永久黑名单
          
          checkIpBlock      是否开启用户ip校验
          ipThreshold       用户请求阈值 [[a,b],[c,d],[m,n]] a秒b次、c秒d次请求出验证码,并清空次阈值内容；m秒n次出验证码，不清除阈值内容，每超出idFreq次，出现一次验证码
          ipTimeRange       阈值有效时长
          ipFreq            超出最大阈值后，每超出idFreq次，出现一次验证码
          ipMax             超出此阈值后直接进入临时黑名单
          ipMaxBlockTimes   临时黑名单超出此阈值后直接进入永久黑名单
          
          vcodeErrorTimes   [a,b] a秒验证码出错b次，进入临时黑名单
          tempBlockTime     临时黑名单时长
```
