Dubbo——基于API实现

基于API实现

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

接口:

public interface EchoService {

    String echo(String message);

}

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

public class EchoServiceImpl implements EchoService {

    public String echo(String message) {
        String now = new SimpleDateFormat("HH:mm:ss").format(new Date());
        System.out.println("[" + now + "] Hello " + message
                + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return message;
    }
}
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.alibaba.dubbo.samples.echo.api.EchoService;
import com.alibaba.dubbo.samples.echo.impl.EchoServiceImpl;

import java.io.IOException;

public class EchoProvider {
    public static void main(String[] args) throws IOException {
        ServiceConfig<EchoService> service = new ServiceConfig<>();
        service.setApplication(new ApplicationConfig("java-echo-provider"));
        //创建注册中心,并制定Zookeeper协议、IP和端口
        service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        //指定服务暴露的接口
        service.setInterface(EchoService.class);
        //指定真实服务对象
        service.setRef(new EchoServiceImpl());
        //暴露服务
        service.export();
        System.out.println("java-echo-provider is running.");
        System.in.read();
    }
}

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

基于API编写客户端:

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

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.samples.echo.api.EchoService;

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

测试:

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值