Dubbo3会提供一种新的线程池管理方式,用于隔离服务之间的线程池调用机制,主要用于服务提供者端进行实现服务资源隔离和容器隔离机制,最终的效果就是服务提供者内部的各个服务通过线程池隔离且互相独立,任何一个服务的线程池资源耗尽都不会影响其他正常服务,支持线程池可配置化,由用户手动指定。
针对于指定服务会出现IO时间过长或者资源消耗时间过长的问题,因此可以实现独立处理功能服务而不会影响其他服务运行的执行,例如一些比较考虑客户体验度的场景服务以及比较注重响应时长的工作问题。
DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
// It takes effect only if [executor-management-mode=isolation] is configured
ApplicationConfig applicationConfig = new ApplicationConfig("provider-app");
applicationConfig.setExecutorManagementMode("isolation");
ServiceConfig serviceConfig1 = new ServiceConfig();
serviceConfig1.setInterface(APIService.class);
serviceConfig1.setRef(new DefaultAPIService());
serviceConfig1.setVersion("1.0.0");
NamedThreadFactory threadFactory1 = new NamedThreadFactory("testService-executor");
ExecutorService executor1 = Executors.newFixedThreadPool(10, threadFactory1);
serviceConfig1.setExecutor(executor1);
providerBootstrap
.application(applicationConfig)
.registry(registryConfig)
// export with tri and dubbo protocol
.protocol(new ProtocolConfig("tri", 20001))
.protocol(new ProtocolConfig("dubbo", 20002))
.service(serviceConfig)
providerBootstrap.start();
<dubbo:application name="application-provider" executor-management-mode="isolation">
dubbo:application>
配置dubbo的三中心体系:注册中心、元数据中心、配置中心,同时都将zookeeper作为实例、此外还可以采用nacos的方式进行注册部署。
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
<dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
<dubbo:registry id="registry1" address="zookeeper://127.0.0.1:2181?registry-type=service"/>
<dubbo:protocol name="dubbo" port="-1"/>
<dubbo:protocol name="tri" port="-1"/>
<bean id="apiService" class="org.apache.dubbo.config.spring.impl.ApiServiceImpl"/>
<bean id="executor-task-service"
class="org.apache.dubbo.config.spring.isolation.spring.support.CustomerTaskExecutor"/>
<!-- this service use [executor="executor-task-service"] as isolated thread pool-->
<dubbo:service executor="executor-task-service"
interface="org.apache.dubbo.config.spring.api.ApiService" version="1.0.0" group="Group1"
timeout="3000" ref="apiService" registry="registry1" protocol="dubbo,tri"/>
@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.config.spring.isolation.spring.annotation.provider")
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
return registryConfig;
}
// NOTE: we need config executor-management-mode="isolation"
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig("provider-app");
applicationConfig.setExecutorManagementMode("isolation");
return applicationConfig;
}
// expose services with dubbo protocol
@Bean
public ProtocolConfig dubbo() {
ProtocolConfig protocolConfig = new ProtocolConfig("dubbo");
return protocolConfig;
}
// expose services with tri protocol
@Bean
public ProtocolConfig tri() {
ProtocolConfig protocolConfig = new ProtocolConfig("tri");
return protocolConfig;
}
// customized thread pool
@Bean("executor-task-service")
public Executor customerServiceExecutor() {
return new CustomerServiceExecutor();
}
}
// customized thread pool
public class CustomerServiceExecutor extends ThreadPoolExecutor {
public CustomerServiceExecutorextends () {
super(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(),
new NamedThreadFactory("CustomerServiceExecutor "));
}
}
// "executor-task-service" is beanName
@DubboService(executor = "executor-task-service", version = "1.0.0", group = "Group1")
public class DefaultApiService implements ApiService {
@Override
public String sayName(String name) {
return "server name";
}
dubbo:
application:
name: provider-app
executor-management-mode: isolation
registry:
id: ${spring.application.name}_registry01
address: zookeeper://${zookeeper.address:localhost}:2181?client=curator
protocol:
name: dubbo
port: 28081
dispatcher: all
threadpool: fixed
protocol:
name: tri
port: 28082
dispatcher: all
threadpool: fixed
provider:
retries: 0 # 服务提供者无需重试
timeout: 6000 # 默认只有1s
其他的方式与JavaConfig模式保持一致即可。