Spring整合Dubbo简易教程(二)——基于注解实现

基于注解实现

    通过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! 。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值