1. 程式人生 > >springboot+dubbo之多埠注入服務

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管理。