dubbo3高级特性「框架与服务」服务端通过线程池隔离技术实现资源限制和资源隔离机制(代码片段)

洛神灬殇 洛神灬殇     2022-12-14     512

关键词:

线程池隔离

Dubbo3会提供一种新的线程池管理方式,用于隔离服务之间的线程池调用机制,主要用于服务提供者端进行实现服务资源隔离和容器隔离机制,最终的效果就是服务提供者内部的各个服务通过线程池隔离且互相独立,任何一个服务的线程池资源耗尽都不会影响其他正常服务,支持线程池可配置化,由用户手动指定。

使用场景

针对于指定服务会出现IO时间过长或者资源消耗时间过长的问题,因此可以实现独立处理功能服务而不会影响其他服务运行的执行,例如一些比较考虑客户体验度的场景服务以及比较注重响应时长的工作问题。

使用方式(服务端)

原始API配置方式

采用Dubbo服务容器进行启动JVM容器
        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
建立ApplicationConfig设置参数
  • ApplicationConfig新增String executor-management-mode参数,配置值为 default 和 isolation ,默认为 default。
    • executor-management-mode = default 使用原有以协议端口为粒度、服务间共享的线程池管理方式
    • executor-management-mode = isolation 使用新增的以服务三元组为粒度、服务间隔离的线程池管理方式
        // It takes effect only if [executor-management-mode=isolation] is configured
        ApplicationConfig applicationConfig = new ApplicationConfig("provider-app");
        applicationConfig.setExecutorManagementMode("isolation");
ServiceConfig配置选项
  • ServiceConfig新增Executor executor 参数,用以服务间隔离的线程池,可以由用户配置化、提供自己想要的线程池,若没有指定,则会根据协议配置(ProtocolConfig)信息构建默认的线程池用以服务隔离。ServiceConfig 新增 Executor executor 配置参数只有指定executor-management-mode = isolation 才生效。
        ServiceConfig serviceConfig1 = new ServiceConfig();
        serviceConfig1.setInterface(APIService.class);
        serviceConfig1.setRef(new DefaultAPIService());
        serviceConfig1.setVersion("1.0.0");
ServiceConfig设置对应的线程池
        NamedThreadFactory threadFactory1 = new NamedThreadFactory("testService-executor");
        ExecutorService executor1 = Executors.newFixedThreadPool(10, threadFactory1);
        serviceConfig1.setExecutor(executor1);
启动整个Dubbo容器机制暴漏服务端接口
        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();

XML配置方式

配置应用服务Application层级配置
  • executor-management-mode = default 使用原有以协议端口为粒度、服务间共享的线程池管理方式
  • executor-management-mode = isolation 使用新增的以服务三元组为粒度、服务间隔离的线程池管理方式
  <dubbo:application name="application-provider" executor-management-mode="isolation">
  </dubbo:application>

配置dubbo的三中心

配置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"/>
设置多协议-tri和dubbo
  <dubbo:protocol name="dubbo" port="-1"/>
  <dubbo:protocol name="tri" port="-1"/>
设置对应的接口给dubbo协议和tri协议
  <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"/>

JavaConfig的配置方式

@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.config.spring.isolation.spring.annotation.provider")

注册Bean的RegistryConfig
 @Bean
    public RegistryConfig registryConfig() 
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        return registryConfig;
    
注册Bean的ApplicationConfig
    // NOTE: we need config executor-management-mode="isolation"
    @Bean
    public ApplicationConfig applicationConfig() 
        ApplicationConfig applicationConfig = new ApplicationConfig("provider-app");
        applicationConfig.setExecutorManagementMode("isolation");
        return applicationConfig;
    
注册Bean的ProtocolConfig多协议
   // 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";
  
通过yml文件的配置模型
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模式保持一致即可。

dubbo3高级特性「框架与服务」dubbo3客户端和服务端的泛化调用机制体系(代码片段)

实现泛化实现(服务端泛化)服务端泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务框架,可通过实现RawTypeService接口... 查看详情

dubbo3高级特性「框架与服务」框架与服务的异步调用实践以及开发模式

异步调用在Dubbo中发起异步调用机制,从而提高对应的服务的调用的吞吐能力和调用机制特性说明技术背景从2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础,基于NIO的非阻塞实现并行调用,客户端不需要启动多线... 查看详情

dubbo3高级特性「框架与服务」服务分组及服务分组聚合实现(代码片段)

【Dubbo3高级特性】「框架与服务」Nacos作为注册中心-服务分组及服务分组聚合实现NACOS注册中心properties文件dubbo.application.name=nacos-registry-demo-consumerdubbo.registry.address=nacos://$nacos.address:localhost:8848?username=nacos&pass 查看详情

dubbo3高级特性「框架与服务」在dubbo3中进行参数校验及自定义验证扩展机制(代码片段)

