apache / apisix

The Cloud-Native API Gateway
https://apisix.apache.org/blog/
Apache License 2.0
14.3k stars 2.49k forks source link

feat: How to make apisix be the gateway for tars #6570

Open zhixiongdu027 opened 2 years ago

zhixiongdu027 commented 2 years ago

Issue description

Feat: How to make apisix be the gateway for tars

Background:

TARS is a Linux Foundation project. It is a high-performance RPC framework based on name service and Tars protocol, also integrated administration platform, and implemented hosting-service via flexible schedule.

Now I want to implement Tars proxy function with apisix, and make apisix be the gateway for tars

What does it look like:

a service discovery plugin (can both work in http module and stream module)

rpc calls to tars are addressed through servants. this discovery plugin will provide translation services from servants to nodes, like:

  local function discovery.nodes("Test.TestServer.HelloObj")
    return {
      { host = "172.16.8.33", port = 12334, weight =100,},
      { host = "172.16.8.33", port = 12334, weight =100,},
    }
  end

a tars http proxy

There are two problems in providing tcp services externally:

  1. Limited exposed ports
  2. Poor synergy with different frameworks

So there needs to be a gateway to provide http->tcp conversion and proxy Tars already has an official TarsGateway to do this work, I will refer to it to implement APISix Tars Proxy

a tars tcp proxy

It is also necessary to support tcp proxy:

How to use this:

discovery configuration as follows:

discovery:
  tars:
    db_conf:
      host: 172.16.1.99
      port: 3306
      database: db_tars
      user: tars
      password: tars2022    

http proxy configuration as follows:

configuration format is based on TarsGateway, with slight changes

  tars-proxy:
    hosts: [ "*.tars.com","a.rpc.com" ]
    tup_uri: /tup
    json_uri: /tup-json
    auto_proxy: false
    default:
      balancer: chash
      hash_on: head
      key: XGUID
      timeout:
        connect: 1000
        send: 1000
        read: 1000
      discovery: tars
      forward_headers: [ "XGUID","REMOTE_IP" ]
    proxy:
      hello:test:
        servant: Test.TestServer.HelloObj
        nodes:
          - host: 172.16.33.8
            port: 9927
      hello:
        servant: Test.TestServer.HelloObj
      sum:
        servant: Test.GetSumServer.GetSumObj
        balancer: roudrobin
      user:
        servant: Test.UserServer.LoginObj
        forward_headers: [ "GUID","token" ]

tcp proxy configuration as follows:

todo

spacewander commented 2 years ago

We need a C or Lua SDK for tars. Would you like to contribute this feature?

zhixiongdu027 commented 2 years ago

yes. I have implemented the incomplete encoding and decoding of the tars protocol in C language, but it is enough as a proxy.

shoulda commented 2 years ago

Now that there exists TarsGateway, why does you choose apisix ? @ @zhixiongdu027 😂

zhixiongdu027 commented 2 years ago

one gateway proxy all requests is better than propagating to multiple gateways

@shoulda

shoulda commented 2 years ago

C or Lua SDK for tars

Hi, Is there any progress? I want to learn from you, please 😊

spacewander commented 2 years ago

CC @zhixiongdu027