分析dubbo不同版本的服务定义语法,用于从代码中提取接口文档。
通信协议
Dubbo 作为一款 RPC 框架内置了高效的 RPC 通信协议,帮助解决服务间的编码与通信问题,目前支持的协议包括:
- triple,基于 HTTP/1、HTTP/2 的高性能通信协议,100% 兼容 gRPC,支持 Unary、Streming 等通信模式;支持发布 REST 风格的 HTTP 服务。
- dubbo,基于 TCP 的高性能私有通信协议,缺点是通用性较差,更适合在 Dubbo SDK 间使用;
- 任意协议扩展,通过扩展 protocol 可以之前任意 RPC 协议,官方生态库提供 JsonRPC、thrift 等支持。
triple 协议支持以 rest 风格发布标准的 http 服务,框架中已经移除了独立的rest protocol实现。
参数序列化
对于dubbo或者triple协议,统一序列化成json数组。如[1, “hello”, {“name”: “zhangsan”}]
对于rest协议,按照http方案去解析接口,不认定为dubbo。
Dubbo服务定义方式
1. 基于 Java Interface 的标准 Dubbo 服务定义
使用@DubboService
注解进行服务定义
@Service 注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service 注解
public interface DemoService {
String sayHello(String name);
}
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
使用@Service
注解进行服务定义
2.x版本可以使用 @Service 注解进行服务定义(注意不是spring的)
@com.alibaba.dubbo.config.annotation.Service
@org.apache.dubbo.config.annotation.Service
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class AnnotationHelloServiceImpl implements HelloService {
public String sayHello(String name) {
System.out.println("greeting service received: " + name);
return "hello, " + name;
}
}
2. 使用 Java Config进行服务定义
@Configuration
public class ProviderConfiguration {
@Bean
public ServiceBean demoService() {
ServiceBean service = new ServiceBean();
service.setInterface(DemoService.class);
service.setRef(new DemoServiceImpl());
service.setGroup("dev");
service.setVersion("1.0.0");
Map<String, String> parameters = new HashMap<>();
service.setParameters(parameters);
return service;
}
}
3. 使用XML进行服务定义
不同的dubbo版本,可能dubbo XML的namespace会不同:
- http://code.alibabatech.com/schema/dubbo
- http://dubbo.apache.org/schema/dubbo
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- provider's application name, used for tracing dependency relationship -->
<dubbo:application name="demo-provider"/>
<!-- use multicast registry center to export service -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- use dubbo protocol to export service on port 20880 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- service implementation, as same as regular local bean -->
<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
<!-- declare the service interface to be exported -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>
4. 使用API定义
使用 API 启动 dubbo(DubboBootstrap.start) 时定义服务
public class Application {
public static void main(String[] args) {
DubboBootstrap.getInstance()
.protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051))
.service(ServiceBuilder.newBuilder().ref(new DemoServiceImpl()).build())
.start()
.await();
}
}
启动后动态注册服务
public static void main(String[] args) {
ServiceConfig<DemoService> demoServiceConfig = new ServiceConfig<>();
demoServiceConfig.setInterface(DemoService.class);
demoServiceConfig.setRef(new DemoServiceImpl());
demoServiceConfig.setVersion("1.0.0");
demoServiceConfig.export(); // this service will be registered to the default instance of DubboBootstrap.getInstance()
}