接口:
public interface EchoService {
String echo(String message);
}
基于注解的服务端:
通过注解暴露服务,只需要在服务接口上标注@Service注解即可:
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.samples.echo.api.EchoService;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Service是Dubbo的,并不是Spring的。
* 使用@Service注解后,由Dubbo服务将这个实现提升为Spring容器的Bean,
* 并且负责配置初始化和服务暴露。
*/
@Service
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;
}
}
使用注解来生成Dubbo的配置信息:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class AnnotationProvider {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.in.read();
}
@Configuration
// #1 指定扫描服务的位置
@EnableDubbo(scanBasePackages = "com.alibaba.dubbo.samples.echo")
static class ProviderConfiguration {
@Bean
public ProviderConfig providerConfig() {
return new ProviderConfig();
}
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("echo-annotation-provider");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
// #2 使用zookeeper作为注册中心,同时给出注册中心ip和端口
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("localhost");
registryConfig.setPort(2181);
return registryConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
// #3 默认服务使用dubbo协议,在20880监听服务
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
}
基于注解的客户端:
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.samples.echo.api.EchoService;
import org.springframework.stereotype.Component;
/**
* 通过注解消费服务时,只需要@Reference注解标注,该注解适用于对象字段和方法中。
*/
@Component
public class EchoConsumer {
@Reference
private EchoService echoService;
public String echo(String name) {
return echoService.echo(name);
}
}
基于注解的客户端配置:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.alibaba.dubbo.samples.echo.refer.EchoConsumer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
public class AnnotationConsumer {
public static void main(String[] args) {
// #1 基于注解配置初始化spring上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
// #2 发起服务调用
EchoConsumer echoService = context.getBean(EchoConsumer.class);
String hello = echoService.echo("Hello world!");
System.out.println("result: " + hello);
}
@Configuration
// #3 指定要扫描的消费注解,会触发注入
@EnableDubbo(scanBasePackages = "com.alibaba.dubbo.samples.echo")
@ComponentScan(value = {"com.alibaba.dubbo.samples.echo"})
static class ConsumerConfiguration {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("echo-annotation-consumer");
return applicationConfig;
}
@Bean
public ConsumerConfig consumerConfig() {
return new ConsumerConfig();
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
// #4 使用zookeeper作为注册中心,同时给出注册中心ip和端口
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("localhost");
registryConfig.setPort(2181);
return registryConfig;
}
}
}
测试:
启动zookeeper,启动服务端和客户端,客户端打印:

本文详细介绍如何使用注解配置Dubbo服务,包括服务端和客户端的注解配置方法,以及如何通过注解来生成Dubbo的配置信息。
2184

被折叠的 条评论
为什么被折叠?



