[ 
https://issues.apache.org/jira/browse/DUBBO-137?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Albumen Kevin updated DUBBO-137:
--------------------------------
    Description: 
## Unified IDL control for multiple protocols

```Client``` and ```Server``` layer APIs can support both IDL and Non-IDL modes.
For IDL mode(Triple + Protobuf), defining proto file and making use of 
protoc-gen-go-triple to generate related code are straightforward. Generated 
code(XXX.triple.go) would contain statements that invoking APIs provided by 
```Client``` and ```Server``` layers.
For Non-IDL mode, it needs users to write invoking code by themselves and is 
not convenient. Take Dubbo+Hessian2 as example:

Client Side
```
Cli, err := client.NewClient()
        cli, err := client.NewClient(
                client.WithClientProtocolDubbo(), )
        )
        withClientProtocolDubbo(), ) if err ! = nil {
                panic(err)
        }
        conn, err := cli.Dial("GreetProvider",
                client.WithURL("127.0.0.1:20000"), )
        )
        if err ! = nil {
                panic(err)
        }
        var resp string
        if err := conn.CallUnary(context.Background(), []interface{}{"hello", 
"new", "dubbo"}, &resp, "Greet"); err ! = nil {
                logger.Errorf("GreetProvider.Greet err: %s", err)
                errorf("GreetProvider.Greet err: %s", err)
        }
```

Server Side
```
GreetProvider.
type GreetProvider struct {
}

func (*GreetProvider) Greet(req string, req1 string, req2 string) (string, 
error) {
        return req + req1 + req2, nil
}

srv, err := server.NewServer(
        server.WithServerProtocol(
                protocol.WithDubbo(), protocol.WithPort(20000))
                protocol.WithPort(20000),
        ),
)
if err ! = nil {
        panic(err)
}
if err := srv.Register(&GreetProvider{}, nil, 
server.WithInterface("GreetProvider")); err ! = nil {
        panic(err)
}
if err := srv.Serve(); err ! = nil {
        panic(err)
}
```

### Proposal
Even in Non-IDL mode, code is generated using protobuf IDL. In this way, 
whether you need schema (Protobuf) or not (Hessian2, Msgpack), it's all 
uniformly used: Protobuf IDL + generated code.

### Details:
1. Generate Dubbo + Hessian2 related code with the help of Protobuf IDL. 
Compared to XXX.pb.go, XXX.hessian2.go would have much less content (due to 
Hessian2 schema-free), only structure definitions and the corresponding 
registration function (hessian2.Register(POJO)).
2. Non-IDL (Hessian2) may not map perfectly to Protobuf IDL, and we need to 
define our own dialect in a way that is compatible with the official semantics 
of Protobuf IDL
3. XXX.dubbo.go content is basically similar to XXX.triple.go, generating code 
that uses the APIs of ```Client``` layer and ```Server``` layer.

### Prerequisite:
1. Provide tools for Dubbo side users to automatically convert Dubbo interface 
definitions into Protobuf IDL.
2. Protobuf IDL can support extensions (add Hessian2-specific tag extensions, 
generate Hessian2-specific content)

### Results:
Not only Dubbo + Hessian2, but also Triple + Hessian2, Triple + Json and other 
Non-IDLs can use the interface in a unified way.

h3. Mentor
 * Mentor: Albumen Kevin, Apache Dubbo PMC, [email protected]
 * Mailing List: [email protected]
h4.  

  was:
h2. Unified IDL control for multiple protocols
{{Client}} and {{Server}} layer APIs can support both IDL and Non-IDL modes.
For IDL mode(Triple + Protobuf), defining proto file and making use of 
protoc-gen-go-triple to generate related code are straightforward. Generated 
code(XXX.triple.go) would contain statements that invoking APIs provided by 
{{Client}} and {{Server}} layers.
For Non-IDL mode, it needs users to write invoking code by themselves and is 
not convenient. Take Dubbo+Hessian2 as example:
Client Side
 {{Cli, err := client.NewClient()
        cli, err := client.NewClient(
                client.WithClientProtocolDubbo(), )
        )
        withClientProtocolDubbo(), ) if err ! = nil \{
                panic(err)
        }
        conn, err := cli.Dial("GreetProvider",
                client.WithURL("127.0.0.1:20000"), )
        )
        if err ! = nil \{
                panic(err)
        }
        var resp string
        if err := conn.CallUnary(context.Background(), []interface{}\{"hello", 
"new", "dubbo"}, &resp, "Greet"); err ! = nil \{
                logger.Errorf("GreetProvider.Greet err: %s", err)
                errorf("GreetProvider.Greet err: %s", err)
        }}}
 
Server Side
 {{GreetProvider.
type GreetProvider struct \{
}

func (*GreetProvider) Greet(req string, req1 string, req2 string) (string, 
error) \{
        return req + req1 + req2, nil
}

srv, err := server.NewServer(
        server.WithServerProtocol(
                protocol.WithDubbo(), protocol.WithPort(20000))
                protocol.WithPort(20000),
        ),
)
if err ! = nil \{
        panic(err)
}
if err := srv.Register(&GreetProvider{}, nil, 
server.WithInterface("GreetProvider")); err ! = nil \{
        panic(err)
}
if err := srv.Serve(); err ! = nil \{
        panic(err)
}}}
 
