上文我们搭建好了服务器上的zookeeper服务,暴露在
<公网ip>:2182
下。接下来就可以使用zookeeper作为注册中心进行rpc调用了。
这里主要记录一下使用注解的方式配置。还有xml和Api的方式,这篇文章https://segmentfault.com/a/1190000019896723讲的很详细,可以作为参考。
和SofaRpc一样,服务提供者和服务消费者都需要保证接口的包名完全一致,如果接口返回对象,也需要实现java.io.Serializable
,而且尽可能保证包名类名一致。(不一致会在日志输出ClassNotFoundException,虽然数据注入成功,但我们要尽可能遵守设计原理)
服务提供者
首先是spring风格的config配置,不多说直接看代码,很容易理解。
@Configuration
/* 下面指定了Dubbo应该去哪里找到接口实现,同时也是被Dubbo定义的Server注解修饰的Component */
@EnableDubbo(scanBasePackages = "com.vaskka.jishi.v3.service.impl")
public class DubboConfig {
/**
* zookeeper endpoint
*/
@Value("${zk-center.endpoint}")
private String ZK_CENTER;
/**
* zookeeper port
*/
@Value("${zk-center.port}")
private int ZK_PORT;
/**
* dubbo title 服务提供者的名字,我们用作区分
*/
@Value("${dubbo-center.user-title}")
private String DUBBO_USER_TITLE;
@Bean // #1 服务提供者信息配置
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(5000);
return providerConfig;
}
@Bean // #2 分布式应用信息配置
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(DUBBO_USER_TITLE);
return applicationConfig;
}
@Bean // #3 注册中心信息配置
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress(ZK_CENTER);
registryConfig.setPort(ZK_PORT);
return registryConfig;
}
@Bean // #4 使用协议配置,这里使用 dubbo
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
运行服务,在日志里找到了org.apache.curator.framework.state.ConnectionStateManager 228 postState - State change: CONNECTED
说明ZooKeeper·服务成功连接。
服务消费者
最前面提到,我们需要保证接口的一致,包括包名都要一致,这里很重要,不然会报NotFound。
服务消费者的config与提供者差不多,直接看config:
@Configuration
/* 下面这个注解的作用和服务发布者一致,不再赘述 */
@EnableDubbo(scanBasePackages = "com.vaskka.jishi.v3.fruit.service.impl")
/* 下面这行指出我们的服务接口要在那个Component被注入(使用),也就是在哪里被Reference注解修饰 */
@ComponentScan(value = "com.vaskka.jishi.v3.dubbo")
public class DubboConfig {
/**
* zookeeper endpoint
*/
@Value("${zk-center.endpoint}")
private String ZK_CENTER;
/**
* zookeeper port
*/
@Value("${zk-center.port}")
private int ZK_PORT;
/**
* dubbo sales title
*/
@Value("${dubbo-center.sales-title}")
private String DUBBO_SALES_TITLE;
@Bean // #1 服务提供者信息配置
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(5000);
return providerConfig;
}
@Bean // #2 分布式应用信息配置
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(DUBBO_SALES_TITLE);
Map<String, String> stringStringMap = new HashMap<String, String>();
stringStringMap.put("qos.enable","true");
stringStringMap.put("qos.accept.foreign.ip","true"); // false -> true
stringStringMap.put("qos.port","33333");
applicationConfig.setParameters(stringStringMap);
return applicationConfig;
}
@Bean // #3 注册中心信息配置
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress(ZK_CENTER);
registryConfig.setPort(ZK_PORT);
return registryConfig;
}
@Bean // #4 使用协议配置,这里使用 dubbo
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
在代码中也提到,要使用rpc,我们要用@Reference
修饰接口。总体与SofaRpc的使用有很大的相似之处,具体在性能、设计、实现上的不同还没有深究,留作之后的任务对SofaRpc和开源的中间件进行深度的对比。