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,服务端和客户端,客户单打印:
还没有评论,来说两句吧...