h3. Proposal
Even in Non-IDL mode, code is generated using protobuf IDL. In this way, 
whether you need schema (Protobuf) or not (Hessian2, Msgpack), it's all 
uniformly used: Protobuf IDL + generated code.
h3. Details:
 # Generate Dubbo + Hessian2 related code with the help of Protobuf IDL. 
Compared to XXX.pb.go, XXX.hessian2.go would have much less content (due to 
Hessian2 schema-free), only structure definitions and the corresponding 
registration function (hessian2.Register(POJO)).
 # Non-IDL (Hessian2) may not map perfectly to Protobuf IDL, and we need to 
define our own dialect in a way that is compatible with the official semantics 
of Protobuf IDL
 # XXX.dubbo.go content is basically similar to XXX.triple.go, generating code 
that uses the APIs of {{Client}} layer and {{Server}} layer.

h3. Prerequisite:
 # Provide tools for Dubbo side users to automatically convert Dubbo interface 
definitions into Protobuf IDL.
 # Protobuf IDL can support extensions (add Hessian2-specific tag extensions, 
generate Hessian2-specific content)

h3. Results:
Not only Dubbo + Hessian2, but also Triple + Hessian2, Triple + Json and other 
Non-IDLs can use the interface in a unified way.
h3. Mentor
 * Mentor: Albumen Kevin, Apache Dubbo PMC, [email protected]
 * Mailing List: [email protected]
h4.  


> Unified IDL control for multiple protocols
> ------------------------------------------
>
>                 Key: DUBBO-137
>                 URL: https://issues.apache.org/jira/browse/DUBBO-137
>             Project: Apache Dubbo
>          Issue Type: New Feature
>            Reporter: Albumen Kevin
>            Priority: Major
>              Labels: AI, Dubbo, full-time, gsoc2024
>
> ## Unified IDL control for multiple protocols
> ```Client``` and ```Server``` layer APIs can support both IDL and Non-IDL 
> modes.
> For IDL mode(Triple + Protobuf), defining proto file and making use of 
> protoc-gen-go-triple to generate related code are straightforward. Generated 
> code(XXX.triple.go) would contain statements that invoking APIs provided by 
> ```Client``` and ```Server``` layers.
> For Non-IDL mode, it needs users to write invoking code by themselves and is 
> not convenient. Take Dubbo+Hessian2 as example:
> Client Side
> ```
> Cli, err := client.NewClient()
>       cli, err := client.NewClient(
>               client.WithClientProtocolDubbo(), )
>       )
>       withClientProtocolDubbo(), ) if err ! = nil {
>               panic(err)
>       }
>       conn, err := cli.Dial("GreetProvider",
>               client.WithURL("127.0.0.1:20000"), )
>       )
>       if err ! = nil {
>               panic(err)
>       }
>       var resp string
>       if err := conn.CallUnary(context.Background(), []interface{}{"hello", 
> "new", "dubbo"}, &resp, "Greet"); err ! = nil {
>               logger.Errorf("GreetProvider.Greet err: %s", err)
>               errorf("GreetProvider.Greet err: %s", err)
>       }
> ```
> Server Side
> ```
> GreetProvider.
> type GreetProvider struct {
> }
> func (*GreetProvider) Greet(req string, req1 string, req2 string) (string, 
> error) {
>       return req + req1 + req2, nil
> }
> srv, err := server.NewServer(
>       server.WithServerProtocol(
>               protocol.WithDubbo(), protocol.WithPort(20000))
>               protocol.WithPort(20000),
>       ),
> )
> if err ! = nil {
>       panic(err)
> }
> if err := srv.Register(&GreetProvider{}, nil, 
> server.WithInterface("GreetProvider")); err ! = nil {
>       panic(err)
> }
> if err := srv.Serve(); err ! = nil {
>       panic(err)
> }
> ```
> ### Proposal
> Even in Non-IDL mode, code is generated using protobuf IDL. In this way, 
> whether you need schema (Protobuf) or not (Hessian2, Msgpack), it's all 
> uniformly used: Protobuf IDL + generated code.
> ### Details:
> 1. Generate Dubbo + Hessian2 related code with the help of Protobuf IDL. 
> Compared to XXX.pb.go, XXX.hessian2.go would have much less content (due to 
> Hessian2 schema-free), only structure definitions and the corresponding 
> registration function (hessian2.Register(POJO)).
> 2. Non-IDL (Hessian2) may not map perfectly to Protobuf IDL, and we need to 
> define our own dialect in a way that is compatible with the official 
> semantics of Protobuf IDL
> 3. XXX.dubbo.go content is basically similar to XXX.triple.go, generating 
> code that uses the APIs of ```Client``` layer and ```Server``` layer.
> ### Prerequisite:
> 1. Provide tools for Dubbo side users to automatically convert Dubbo 
> interface definitions into Protobuf IDL.
> 2. Protobuf IDL can support extensions (add Hessian2-specific tag extensions, 
> generate Hessian2-specific content)
> ### Results:
> Not only Dubbo + Hessian2, but also Triple + Hessian2, Triple + Json and 
> other Non-IDLs can use the interface in a unified way.
> h3. Mentor
>  * Mentor: Albumen Kevin, Apache Dubbo PMC, [email protected]
>  * Mailing List: [email protected]
> h4.  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to