dubbo[3]_注解配置

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

服务提供Provider

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

image

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 指定扫描的包路径。

配置的内容主要有:

  • 应用配置 :类似 <dubbo:application 标签
  • 服务提供者配置:类似<dubbo:provider‘标签
  • 注册中心配置:类似<dubbo:registry 标签
  • 协议配置:类似 <dubbo:protocol 标签

3. 启动服务

public class Provider {
    public static void main(String[] args) throws IOException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
        context.start();
        System.in.read();
    }
}

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

服务消费Consumer

image

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:喵
posted @ 2024-08-23 10:59  Aeons  阅读(19)  评论(0编辑  收藏  举报