Dubbo的四种配置,你都知道吗?

项目代码地址:https://github.com/SunSmileAZY/dubbo-demo

项目目录结构

前言

dubbo主要有四种配置方式:XML方式、注解方式、API方式、属性配置方式。本文主要是用代码的方式看一下这四种方式如何配置的,以及各个调用的demo。

其中主要配置参见如下:

Service共通代码

此部分用于测试客户端调用服务端接口

package com.pine.service.provider;

public interface UserService {

    String getUsername();
}
package com.pine.service.provider;


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

@Service
public class UserServiceImpl implements UserService {

    @Override
    public String getUsername() {
        System.out.println("调用getUsername=========");
        return "pine";
    }
}
package com.pine.service.consumer;

import com.alibaba.dubbo.config.annotation.Reference;
import com.pine.service.provider.UserService;
import org.springframework.stereotype.Component;

/**
 * 提供给dubbo消费端
 * @author pine
 */
@Component("annotatedConsumer")
public class ConsumerUserServiceImpl {

    @Reference
    private UserService userService;

    public String getUsername(){
        System.out.println("调用到ConsumerUserServiceImpl.getUsername()");
        return userService.getUsername();
    }

}

XML方式

客户端配置dubbo-client:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans.xsd


	 http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="xml-clint" />
    <dubbo:registry address="zookeeper://47.93.206.149:20181" />

    <dubbo:reference id="userService" interface="com.pine.service.provider.UserService" />

</beans>

服务端配置dubbo-server:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans.xsd


	 http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--全局配置-->
    <dubbo:provider timeout="3000" />
    <!-- 服务提供方应用名称, 方便用于依赖跟踪 -->
    <dubbo:application name="xml-server" />
    <!-- 使用zookeeper作为注册中心 -->
    <dubbo:registry address="zookeeper://47.93.206.149:20181" />

    <!--name指示使用什么协议监听端口:dubbo/rmi/rest-->
    <dubbo:protocol  name="dubbo" port="20882" />

    <!-- 通过xml方式配置为bean, 让spring托管和实例化 -->
    <bean id="userService" class="com.pine.service.provider.UserServiceImpl"/>
    <!-- 声明服务暴露的接口,并暴露服务 -->
    <dubbo:service interface="com.pine.service.provider.UserService" ref="userService"  />
</beans>

服务端代码 ProviderXml:

package com.pine.config.xml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @author pine
 */
public class ProviderXml {


    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/dubbo-server.xml");

        ctx.start();
        System.out.println("---------dubbo启动成功--------");

        // 保证服务一直开着
        synchronized (ProviderXml.class) {
            try {
                ProviderXml.class.wait();
            } catch (Throwable e) {
            }
        }

    }

}

客户端代码 ConsumerXml:

package com.pine.config.xml;

import com.pine.service.provider.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ConsumerXml {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/dubbo-client.xml");

        ctx.start();
        System.out.println("---------dubbo启动成功--------");
        // get remote service proxy
        UserService orderService = (UserService) ctx.getBean("userService");

        String username = orderService.getUsername();
        System.out.println(" ConsumerXml result: " + username);

    }
}

注解方式

服务提供端ProviderAnno:

package com.pine.config.anno;

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;

/**
 *
 * @author pine
 */
public class ProviderAnno {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
        context.start();
        System.out.println("---------dubbo启动成功--------");
        System.in.read();
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.pine.service")
    static class ProviderConfiguration {
        @Bean
        public ProviderConfig providerConfig() {
            ProviderConfig providerConfig = new ProviderConfig();
            providerConfig.setTimeout(1000);
            return providerConfig;
        }

        @Bean
        public ApplicationConfig applicationConfig() {
            ApplicationConfig applicationConfig = new ApplicationConfig();
            applicationConfig.setName("dubbo-config");
            return applicationConfig;
        }

        @Bean
        public RegistryConfig registryConfig() {
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setProtocol("zookeeper");
            registryConfig.setAddress("47.93.206.149");
            registryConfig.setPort(20181);
            return registryConfig;
        }

