基于注解实现
通过XML配置启动Dubbo服务是比较常见的方式, 但Dubbo可以消除XML配置, 直接使用注解来暴露服务, 这种方式更友好一些, 虽然业务代码会耦合一些Dubbo框架注解, 但是未来代码重构比较便利
一、基于注解编写Echo服务器
通过注解暴露服务, 只需要在要服务接口上标注旧Service注解即可,代码 如下:
代码清单 基于注解标记服务
package com.wondream.dubbo.samples.echo.impl;
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
public class EchoServicelmpl implements EchoService {
public String echo(String message) (
String now = new SimpleDateFormat("HH:mm:ss").format(new Date());
System.out.printin("[" + now + "] Hello " + message + ”, request from consumer: " + RpcContext, getContext().getRemoteAddress());
return message;
}
}
使用@Service注解后, 由Dubbo服务将这个实现类提升为Spring容器的Bean,并且负责配置初始化和服务暴露。 接下来, 基于注解来生成Dubbo的配置信息, 代码清单如下
代码清单 使用注解标记Dubbo配置
package com.wondream.dubbo.samples.echo;
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
// ①指定扫描服务所在的包
@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()
// ② 使用ZooKeeper作为注册中心, 同时给出注册中心的IP和端口
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("localhost");
registryConfig.setPort(2181);
return registryConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
// ③默认服务使用Dubbo协议,在20880端口监听服务
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
}
相比XML配置, 使用注解的方式更简洁一些, 接下来我们看一下基于注解如何消费服务
二、基于注解编写Echo客户端
通过注解消费服务时, 只需要Reference注解标注, 该注解适用于对象字段和方法中。 因此需要做一下特殊的包装。 接下来, 我们在EchoConsumer类中定义echoService字段, 该字段用@Reference注解标注, 代码清单如下:
代码清单 基于注解包装消费
package com.wondream.dubbo.samples.echo.refer;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.samples.echo.api.EchoService;
import org.springframework.stereotype.Component;
@Component
public class EchoConsumer {
@Reference
private EchoService echoService;
public String echo(String name) {
return echoService.echo(name);
}
}
在完成消费定义之后, 我们还需要完成基于注解的启动代码, 如代码清单2.8所示。
代码清单 基于注解消费服务
package com.wondream.dubbo.samples.echo;
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) {
// ①基于注解配置初始化Spring上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Consumerconfiguration.class);
context.start();
EchoConsumer echoService = context.getBean(EchoConsumer.class);
// ②发起服务调用
String hello = echoService.echo("Hello world!");
System.out.printin("result: " + hello);
}
@Configuration
//③ 指定要扫描的消费注解, 会触发注入
@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();
// 使用ZooKeeper作为注册中心,同时给出注册中心的 ip和端口
registryConfig.setProtocolC'zookeeper");
reglstryConflg.setAddress( localhost );
RegistryConfig.setPort(2181);
return registryConfig;
}
}
}
在消费服务启动后会输出以下信息: result: Hello world! 。