一、Java并发编程
多线程程序包含两个或者多个可以同事运行的部分,每个部分可以同事处理不同的任务,从而能更好的利用可用资源,如果CPU是多核,多线程可以写入多个task,在同一个程序同时进行操作处理。
多任务是多个进程共享,比如CPU处理公共资源
多线程:将多任务的概念扩展到可以将单个应用程序中的特定操作细分为单个线程的应用程序 ,每个线程可以并行运行。
1、线程的生命周期
线程在生命周期中经历多个阶段:线程诞生,启动,运行,然后死亡。
- 新线程New:新线程在新的状态下开始其生命周期,直到程序启动线程为止,保持在这种状态,也叫出生线程。
- 可运行Runnable:新诞生的线程启动以后,start,该线层可以运行,状态的线程被认为正在执行其任务。
- 等待Waiting:有时线程回转换到等待状态sleep,wait(),而线程等待另一个线程执行任务。只有当另一个线程发信号通知notify()/notifyAll()等待线程才能继续执行时,线程才转回到可运行状态。
- 定时等待Timed Waiting:可运行的线程可以在指定的时间间隔内进入定时等待状态,当该时间间隔sleep(100)到期或者发生等待的事件的时候,此状态的线程将转换到可运行状态。
- 终止dead:可执行线程在完成任务或者以其他方式终止的时候进入到终止状态。
2、线程优先级
每个java线程都有一个优先级,可以帮助操作系统安排线程的顺序。Java线程优先级在MIN_PRIORITY(1),和MAX_PRIORITY(10)之间的范围内,默认情况下的,每个线程优先级都是NORM_PRIORITY(5)
具有较高的优先级的线程相对于一个程序来说更重要,应该在低优先级线程之前分配处理器时间。然而,线程优先级并不能呢保证线程执行的顺序。
3、通过实现Runnable接口创建线程
需要实现Runnable接口提供的run()方法。run()方法为线程提供一个入口,可以把完整的业务逻辑放到run()方法体。此方法是没有返回值的
1
2
3public void run(){
...service....
}然后在通过Thread构造函数,去创建一个对象
对象调用start()方法来启动线程。
1 | package multi_thread; |
4、通过继承Thread类创建一个线程
5、线程池的使用
1 | public static void main(String[] args) { |
二、Dubbo的知识点
dubbo是一款高性能,轻量级的开源java RPC框架,提供3大核心功能:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 服务自动注册和发现
dubbo是一个分布式服务框架,用来提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理。
1、什么是RPC?
RPC:Remote Procedure Call,一个远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如说两个不同的服务A,B部署在两台不同的机器上,那么服务A如果想要调用服务B中的某个方法怎么解决?使用HTTP请求当然可以,但是可能会比较慢,而且一些优化做的并不好,RPC的出现就是为了解决这个问题。
RPC的原理:
- 服务消费方client调用以本地调用方式调用服务
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体。
- client stub找到服务地址,并将消息发送到服务端
- server stub收到消息后进行解码
- server stub根据解码结果调用本地的服务
- 本地服务执行并结果返回给server stub
- server stub将返回结果打包成消息并发送到消费方
- client stub接收到消息,并进行解码
- 服务消费方得到最终结果。
2、为什么要用dubbo?
dubbo和SOA分布式架构的流行有着关系。SOA面向服务的架构(Service Oriented Architecture),就是把工程按照业务逻辑拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务就行。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。SOA架构中有两个主要角色:服务提供者Provieder和服务使用者Consumer
3、开发分布式及程序,可以直接基于HTTP接口进行通信,但是为什么要使用dubbo?
dubbo的四个特点:
- 负载均衡:同一个服务部署在不同的机器时该调用哪一台机器上的服务
- 服务调用链路生成:随着系统的发展,服务越来越多,服务间依赖关系变得错综复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系,dubbo可以为我们解决服务之间是如何互相调用的。
- 服务访问压力以及时长统计,资源调度和治理:基于访问压力实时管理集群容量,提供集群利用率。
- 服务降级:某个服务挂掉之后调用备用服务。
dubbo除了用在分布式系统中,也可以应用在微服务系统中,但是由于springboot cloud在微服务中更加广泛,所以一般提dubbo大部分在分布式系统的情况。
4、什么是分布式?
分布式或者说SOA分布式重要的就是面向服务,说简单的分布式就是我们把整个系统拆分成不同的服务然后将这些服务放在不同的服务器上减轻单体服务的压力提高并发量和性能。比如电商系统可以简单拆分成订单系统,商品系统,登录系统等,拆分之后的每个服务可以部署在不同的机器上,如果某一个服务的访问量比较大的话也可以将这个服务同时部署在多台机器上。
5、为什么要分布式?
从开发角度来讲单体应用的代码都集中在一起,而分布式系统的代码根据业务被拆分。所以每个团队可以负责一个服务的开发,这样提升了开发效率。另外,代码根据业务拆分之后更加便于维护和扩展。
另外,将系统拆分成分布式之后不光便于系统扩展和维护,更能提高整个系统的性能。把整个系统拆分成不同的服务、系统,然后每个服务,系统单独部署在一台服务器上,是不是很大成都提升了系统性能。
6、dubbo的架构
- Provider:暴露服务的服务提供方
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务运行容器
6.1、调用关系说明:
Container服务容器负责启动,加载,运行服务提供者Provider。
服务提供者Provider在启动的是偶,向注册中心Registry注册自己提供的服务
服务消费者Consumer在启动的时候,向注册中心Registry订阅自己所需要的服务
注册中心Registry返回服务提供者Provider地址列表给消费者Consumer,如果有变更,注册中心Registry将基于长连接keep-alive推送变更数据给消费者Consumer
服务消费者Consumer,从服务提供者Provider地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- dubbo提供了4中负载均衡算法:
- 权重随机算法:RandomLoadBalance
- 最少活跃调用数算法:LeastActiveLoadBalance
- 一致性哈希算法:ConsistentHashLoadBalance
- 加权轮询算法:RoundRobinLoadBalance
- dubbo提供了4中负载均衡算法:
服务消费者Consumer和服务提供这Provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor。
6.2、总结:
- 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者Provider和服务消费者Consumer只在启动的时候与注册中心Registry交互,注册中心不转发请求,压力小。
- 监控中心Monitor负责统计各个服务调动次数,调用时间等,统计现在内存汇总后每分钟一次发送到监控中心服务器,并以报表的形式显示。
- 注册中心Registry,服务提供这Provider,服务消费者Consumer三者之间均为长连接Keep-alive,监控中心Monitor除外
- 注册中心Registry通过长连接感知服务提供者Provider的存在,服务提供者挂了,注册中心立即将推送事件通知消费者Consumer。
- 注册中心和监控中心全部挂了,不影响已经运行的服务提供者Provider和Consumer,消费者在本地缓存了提供者列表。
- 注册中心和监控中心都是可选的,服务消费者Consumer可以直接连服务提供者Provider
- 服务提供者Provider无状态,任意一台挂掉,不影响使用。
- 服务提供者Provider全部挂了,服务消费者Consumer应用将无法使用,并无限次重连等待服务提供者恢复。
6.3、Zookeeper挂了与dubbo直连的情况
在实际生产中,如果zookeeper注册中心挂了,一段时间内服务消费者Consumer还是能够调用服务提供者Provider服务的,实际上Consumer使用了本地缓存进行通讯,Consumer本地缓存了提供者列表。
dubbo的健壮性:
- 监控中心挂了不影响使用
- 本文作者: Victor Dan
- 本文链接: https://anonymousdq.github.io/victor.github.io/2019/11/01/一、Java并发编程/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!