        @Bean
        public ProtocolConfig protocolConfig() {
            ProtocolConfig protocolConfig = new ProtocolConfig();
            protocolConfig.setName("dubbo");
            protocolConfig.setPort(20880);
            return protocolConfig;
        }
    }
}

消费端ConsumerAnno:

package com.pine.config.anno;

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.pine.service.consumer.ConsumerUserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 *
 * @author pine
 * @date 20200119
 */
public class ConsumerAnno {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
        context.start();
        System.out.println("---------dubbo启动成功--------");
        ConsumerUserServiceImpl consumerUserService = context.getBean(ConsumerUserServiceImpl.class);
        String username = consumerUserService.getUsername();
        System.out.println("username: " + username);
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.pine.service.consumer")
    @ComponentScan(value = {"com.pine.service.consumer"})
    static class ConsumerConfiguration {
        @Bean
        public ApplicationConfig applicationConfig() {
            ApplicationConfig applicationConfig = new ApplicationConfig();
            // 设置服务名
            applicationConfig.setName("dubbo-config");
            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("47.93.206.149");
            registryConfig.setPort(20181);
            return registryConfig;
        }
    }
}

API方式

API方式主要是用于架构改造方面。

服务提供端ProviderApi:

package com.pine.config.api;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.pine.service.provider.UserService;
import com.pine.service.provider.UserServiceImpl;

import java.io.IOException;

/**
 *
 * @author pine
 */
public class ProviderApi {

    public static void main(String[] args) throws IOException {
        ServiceConfig<UserService> config = new ServiceConfig<>();
        config.setApplication(new ApplicationConfig("api-provider"));
        config.setRegistry(new RegistryConfig("zookeeper://47.93.206.149:20181"));
        config.setInterface(UserService.class);
        config.setRef(new UserServiceImpl());
        config.export();

        System.out.println("first-dubbo-provider is running.");
        System.in.read();
    }


}

服务消费端ConsumerApi:


package com.pine.config.api;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.pine.service.provider.UserService;

/**
 * api 方式
 * api方式主要是用于架构方面的修改
 * @author pine
 */
public class  {

    public static void main(String[] args) {
        ReferenceConfig<UserService> reference = new ReferenceConfig<>();
        reference.setApplication(new ApplicationConfig("api-consumer"));
        reference.setRegistry(new RegistryConfig("zookeeper://47.93.206.149:20181"));
        reference.setInterface(UserService.class);
        UserService orderService = reference.get();

        String username = orderService.getUsername();
        System.out.println("result: " + username);
    }
}

配置方式

dubbo-consumer.properties

dubbo.application.name=pro-consumer
dubbo.registry.address=zookeeper://47.93.206.149:20181
dubbo.consumer.timeout=3000

dubbo-provider.properties

dubbo.application.name=pro-provider
dubbo.registry.address=zookeeper://47.93.206.149:20181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20883

服务提供端ProviderPro:

package com.pine.config.pro;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

public class ProviderPro {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
        context.start();
        System.out.println("dubbo 启动成功");
        System.in.read();
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.pine.service.provider")
    @PropertySource("classpath:/dubbo-provider.properties")
    static class ProviderConfiguration {
    }
}

服务消费端ConsumerPro:

package com.pine.config.pro;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.pine.service.consumer.ConsumerUserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

public class ConsumerPro {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
        context.start();
        ConsumerUserServiceImpl serviceConsumer = context.getBean(ConsumerUserServiceImpl.class);
        String username = serviceConsumer.getUsername();
        System.out.println("result: " + username);

    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.pine.service.consumer")
    @PropertySource("classpath:/dubbo-consumer.properties")
    @ComponentScan(value = {"com.pine.service.consumer"})
    static class ConsumerConfiguration {

    }
}

最后

以上就是dubbo的四种配置方式,配置还是比较简单的。

zookeeper我之前有一篇文章是搭建zk环境的,大家可以去参考一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章