eolinker / apinto

基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
https://www.apinto.com
Apache License 2.0
1.34k stars 198 forks source link

feat:服务发现接入北极星 #118

Closed baker-yuan closed 1 year ago

baker-yuan commented 1 year ago

北极星是腾讯开源的服务治理平台,apinto服务发现模块接入北极星作为服务发现,代码已在本地测试。如果可以合并,我在完善文档apinto-docs,控制台项目apinto-dashboard新建服务发现给出北极星选项。

baker-yuan commented 1 year ago

服务发现这块我有个问题,我看每个服务发现都可以配置多个地址,然后通过服务名获取节点的时候,循环遍历每个ip/客户端去获取节点信息

1、注册中心都是集群部署,这里的多个ip地址是为了负载均衡和熔灾,这里是不是请求一个节点获取数据就可以了吗,每个节点都去请求一遍数据不是重复了,感觉也没必要。 2、多个ip地址,是为了接入多个集群吗,这样看起来创建多个客户端是有必要的

baker-yuan commented 1 year ago

测试步骤

1、使用北极星的go服务 这个服务要不要作为一个案例放在example目录下

package main
import (
    "fmt"
    "log"
    "net"
    "net/http"
    "github.com/polarismesh/polaris-go/api"
)

// curl http://localhost:8849/hello
func main() {
    port := 55613
    ln, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", port))
    if err != nil {
        panic(err)
    }

    // 创建一个简单的HTTP服务
    http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        _, _ = fmt.Fprint(w, "Hello World!")
    })

    go func() {
        err := http.Serve(ln, nil)
        log.Fatal(err)
    }()

    provider, err := api.NewProviderAPIByAddress("127.0.0.1:8091")
    if err != nil {
        panic(err)
    }
    registerRequest := &api.InstanceRegisterRequest{}
    registerRequest.Service = "polaris_service"
    registerRequest.Namespace = "default"
    registerRequest.Host = "127.0.0.1"
    registerRequest.Port = port
    registerRequest.SetTTL(10)
    resp, err := provider.RegisterInstance(registerRequest)
    if err != nil {
        panic(err)
    }
    fmt.Println(resp.InstanceID)

    // 运行直到程序被终止
    select {}
}

2、配置注册中心

curl -X POST  \
  'http://127.0.0.1:9400/api/discovery' \
  -H 'Content-Type:application/json' \
  -d '{
    "name": "demo_polaris",
    "driver": "polaris",
    "config": {
        "address": ["127.0.0.1:8091"],
        "namespace": "default",
        "params": {}
    }
}'

3、配置服务

curl -X POST  \
  'http://127.0.0.1:9400/api/service' \
  -H 'Content-Type:application/json' \
  -d '{
    "name": "polaris_service",
    "driver": "http",
    "description": "配置了北极星服务发现的服务",
    "scheme": "http",
    "timeout": 3000,
    "retry": 3,
    "discovery": "demo_polaris@discovery",
    "service": "polaris_service",
    "balance": "round-robin"
}'

4、配置路由

curl -X POST http://127.0.0.1:9400/api/router \
-H "Content-type: application/json" \
-d '{
    "name": "demo_router",
    "driver": "http",
    "description": "路由示例",
    "listen": 80,
    "rules": [{
        "location": "/hello"
    }],
    "service": "polaris_service@service"
}'

5、访问

curl 'http://127.0.0.1:80/hello'
chen2eric commented 1 year ago

服务发现这块我有个问题,我看每个服务发现都可以配置多个地址,然后通过服务名获取节点的时候,循环遍历每个ip/客户端去获取节点信息

1、注册中心都是集群部署,这里的多个ip地址是为了负载均衡和熔灾,这里是不是请求一个节点获取数据就可以了吗,每个节点都去请求一遍数据不是重复了,感觉也没必要。 2、多个ip地址,是为了接入多个集群吗,这样看起来创建多个客户端是有必要的

服务发现配置的地址应该是单个集群里多个节点的地址,为的是可用性。而之所以遍历每个地址,是因为每个服务发现都可以自定义存储后端,数据并不都是强一致性。

baker-yuan commented 1 year ago

服务发现这块我有个问题,我看每个服务发现都可以配置多个地址,然后通过服务名获取节点的时候,循环遍历每个ip/客户端去获取节点信息

1、注册中心都是集群部署,这里的多个ip地址是为了负载均衡和熔灾,这里是不是请求一个节点获取数据就可以了吗,每个节点都去请求一遍数据不是重复了,感觉也没必要。 2、多个ip地址,是为了接入多个集群吗,这样看起来创建多个客户端是有必要的

服务发现配置的地址应该是单个集群里多个节点的地址,为的是可用性。而之所以遍历每个地址,是因为每个服务发现都可以自定义存储后端,数据并不都是强一致性。

