作者归档

Dubbo剖析-线程模型

一、前言

Dubbo默认的底层网络通讯是使用Netty来做的,在服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客户端的链接请求,并把接受的请求分发给EventLoopGroup(worker)来处理,boss和worker线程组我们称为IO线程。

如果服务提供方的逻辑能迅速完成,并且不会发起新的 IO 请求,则直接在 IO 线程上处理更快,因为这减少了线程池调度。

但如果处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到新线程池,否则 IO 线程阻塞,将导致不能接收其它请求。

阅读全文

使用Spring框架实现远程服务暴露与调用

一、前言

Spring框架提供了通过HTTP协议实现远程调用的方式,具体是调用方使用HttpInvokerProxyFactoryBean生成一个代理对象,通过代理对象远程通过http服务调用服务提供方法的服务,服务提供方则通过HttpInvokerServiceExporter在服务端暴漏远程调用接口。 阅读全文

Dubbo剖析-服务消费方Invoker到客户端接口的转换

一、前言

前面dubbo整体架构分析里面我们讲解了服务消费者消费一个服务的详细过程是,首先 调用 Protocol 的 refer 方法生成 Invoker 实例,接下来把Invoker 转换为客户端需要的接口(如:UserServiceBo),本文来讲解第二个环节的实现 阅读全文

Dubbo剖析-监控平台的搭建与使用

一、前言

dubbo-monitor主要用来统计服务的调用次调和调用时间的监控中心,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心,监控中心则使用数据绘制图表来显示。 阅读全文

Dubbo剖析-整体架构分析

一、前言

工欲善其事,必先利其器,前面通过几篇文章简单的介绍了如何使用Dubbo搭建一个简单的分布式系统,在接下来的的一段时间就来研究Dubbo原理设计,本文作为原理设计的开篇先整体介绍下dubbo的架构。 阅读全文

Dubbo剖析-搭建一个简单的分布式系统(2)

一、前言

前面时间基于Spring的xml配置的方式搭建了一个简单的包含服务提供(Provider),服务注册中心(Registry),服务消费(Consumer)的分布式系统。本节我们不使用Spring配置方式,使用DUBBO提供的API来做。 阅读全文

Dubbo剖析-搭建一个简单的分布式系统(1)

一、前言

随着阿里巴巴开源的分布式RPC框架Dubbo成为Apache开源卵化器项目,Dubbo有火了一把。在接下来的一段时间本公众号将会时不时的发布一些dubbo使用与原理剖析的文章。

image.png

dubbo架构如上图,本文作为一个开始先讲讲使用dubbo搭建一个简单的含有服务提供(Provider),服务注册中心(Registry),服务消费(Consumer)的分布式系统。 阅读全文

创建线程以及线程池时候要指定与业务相关的名字,以便于追溯问题

3.9 创建线程以及线程池时候要指定与业务相关的名字,以便于追溯问题

日常开发中当一个应用中需要创建多个线程或者线程池时候最好给每个线程或者线程池根据业务类型设置具体的名字,以便在出现问题时候方便进行定位,下面就通过实例来说明不设置时候为何难以定位问题,以及如何进行设置。

阅读全文

一个有关定时生产与消费的问题

一、前言

本文来讲解遇到的一个有意思的与定时器相关的生产消费模型,模型如下图:

 

  • 生产者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔3s投递一个元素到队列1,2,3(使用offer方法)。比如第1s放入一个元素到队列1,2,3,这时候每个队列里面有一个元素。然后第4s在放入一个元素到队列1,2,3,如果没有消费线程的时候这时候每个队列里面有2个元素.
  • 队列为有界阻塞队列(ArrayBlockingQueue),队列元素的大小设置为6个元素。
  • 消费者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔1s轮询取出每个队列里面全部元素(使用poll方法)。比如第1s取出队列1里面的全部元素,第2s取出队列2里面的元素,第3s取出队列3里面的元素,第4s取出队列1里面的元素….
    并且如果发现当前队列为空则会结束当前s的任务,然后等下1s到了的时候从下一个队列开始取。
  • 消费线程启动后,生产线程才启动,生产者和消费者线程优先级相同
  • 消费线程和生产线程里面没有耗时操作,或者耗时都不超过1s。这个保证定时器任务不会被延迟执行。

问题:每个队列里面最多时候会有几个元素?

阅读全文

Springboot之spring-boot模块

一、前言

spring-boot模块提供了一些特性用来支持springboot中其他模块,这些特性包含如下:

  • SpringApplication类提供了静态方法以便于写一个独立了spring应用程序,该类的主要职责是create和refresh一个合适的Spring 应用程序上下文(ApplicationContext)
  • 一流的外部配置的支持(application.properties)
  • 提供了便捷的应用程序上下文(ApplicationContext)的初始化器,以便在ApplicationContext使用前对其进行用户定制。
  • 给web应用提供了一个可选的web容器(目前有Tomcat或Jetty)

阅读全文

Springboot之spring-boot-autoconfigure模块

一、前言

Spring的出现给我们管理bean的依赖注入提供了便捷,但是当我们需要使用通过pom引入的jar里面的一个bean时候,还是需要手动在xml配置文件里面主要注入的bean 。springboot则可以依据classpath里面的依赖内容来自动配置bean到IOC容器,Auto-configuration会尝试推断哪些beans是用户可能会需要的。比如如果HSQLDB包在当前classpath下,并且用户并没有配置其他数据库链接,这时候Auto-configuration功能会自动注入一个基于内存的数据库连接到应用的IOC容器。但是要开启这个自动配置功能需要添加@EnableAutoConfiguration注解。

阅读全文

SpringBoot之spring-boot-load模块

一、前言

正常情况下classloader只能找到jar里面当前目录或者文件类里面的*.class文件。为了能够加载嵌套jar里面的资源之前都是把嵌套jar里面的class文件和应用的class文件打包为一个jar,这样就不存在嵌套jar了,但是这样做就不能很清晰的知道应用到底依赖了哪些东西,哪些是应用自己的,另外多个jar里面的class可能内容不一样但是文件名却一样。springboot中spring-boot-loader就是为优雅解决这个问题而诞生的。

阅读全文

Springboot模块组成

1.1、 spring-boot模块

该模块提供了一些特性用来支持springboot中其他模块,这些特性包含如下。

  • SpringApplication类提供了静态方法以便于写一个独立了spring应用程序,该类的主要职责是create和refresh一个合适的Spring 应用程序上下文(ApplicationContext)
  • 给web应用提供了一个可选的web容器(目前有Tomcat或Jetty)
  • 一流的外部配置的支持(application.properties)
  • 提供了便捷的应用程序上下文(ApplicationContext)的初始化器,以便在ApplicationContext使用前对其进行用户定制。

阅读全文

使用ThreadLocal不当可能会导致内存泄露

8.2 使用ThreadLocal不当可能会导致内存泄露

基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存泄露的案例。 阅读全文

SpringBoot之logback-spring.xml不生效

一、前言

做新应用就是这样,会遇到各种问题,昨天刚解决了加载某一个类时候抛出了class is not visible from class loader的问题,今天就有遇到了日志文件找不到的问题,还是和二方库有关的,下面就一一道来。 阅读全文

return top