package com.yirendai.infra.cicada.demo.provider.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.config.ServiceConfig;
import com.yirendai.infra.cicada.demo.provider.api.DemoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
*
* see: http://dubbo.io/User+Guide.htm#UserGuide-APIConfig
*
*/
@Configuration
@ConditionalOnProperty(name = "dubbo.config.enabled")
@EnableConfigurationProperties({DubboConfiguration.DubboProperty.class})
public class DubboConfiguration {
@Autowired
private DemoService demoService;
@Bean
public ApplicationConfig dubboApplication() {
final ApplicationConfig application = new ApplicationConfig();
application.setName(dubboProperty.getApplicationName());
return application;
}
@Bean
public List<RegistryConfig> dubboRegistries() {
List<RegistryConfig> registrConfigs = new ArrayList<RegistryConfig>();
String zkUrls = dubboProperty.getZkUrls();
if (StringUtils.isNotBlank(zkUrls)) {
String[] zkUrlsArr = zkUrls.split(",");
for (String zkUrl : zkUrlsArr) {
RegistryConfig registry = new RegistryConfig();
registry.setAddress(zkUrl);
registry.setProtocol("zookeeper");
registrConfigs.add(registry);
}
}
return registrConfigs;
}
@Bean
public ProtocolConfig dubboProtocol() {
final ProtocolConfig protocol = new ProtocolConfig();
protocol.setName(dubboProperty.getProtocolName());
protocol.setPort(dubboProperty.getProtocolPort());
return protocol;
}
@Bean
public ProviderConfig dubboProvider() {
final ProviderConfig provider = new ProviderConfig();
provider.setProtocol(this.dubboProtocol());
provider.setRetries(dubboProperty.getProviderRetries());
provider.setActives(dubboProperty.getProviderActives());
provider.setAccepts(dubboProperty.getProviderAccepts());
provider.setTimeout(dubboProperty.getProviderTimeout());
provider.setToken(dubboProperty.getProviderToken());
return provider;
}
@Bean
public ServiceConfig<DemoService> dubboDemoSerive() {
final ServiceConfig<DemoService> dubboService = new ServiceConfig<>();// 该类很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
dubboService.setApplication(this.dubboApplication());
dubboService.setRegistries(this.dubboRegistries()); // 多个注册中心可以用setRegistries()
dubboService.setProvider(dubboProvider());
dubboService.setInterface(DemoService.class);
dubboService.setRef(demoService);
dubboService.export();
return dubboService;
}
@ConfigurationProperties(prefix = "dubbo.config", ignoreUnknownFields = true)
static class DubboProperty {
private String applicationName;
private String zkUrls;
private String protocolName;
private int protocolPort;
private String providerProtocol;
private int providerRetries;
private int providerActives;
private int providerAccepts;
private int providerTimeout;
private String providerToken;
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getZkUrls() {
return zkUrls;
}
public void setZkUrls(String zkUrls) {
this.zkUrls = zkUrls;
}
public String getProtocolName() {
return protocolName;
}
public void setProtocolName(String protocolName) {
this.protocolName = protocolName;
}
public int getProtocolPort() {
return protocolPort;
}
public void setProtocolPort(int protocolPort) {
this.protocolPort = protocolPort;
}
public String getProviderProtocol() {
return providerProtocol;
}
public void setProviderProtocol(String providerProtocol) {
this.providerProtocol = providerProtocol;
}
public int getProviderRetries() {
return providerRetries;
}
public void setProviderRetries(int providerRetries) {
this.providerRetries = providerRetries;
}
public int getProviderActives() {
return providerActives;
}
public void setProviderActives(int providerActives) {
this.providerActives = providerActives;
}
public int getProviderAccepts() {
return providerAccepts;
}
public void setProviderAccepts(int providerAccepts) {
this.providerAccepts = providerAccepts;
}
public int getProviderTimeout() {
return providerTimeout;
}
public void setProviderTimeout(int providerTimeout) {
this.providerTimeout = providerTimeout;
}
public String getProviderToken() {
return providerToken;
}
public void setProviderToken(String providerToken) {
this.providerToken = providerToken;
}
}
@Autowired
private DubboProperty dubboProperty;
}