ok

baker-yuan commented 1 year ago

@Dot-Liu 大佬怎么说

Dot-Liu commented 1 year ago

请稍等,我们将安排同事@chen2eric 跟进这个PR,并对功能进行验证,今天内给出答复

chen2eric commented 1 year ago

我用docker部署了Polaris,拉了你仓库的代码进行本地测试。调用服务发现没有可用的节点。 而我用open-api从Polaris获取实例列表,需要在请求头部加上X-Polaris-Token:{token}才能成功获取。 因此我判断代码里,consumerAPI需要设置token,但我暂时找不到在哪设置

baker-yuan commented 1 year ago

我用docker部署了Polaris,拉了你仓库的代码进行本地测试。调用服务发现没有可用的节点。 而我用open-api从Polaris获取实例列表,需要在请求头部加上X-Polaris-Token:{token}才能成功获取。 因此我判断代码里,consumerAPI需要设置token,但我暂时找不到在哪设置

我看文档北极星文档查询是不需要token的,注册、反注册、心跳上报才需要token,token禁用也能查询数据 https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8/%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/%E6%A6%82%E8%BF%B0/

image

有案例让我复现一下吗

chen2eric commented 1 year ago

我用docker部署了Polaris,拉了你仓库的代码进行本地测试。调用服务发现没有可用的节点。 而我用open-api从Polaris获取实例列表,需要在请求头部加上X-Polaris-Token:{token}才能成功获取。 因此我判断代码里,consumerAPI需要设置token,但我暂时找不到在哪设置

我看文档北极星文档查询是不需要token的,注册、反注册、心跳上报才需要token,token禁用也能查询数据 https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8/%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/%E6%A6%82%E8%BF%B0/

image

有案例让我复现一下吗

问题找到了,我本地用了http的端口,应该使用grpc 8091端口才对。

chen2eric commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

baker-yuan commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

ok,我确定下,如果NewConsumerAPI时传入的地址列表为集群下不同节点的地址,感觉没必要一个ip创建一个polaris.ConsumerAPI了,北极星是能保证数据一致性的,这个写法我也是参考前面几种注册中心的写法

image

改动点:

代码本地测试通过

chen2eric commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

ok,我确定下,如果NewConsumerAPI时传入的地址列表为集群下不同节点的地址,感觉没必要一个ip创建一个polaris.ConsumerAPI了,北极星是能保证数据一致性的,这个写法我也是参考前面几种注册中心的写法 image

改动点:

  • 插件Reset、Stop方法会调用p.clients.Destroy(),显示的去注销北极星api
  • 只创建一个NewConsumerAPI
  • namespace未指定给一个默认namespace default(北极星默认),你上次测试失败感觉就是这个原因,我给的案例没指定这个

代码本地测试通过

我本地也测试通过了,但发现了个问题,newClients方法里创建失败会返回nil, 但其它用到clients的地方没做判空操作,我在代码里给你标出来吧^_^

baker-yuan commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

ok,我确定下,如果NewConsumerAPI时传入的地址列表为集群下不同节点的地址,感觉没必要一个ip创建一个polaris.ConsumerAPI了,北极星是能保证数据一致性的,这个写法我也是参考前面几种注册中心的写法 image 改动点:

  • 插件Reset、Stop方法会调用p.clients.Destroy(),显示的去注销北极星api
  • 只创建一个NewConsumerAPI
  • namespace未指定给一个默认namespace default(北极星默认),你上次测试失败感觉就是这个原因,我给的案例没指定这个

代码本地测试通过

我本地也测试通过了,但发现了个问题,newClients方法里创建失败会返回nil, 但其它用到clients的地方没做判空操作,我在代码里给你标出来吧^_^

有判断的 1、获取节点这里为nil就返回空节点,polarisClients#getNodesFromConsumerAPI 2、销毁api这里确实掉了 polarisClients#Destroy

chen2eric commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

ok,我确定下,如果NewConsumerAPI时传入的地址列表为集群下不同节点的地址,感觉没必要一个ip创建一个polaris.ConsumerAPI了,北极星是能保证数据一致性的,这个写法我也是参考前面几种注册中心的写法 image 改动点:

  • 插件Reset、Stop方法会调用p.clients.Destroy(),显示的去注销北极星api
  • 只创建一个NewConsumerAPI
  • namespace未指定给一个默认namespace default(北极星默认),你上次测试失败感觉就是这个原因,我给的案例没指定这个

代码本地测试通过

我本地也测试通过了,但发现了个问题,newClients方法里创建失败会返回nil, 但其它用到clients的地方没做判空操作,我在代码里给你标出来吧^_^

有判断的 1、获取节点这里为nil就返回空节点,polarisClients#getNodesFromConsumerAPI 2、销毁api这里确实掉了 polarisClients#Destroy

