本文介绍注解方式配置dubbo的例子。

服务提供Provider

1. 定义接口Animal和实现类Cat

Animal:

public interface Animal {

/**

* 描述: 返回动物的叫声

*/

String sound();

}

Cat:

package com.yt.provider;

import com.alibaba.dubbo.config.annotation.Service;

@Service(timeout = 5000)

public class Cat implements Animal {

public String sound() {

return "喵";

}

}

@Service: 注解配置,服务提供者的service

2. Provider配置类

package com.yt.provider;

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.Bean;

import org.springframework.context.annotation.Configuration;

/**

* @author: yt

* @date: 2021/5/13 21:40

* @description:

*/

@Configuration

@EnableDubbo(scanBasePackages = "com.yt.provider")

public class ProviderConfiguration {

/**

* dubbo应用配置

*/

@Bean

public ApplicationConfig applicationConfig() {

ApplicationConfig applicationConfig = new ApplicationConfig();

applicationConfig.setName("myApp");

applicationConfig.setOwner("yt");

return applicationConfig;

}

/**

* 配置服务提供者

*/

@Bean

public ProviderConfig providerConfig() {

ProviderConfig providerConfig = new ProviderConfig();

providerConfig.setTimeout(1000);

return providerConfig;

}

/**

* 注册中心配置 zookeeper

*/

@Bean

public RegistryConfig registryConfig() {

RegistryConfig registryConfig = new RegistryConfig();

registryConfig.setProtocol("zookeeper");

registryConfig.setAddress("localhost:2181");

registryConfig.setCheck(false);

return registryConfig;

}

/**

* 协议配置 dubbo:20880

*/

@Bean

public ProtocolConfig protocolConfig() {

ProtocolConfig protocolConfig = new ProtocolConfig();

protocolConfig.setName("dubbo");

protocolConfig.setPort(20880);

return protocolConfig;

}

}

@Configuration: 注解标明配置类,@EnableDubbo 指定扫描的包路径。

配置的内容主要有:

应用配置 :类似

服务提供者配置:类似

注册中心配置:类似

协议配置:类似

3. 启动服务

public class Provider {

public static void main(String[] args) throws IOException {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);

context.start();

System.in.read();

}

}

指定配置类之后,就可以启动。

服务消费Consumer

1. 创建服务消费service

package com.yt.consumer;

import com.alibaba.dubbo.config.annotation.Reference;

import com.yt.provider.Animal;

import org.springframework.stereotype.Component;

@Component

public class ConsumerService {

@Reference

private Animal animal;

public String sound() {

return animal.sound();

}

}

新建一个service类,加上@Component注解,将对象交给spring管理,之后加上@Reference注解注入Animal接口。

2. 服务消费配置类

package com.yt.consumer;

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 org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.stereotype.Component;

/**

* @author: yt

* @date: 2021/5/13 21:52

* @description:

*/

@Configuration

@EnableDubbo(scanBasePackages = "com.yt.consumer")

@ComponentScan(value = {"com.yt.consumer"})

public class ConsumerConfiguration {

/**

* 应用配置

*/

@Bean

public ApplicationConfig applicationConfig() {

ApplicationConfig applicationConfig = new ApplicationConfig();

applicationConfig.setName("myApp");

applicationConfig.setOwner("yt");

return applicationConfig;

}

/**

* 消费者配置

*/

@Bean

public ConsumerConfig consumerConfig() {

ConsumerConfig consumerConfig = new ConsumerConfig();

consumerConfig.setTimeout(3000);

return consumerConfig;

}

/**

* 注册中心配置

*/

@Bean

public RegistryConfig registryConfig() {

RegistryConfig registryConfig = new RegistryConfig();

registryConfig.setProtocol("zookeeper");

registryConfig.setAddress("localhost:2181");

return registryConfig;

}

}

跟服务提供者的配置类似。

@ComponentScan(value = {"com.yt.consumer"}) 指定要扫描component的包路径,扫描ConsumerService。

3. 启动服务

public class Consumer {

public static void main(String[] args) {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);

context.start();

// 从spring容器中取得bean

ConsumerService consumerService = context.getBean(ConsumerService.class);

System.out.println("consumer:" + consumerService.sound());

}

}

服务成功启动,并输出结果(记得启动zookeeper):

consumer:喵