Dubbo3的参数验证机制参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证annotation,并通过声明filter来实现验证。JSR303https://jcp.org/en/jsr/detail?id=303Maven依赖<dependency><groupId>javax.validation</groupId><artif 查看详情

dubbo3高级特性「框架与服务」自定义dubbo服务容器及扩展容器实现分析

了解Dubbo3中服务自定义容器类型和使用背景介绍Dubbo3的服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源。所以服务通常不需要... 查看详情

dubbo3高级特性「框架与服务」针对出现异常的rpc的服务功能降级机制(代码片段)

服务降级降级Dubbo服务特性说明推荐使用相关限流降级组件(如Sentinel)以达到最佳体验,微服务治理/限流降级服务降级是指服务在非正常情况下进行降级应急处理。使用场景某服务或接口负荷超出最大承载能力范围,需要进行... 查看详情

dubbo3高级特性「系统级别检查」服务端和消费端启动时检查

...有些服务不关心,必须有一方先启动,或者针对于相关的dubbo3所对应的微服务利链路种形成了环路依赖或者相互引用关系。注意:如果你的Sprin 查看详情

dubbo3高级特性「框架与服务」开发内嵌式注册中心及多注册中心的开发实践(代码片段)

开发内嵌式注册中心引入Maven依赖<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId> 查看详情

dubbo3高级特性「框架与服务」rpc全链路调用追踪参数传递(opentracing)

...在B调C之后,RpcContext记录的是B和C的信息。上下文的种类Dubbo3中,RpcContext被拆分为四大模块(ServerContext、ClientAttachment、ServerAttachment和ServiceContext),它们分别承担了不同的指责:ServiceContext&#x 查看详情

dubbo3高级特性「框架与服务」rpc调用上下文的介绍(全链路追踪基础)(代码片段)

使用场景通过上下文(Context)存放当前调用过程中所需的环境信息。特性说明上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为URL的参数,参见schema配置参考手册中的对应URL参数一列。RpcContext是一个T... 查看详情

dubbo3高级特性「提升系统安全性」ssl的安全服务能力(代码片段)

Dubbo3的TLS保证传输安全特性说明内置的DubboNettyServer和新引入的gRPC协议都提供了基于TLS的安全链路传输机制。TLS的配置都有统一的入口。使用场景对全链路有加密需求的用户可以使用TLS。使用方式API的模式使用方式Provider端建立... 查看详情

dubbo3中服务端线程模型,线程处理(基于dubbo3)(代码片段)

...启动流程的源码分析dubbo服务端启动源码分析(基于Dubbo3),我们知道默认的Dubbo协议底层是基于Netty的,之前我们分析Netty相关线程模型的时候Netty中线程处理-NioEventLoopGroup,NioEventLoop也了解到Netty是有自己的线程处... 查看详情

稳定性耗时监控原因分析--dubborpc框架的线程池,io连接模型.客户端,服务端

上次提到的Nagle算法特性有可能是dubbo调用”网络耗时高“的始作俑者,后来又仔细看了下dubbo的代码,发现dubbo在consumer端已经将tcp设置成非延迟(即关闭Nagle特性)了,代码片段如下: order模块中调用量最高的接口是... 查看详情

介绍说明」dubbo3新特性概览的介绍说明

Dubbo3的微服务框架系列​​【Dubbo3入门到精通】总体技术体系介绍及技术指南(目录)​​本系列专题是关于Dubbo的简单介绍,涵盖Dubbo的核心概念、基本使用方式以及Dubbo3核心功能。Dubbo的基本介绍ApacheDubbo是一款微服务开发框... 查看详情

深入浅出dubbo3原理及实战「新特性简介」dubbo3新特性概览的介绍说明

Dubbo3的微服务框架系列本系列专题是关于Dubbo的简单介绍,涵盖Dubbo的核心概念、基本使用方式以及Dubbo3核心功能。Dubbo的基本介绍ApacheDubbo是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。使用Dubbo开... 查看详情

dubbo3.0|阿里巴巴服务框架三位一体的选择与实践

...一,合二为一并共建新一代的服务框架是必然趋势。Dubbo3.0是Dubbo2.0与HSF融合而来,是阿里经济体面向内部业务、商业化、开源的唯一标准服务框架。服务框架就像铁路的铁轨 查看详情

dubbo3.0|阿里巴巴服务框架三位一体的选择与实践

...一,合二为一并共建新一代的服务框架是必然趋势。Dubbo3.0是Dubbo2.0与HSF融合而来,是阿里经济体面向内部业务、商业化、开源的唯一标准服务框架。服务框架就像铁路的铁轨一 查看详情

线程池

1.线程池基本原理 在传统服务器结构中,常是有一个总的监听线程监听有没有新的用户连接服务器,每当有一个新的用户进入,服务器就开启一个新的线程用户处理这个用户的数据包。这个线程只服务于这个用户,当用户与服务器... 查看详情