我是指clients可能为空,你调 .getNodes()或者.Destory()就会空指针异常。

baker-yuan commented 1 year ago

@baker-yuan 代码里除了上面提到的consumerAPI的释放等问题,再和社区确认下,NewConsumerAPI时传入的地址列表确实为集群下不同节点的地址,就可以合并了

ok,我确定下,如果NewConsumerAPI时传入的地址列表为集群下不同节点的地址,感觉没必要一个ip创建一个polaris.ConsumerAPI了,北极星是能保证数据一致性的,这个写法我也是参考前面几种注册中心的写法 image 改动点:

  • 插件Reset、Stop方法会调用p.clients.Destroy(),显示的去注销北极星api
  • 只创建一个NewConsumerAPI
  • namespace未指定给一个默认namespace default(北极星默认),你上次测试失败感觉就是这个原因,我给的案例没指定这个

代码本地测试通过

我本地也测试通过了,但发现了个问题,newClients方法里创建失败会返回nil, 但其它用到clients的地方没做判空操作,我在代码里给你标出来吧^_^

有判断的 1、获取节点这里为nil就返回空节点,polarisClients#getNodesFromConsumerAPI 2、销毁api这里确实掉了 polarisClients#Destroy

我是指clients可能为空,你调 .getNodes()或者.Destory()就会空指针异常。

嗯嗯,看到了,polarisDiscovery#polarisClients这个字段我去掉指针类型了,这样看起来比较合理点

chen2eric commented 1 year ago

image 这里把continue去掉就没问题了,这里不去掉的话,当polaris出现连接不上或其他问题时,会跳过更新,继续沿用旧的实例信息。今晚会进行代码合并,非常感谢你的贡献!^_^ @baker-yuan

baker-yuan commented 1 year ago

image 这里把continue去掉就没问题了,这里不去掉的话,当polaris出现连接不上或其他问题时,会跳过更新,继续沿用旧的实例信息。今晚会进行代码合并,非常感谢你的贡献!^_^ @baker-yuan

好的好的,我晚点完善下接入文档

baker-yuan commented 1 year ago

还有简单点的需求吗,想通过写代码的方式熟悉这个项目

baker-yuan commented 1 year ago

image 这里把continue去掉就没问题了,这里不去掉的话,当polaris出现连接不上或其他问题时,会跳过更新,继续沿用旧的实例信息。今晚会进行代码合并,非常感谢你的贡献!^_^ @baker-yuan

好的好的,我晚点完善下接入文档

补充了apinto文档:https://github.com/eolinker/apinto-docs/pull/49

dashboard、dashboard-v2这两个感觉要废弃就没补充

dashboard-v3 我在研究下,在哪里加,dashboard-v3的文档不在apinto-docs项目里面了吗

chen2eric commented 1 year ago

image 这里把continue去掉就没问题了,这里不去掉的话,当polaris出现连接不上或其他问题时,会跳过更新,继续沿用旧的实例信息。今晚会进行代码合并,非常感谢你的贡献!^_^ @baker-yuan

好的好的,我晚点完善下接入文档

补充了apinto文档:eolinker/apinto-docs#49

dashboard、dashboard-v2这两个感觉要废弃就没补充

dashboard-v3 我在研究下,在哪里加,dashboard-v3的文档不在apinto-docs项目里面了吗

非常感谢!dashboard-v3是在其它地方部署的,暂时不能通过协作的方式进行更新,你也可以先写好,我们部署上去。

chen2eric commented 1 year ago

还有简单点的需求吗,想通过写代码的方式熟悉这个项目

现在暂时没有,后续有的话会联系你^_^

chen2eric commented 1 year ago

@baker-yuan dashboardv3的教程不需要补,而apinto-dashboardv3的polaris配置需要修改服务发现插件的配置,即补上polaris的json schema。1. 在程序启动时会加载插件配置 2.前端获取打开服务发现页面后,获取这些json schema。3.前端通过formily2.0将json schema映射成页面。 配置位于initialize/plugins/discovery.apinto.com/plugin.yml 。你可以了解下,这边由我们补上也行。

baker-yuan commented 1 year ago

@baker-yuan dashboardv3的教程不需要补,而apinto-dashboardv3的polaris配置需要修改服务发现插件的配置,即补上polaris的json schema。1. 在程序启动时会加载插件配置 2.前端获取打开服务发现页面后,获取这些json schema。3.前端通过formily2.0将json schema映射成页面。 配置位于initialize/plugins/discovery.apinto.com/plugin.yml 。你可以了解下,这边由我们补上也行。

好的,我研究下

chen2eric commented 1 year ago

@baker-yuan apinto文档需要修改配置文件以及在相应的位置补上md文件 image