写在前面
dubbo提供的常用配置方式有以下四种:
1:API配置
2:属性配置
3:xml配置
4:注解配置
本文我们来一起看下第一种方式,即API配置。
在这篇文章 基础上进行改造(参考的基于springboot,这里用不到,我只是为了图省事直接在此基础上改了,其实引入dubbo相关依赖后,直接写普通的main方法就可以了)。源码 。
1:rpc-service-provider-apiconfig
删除application.yml
,dubbo.xml
配置文件,然后修改ProviderApplication
如下:
public class ProviderApplication {
public static void main(String[] args) {
// 当前应用配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("user-service-provider11191458");
// 连接注册中心配置
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("127.0.0.1:2181");
// 服务提供者协议配置
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
protocolConfig.setThreads(100);
// 暴露服务
ServiceConfig<UserRpcService> serviceConfig = new ServiceConfig<>();
serviceConfig.setApplication(applicationConfig);
serviceConfig.setRegistry(registryConfig); // 设置注册地址
serviceConfig.setProtocol(protocolConfig); // 设置协议
serviceConfig.setInterface(UserRpcService.class);
serviceConfig.setRef(new UserRpcServiceImpl()); // 设置具体实现类
serviceConfig.export(); // 完成暴露
new Scanner(System.in).next();
}
}
注意删除了@SpringbootApplication
注解和@ImportResource
注解。
2:rpc-service-consumer-apiconfig
删除application.yml
,dubbo.xml
配置文件,然后修改ConsumerApplication
如下:
public class ConsumerApplication {
private static final Logger logger = LoggerFactory.getLogger("consumer_ConsumerApplication");
public static void main(String[] args) {
// 应用配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("user-service-consumer11191521");
// 连接注册中心,获取服务提供者的信息
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("127.0.0.1:2181");
//服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(20880);
protocol.setThreads(100);
//引用远程服务
//
//注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
ReferenceConfig<UserRpcService> reference = new ReferenceConfig<>();
reference.setApplication(applicationConfig);
reference.setRegistry(registryConfig); //多个注册中心可以用setRegistries()
reference.setInterface(UserRpcService.class);
// 获取对象,像调用本地的一个对象一样调用,内部通过netty进行远程调用
UserRpcService userRpcService = reference.get();
UserDTO userDTO = userRpcService.get(1000000);
logger.info("[通过API配置方式,获得用户为({})", userDTO);
}
}
注意删除了@SpringbootApplication
注解和@ImportResource
注解。
3:启动测试
启动服务提供者,然后启动消费者,看到如下输出即为成功:
2021-11-19 17:09:58 INFO consumer_ConsumerApplication:40 - [通过API配置方式,获得用户为(UserDTO{id=1000000, name='没有昵称:1000000', gender=1})