springboot+dubbo之多埠注入服務
阿新 • • 發佈:2019-01-25
前面介紹了,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 classDubboAutoConfiguration { @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管理。