分析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 {@Overridepublic 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 {@Beanpublic 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.xsdhttp://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()
}