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環境的,大家可以去參考一下。

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