Dubbo——基于API实现

阳光穿透心脏的1/2处 2021-08-30 15:05 499阅读 0赞

基于API实现

Dubbo框架大部分场景都会在Spring中使用,但是不局限于这种场景。除了XML和注解的方式,Dubbo框架还支持API的方式。虽然大部分场景不会直接使用API的方式暴露和消费服务,但是在某些场景下API非常有用。比如开发网关类的应用,需要动态消费不同版本的服务,通过API方式,可以根据前端请求参数构造不同版本的服务实例等。

接口:

  1. public interface EchoService {
  2. String echo(String message);
  3. }

基于API编写服务器:
基于配置方式启动Dubbo,框架内部必须做很多转换,比如把标签<dubbo:protocol ...>转换成等价的配置对象,但这些转换对业务方都是透明的,不管是XML配置还是注解方式,最终都会转换成Java API对应的配置对象。

  1. public class EchoServiceImpl implements EchoService {
  2. public String echo(String message) {
  3. String now = new SimpleDateFormat("HH:mm:ss").format(new Date());
  4. System.out.println("[" + now + "] Hello " + message
  5. + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
  6. return message;
  7. }
  8. }
  9. import com.alibaba.dubbo.config.ApplicationConfig;
  10. import com.alibaba.dubbo.config.RegistryConfig;
  11. import com.alibaba.dubbo.config.ServiceConfig;
  12. import com.alibaba.dubbo.samples.echo.api.EchoService;
  13. import com.alibaba.dubbo.samples.echo.impl.EchoServiceImpl;
  14. import java.io.IOException;
  15. public class EchoProvider {
  16. public static void main(String[] args) throws IOException {
  17. ServiceConfig<EchoService> service = new ServiceConfig<>();
  18. service.setApplication(new ApplicationConfig("java-echo-provider"));
  19. //创建注册中心,并制定Zookeeper协议、IP和端口
  20. service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
  21. //指定服务暴露的接口
  22. service.setInterface(EchoService.class);
  23. //指定真实服务对象
  24. service.setRef(new EchoServiceImpl());
  25. //暴露服务
  26. service.export();
  27. System.out.println("java-echo-provider is running.");
  28. System.in.read();
  29. }
  30. }

注意:当服务提供者退出并正常停机(排除强制“杀掉”进程)时,Dubbo框架会进行优雅停机处理,在规定超时时间内,服务端会等待线程池队列执行完毕并断开远程客户端连接。

基于API编写客户端:

采用Java API是最灵活的方式,可以与第三方框架继承,特别适合动态消费场景。在Bubbo框架中典型的使用场景就是泛化调用,可以指定一个本地不存在的接口发起RPC调用。

  1. import com.alibaba.dubbo.config.ApplicationConfig;
  2. import com.alibaba.dubbo.config.ReferenceConfig;
  3. import com.alibaba.dubbo.config.RegistryConfig;
  4. import com.alibaba.dubbo.samples.echo.api.EchoService;
  5. public class EchoConsumer {
  6. public static void main(String[] args) {
  7. ReferenceConfig<EchoService> reference = new ReferenceConfig<>();
  8. // #1 设置消费方应用名称
  9. reference.setApplication(new ApplicationConfig("java-echo-consumer"));
  10. // #2 设置注册中心地址和协议
  11. reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
  12. // #3 指定要消费的服务接口
  13. reference.setInterface(EchoService.class);
  14. // #4 创建远程连接并做动态代理转换
  15. EchoService greetingsService = reference.get();
  16. String message = greetingsService.echo("Hello world!");
  17. System.out.println(message);
  18. }
  19. }

测试:

启动Zookeeper,服务端和客户端,客户单打印:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,499人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dubbo java api

    1.java 查询dubbo zookeeper上的服务提供者 这一查询在dubbo -admin中用了一些手法,继承,监听等等 有兴趣可看源码 RegistryServe