Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zhixiongdu027 opened this issue Mar 10, 2022 · 6 comments
Open

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

zhixiongdu027 opened this issue Mar 10, 2022 · 6 comments
Assignees
Labels
enhancement New feature or request

Comments

@zhixiongdu027
Copy link
Contributor

zhixiongdu027 commented Mar 10, 2022

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:

  • RPC request proxy in the environment of internal and external network isolation
  • gateway can support server push

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
Copy link
Member

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

@zhixiongdu027
Copy link
Contributor Author

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

@spacewander spacewander added the enhancement New feature or request label Mar 11, 2022
@shoulda
Copy link

shoulda commented Mar 24, 2022

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

@zhixiongdu027
Copy link
Contributor Author

zhixiongdu027 commented Mar 25, 2022

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

@shoulda

@shoulda
Copy link

shoulda commented Jul 11, 2022

C or Lua SDK for tars

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

@spacewander
Copy link
Member

CC @zhixiongdu027

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants