springboot+dubbo之多端口注入服務


  前面介紹了,springboot+dubbo基礎整合,這篇介紹多端口注入服務。

  springboot使用@Bean注入dubbo服務,當你是單一的ProviderConfig實例,dubbo的@Service會自動索引到你注入的實例。但實際使用情況下,dubbo服務提供者不可能統統只用一個端口提供服務。

  這是你就需要注入多個ProviderConfig,ProtocolConfig實例, 因此你可以封裝自己的dubboConfiguration,注入新的ProviderConfig,ProtocolConfig實例。

 

package hello.configuration;

import javax.annotation.Resource;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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.rpc.Exporter;

/**
 * 多端口提供dubbo服務
 *     當你使用多端口提供服務,使用默認端口提供服務:需要加入在service上加上defaultProvider
 * @author chenlili
 *
 */
@Configuration
@ConditionalOnClass(Exporter.class)
public class DubboAutoConfiguration {
    
    @Resource(name="protocolConfig1")
    private ProtocolConfig protocolConfig;
    
    @Resource(name="protocolConfig2")
    private ProtocolConfig protocolConfig2;
    
    /**
     * 默認基於dubbo協議提供服務
     * 
     * @return
     */
    @Bean(name = "protocolConfig1")
    public ProtocolConfig protocolConfig() {
        // 服務提供者協議配置
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("rmi");
        protocolConfig.setPort(20881);
        protocolConfig.setThreads(200);

        System.out.println("protocolConfig1的hashCode: " + protocolConfig.hashCode());

        return protocolConfig;
    }

    /**
     * dubbo服務提供
     * 
     * @param applicationConfig
     * @param registryConfig
     * @param protocolConfig
     * @return
     */
    @Bean(name = "providerConfig1")
    public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig) {
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setTimeout(1000);
        providerConfig.setRetries(1);
        providerConfig.setDelay(-1);
        providerConfig.setApplication(applicationConfig);
        providerConfig.setRegistry(registryConfig);
        providerConfig.setProtocol(this.protocolConfig);
        return providerConfig;
    }

    /**
     * 默認基於dubbo協議提供服務
     * 
     * @return
     */
    @Bean(name = "protocolConfig2")
    public ProtocolConfig protocolConfig2() {
        // 服務提供者協議配置
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20882);
        protocolConfig.setThreads(200);

        System.out.println("protocolConfig2的hashCode: " + protocolConfig.hashCode());

        return protocolConfig;
    }

    /**
     * dubbo服務提供
     * 
     * @param applicationConfig
     * @param registryConfig
     * @param protocolConfig
     * @return
     */
    @Bean(name = "providerConfig2")
    public ProviderConfig providerConfig2(ApplicationConfig applicationConfig, RegistryConfig registryConfig) {
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setTimeout(1000);
        providerConfig.setRetries(1);
        providerConfig.setDelay(-1);
        providerConfig.setApplication(applicationConfig);
        providerConfig.setRegistry(registryConfig);
        providerConfig.setProtocol(protocolConfig2);
        return providerConfig;
    }
}

  @Service使用時,直接使用@Service(version="1.0.0")會報錯,提示你找不到對應的provider,因此需要配上對應的provider,因此在默認dubboConfiguration上加了@Bean(name="defaultProvider"),用於索引默認provider。

  

package hello.dubbo;

import com.alibaba.dubbo.config.annotation.Service;
import com.jon.show.service.IDubboDemoService;

@Service(version="1.0.0",provider="providerConfig1")
public class DubboDemoServiceImpl implements IDubboDemoService{

    @Override
    public String sayHello(String name) {
        return "hello " + name;
    }

    @Override
    public String sayYourAge(int age) {
        return null;
    }

}
package hello.dubbo;


import com.alibaba.dubbo.config.annotation.Service;
import com.google.gson.Gson;
import com.jon.show.model.Person;
import com.jon.show.service.IDubboPersonService;

@Service(version="1.0.0", provider="providerConfig2")
public class PersonServiceImpl implements IDubboPersonService{
    
    @Override
    public String toJson(Person person) {
        Gson gson = new Gson();
        return gson.toJson(person);
    }

}

  啟動appliction類,dubbo服務就能提供多端口支持了!!

  PS:dubbo服務的所需實例均交由spring管理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM