精华内容
下载资源
问答
  • 本文的目标是研制一个轮式小车惯性导航系统,能够通过wifi实现PC终端和手持...  1 总体架构  硬件设计上,主要分为板和驱动板。板包括DSP系统,JTAG口设计,系统电源供给电路和MEMS传感器,WIFI模块等。而
  • aws iam 架构图 在开发新产品并发现合适的产品市场时,每个团队都需要快速行动。 尤其是初创公司,因为公司的整个未来都取决于快速找到为您的产品付款的人。 对于初创企业和其他团队来说, Amazon Web Services是...

    aws iam 架构图

    在开发新产品并发现合适的产品市场时,每个团队都需要快速行动。 尤其是初创公司,因为公司的整个未来都取决于快速找到为您的产品付款的人。

    对于初创企业和其他团队来说, Amazon Web Services是令人难以置信的工具,可以快速构建其应用程序和基础架构。 这些团队通常具有比适当的系统操作更强大的开发背景。

    AWS提供了出色的工具来处理密钥,身份验证和安全性,但是由于经常出现更紧迫的问题,许多团队并未对此进行研究。

    我们想介绍一些概念和功能,这些功能将帮助您以最小的努力提高基础架构的安全性。

    身份和访问管理(IAM),AWS安全的核心

    IAM(身份和访问管理)是AWS安全系统的核心。 它使您可以管理基础架构中的用户,组和不同角色。 您可以创建具有不同权限的不同功能组,并将人员添加到这些组中。 这样,一旦人们移入其他组并且不再需要访问系统的每个部分,就可以轻松更改权限。

    您可以将多个策略附加到用户,组或角色,以涵盖对不同AWS服务或不同资源的访问。

    IAM文档易于阅读,并且浏览一遍绝对很有趣。 它以HTML,PDF或Kindle的形式提供,因此您甚至可以在上下班途中阅读。

    不要使用提供给您的AWS账户的默认密钥

    您可以对AWS采取的第一个也是最重要的措施是不使用提供给您的AWS账户的默认密钥。 该密钥具有对每个系统的完全访问权限。 这是一个主要的安全问题,因为泄露此密钥将意味着您使其他人可以访问基础结构的每个部分。 此外,随着时间的流逝,很难确定在基础架构中使用密钥的位置,因此,一旦要更改密钥,就必须在没有任何指针的情况下搜索所有基础架构。

    为应用程序的不同用途创建用户或组可以使该部分进行自我记录,因此,每当要更改密钥时,您都知道基础结构的哪一部分。

    为每个人创建一个用户帐户

    第一步,不建议登录到主要AWS账户。 团队中需要访问AWS的每个人都应该使用不同的凭据获得自己的帐户。 通过将这些用户添加到特定的组,您可以轻松添加或删除权限,而不会丢失谁可以执行的操作。 不要对特定用户设置权限,而是为该权限创建一个组,因为它是自我记录,可以为每个人更改。 在下图中,我们为管理员,财务和API访问创建了不同的组。

    IAM示例组

    我们财务组中的用户只能访问我们的帐单。 即使万一他们的帐户被盗,也无法访问任何基础架构。

    保护用户帐户的第二个重要步骤是对所有用户帐户启用两因素身份验证。 登录到系统并有权访问重要资源的每个人都需要启用两个因素。 作为管理员,您可以检查IAM的用户详细信息页面中是否启用了两个因素。 您可以立即为团队中的每个新员工启用此功能。

    例如,以下用户未启用两个因素。 通过添加它并按照向导进行操作,可以大大提高安全性。

    IAM-2因子

    对具有指定功能的角色使用多个键

    如前所述,您永远不要使用您的AWS账户的主密钥访问API。 这并不意味着只创建一个管理员用户并在任何地方使用此密钥。

    用户,组和角色应仅具有完成一项特定任务所需的特定权限。 不要混在一起。 也许您将来希望将任务放置到另一台服务器上。 如果您组合了权限,则必须将其分成不同的组或角色。 您确实应该将这些与开始隔离开来。

    不要在EC2实例中使用密钥

    IAM的一个鲜为人知的功能是角色以及如何将其连接到基础结构的不同部分。 例如,如果您拥有应能够读取数据或将数据上传到S3的应用服务器。 过去,您可能已将AWS机密和访问密钥添加到计算机中,因此它可以使用它们来访问S3。

    相反,您可以创建一个角色,该角色包括上载到特定S3存储桶的权限,并将EC2实例设置为使用此角色。 如果您将AWS开发工具包的不同语言使用,它们将自动生成具有与角色中定义的相同权限的临时密钥。

    在IAM中创建角色

    首先,您需要在IAM for EC2中创建一个新角色。 您可以为Opsworks等不同的服务创建角色,这些角色可以为您调用AWS API。

    然后创建一个策略,让您访问特定的S3存储桶

    IAM策略

    将以下策略导入向导:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1385708770000",
          "Effect": "Allow",
          "Action": [
            "s3:Get*",
            "s3:List*",
            "s3:DeleteObject",
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:PutObjectVersionAcl"
          ],
          "Resource": [
            "arn:aws:s3:::testbucket/*",
            "arn:aws:s3:::testbucket"
          ]
        }
      ]
    }

    这将只允许对testbucket进行读写访问,而不能访问其他S3存储桶。 您可以在IAM文档中阅读有关政策的更多信息。 您可以将策略限制为具有ARN,Amazon资源名称的特定实例,存储桶或其他基础结构项目,就像我们在上述示例中对testbucket所做的那样。 AWS拥​​有有关ARN的大量文档

    现在,我们要将角色连接到EC2实例。 每当您启动一个新实例时,都将该实例的IAM角色设置为我们刚刚创建的角色。

    在这里,我们将角色设置为checkbot

    IAM检查机器人

    现在,无论何时调用AWS API,您都不必提供任何密钥,因为它们将自动为您创建具有正确权限的密钥。 从现在开始,实例内部不再需要任何键,这使整个设置更加简洁且易于使用。

    启用Cloudtrail

    Cloudtrail是一项新服务,于去年11月在AWS:reInvent上发布。 它将自动将对AWS API的每次调用记录到S3存储桶中。 这可以帮助将来进行审核。

    只需单击几下即可完成不到30秒的设置,几乎不需要花什么钱(您只需为S3存储桶付费,而无需为Cloudtrail付费),并可以在将来为您省钱。 去做就对了!

    结论

    AWS是一个非常庞大和复杂的系统,但提供了轻松的第一步来实现您的产品和安全性。 您可以遵循一些步骤和实践来大量提高安全性,而无需付出太多努力。 当然,从长远来看,您需要投资于安全性,并且从阅读IAM文档开始是一个好的开始。

    作为初创公司,我们希望快速发展,制造产品并交付给我们的客户。 所有这些对于启动公司来说都是必要且重要的。 通过一些简单的修补程序,您可以尽早提高安全性,从而不会由于可预防的原因而泄漏客户数据。

    船长而繁荣!

    更多信息

    参考:来自Codeship Blog博客的JCG合作伙伴 Florian Motlik 使用IAM保护您的AWS基础设施

    翻译自: https://www.javacodegeeks.com/2014/03/securing-your-aws-infrastructure-with-iam.html

    aws iam 架构图

    展开全文
  • 1.3 DevOps视角 一个重大的呼吁是缩短新功能推向市场的时间,减少部署过程中发生的错误,考虑到我们讨论的问题并且这些问题都存在已久,这种呼吁也就...1-1显示了各种生命周期过程。从构建、测试到执行的步骤...

    1.3 DevOps视角


    一个重大的呼吁是缩短新功能推向市场的时间,减少部署过程中发生的错误,考虑到我们讨论的问题并且这些问题都存在已久,这种呼吁也就不足为奇了。DevOps有很多形式,是对现有实践不同程度的改编,但是各种不同形式都始终贯穿着两个主题:自动化及开发团队的职责。

    1.3.1 自动化

    图1-1显示了各种生命周期过程。从构建、测试到执行的步骤在某种程度上都可以实现自动化。我们将在适当的章节中讨论这些步骤中的每一步使用的工具,这里首先强调自动化的优点。在1.7节中讨论依赖于自动化的一些问题。

    工具可以执行这个过程中每一步所需的操作,针对生产环境或者一些外部规格说明检查操作的有效性,把过程中发生的错误通知适当的人,并且保留操作历史,以用于质量控制、报告和审计等目的。

    工具和脚本也可以强制推行组织层面的策略。假设组织有一项策略是,每个变更都要有与之相关的合理理由。那么在提交变更前,工具或脚本可以要求做变更的人提供理由。当然这个要求也可能被设法规避,但是让工具要求一个理由,将会增加对这个策略的符合度。

    在工具成为一组过程的中心后,就必须对这些工具的使用进行管理。比如说,工具可以从脚本、配置变更或运维的终端调用。如果是复杂的终端命令,即使使用的只是几个命令,也建议把命令的使用脚本化。工具可以通过规格说明文件进行控制,例如Chef cookbooks或Amazon CloudFormation——今后还会有更多。脚本、配置文件和规格说明文件必须遵从与应用程序代码本身一样的质量控制。脚本和文件也应该进行版本控制,也应该进行错误检查。这个术语常常称为“基础设施即代码”(infrastructure-as-code)。

    1.3.2 开发团队的职责

    自动化将减少错误的发生,缩短部署时间。为了进一步缩短部署时间,考虑前面详细描述的运维人员的职责。如果开发团队接受DevOps的职责,即开发团队交付、支持并维护服务,那么因为所有所需的知识都保留在开发团队,所以向运维团队和支持人员转交知识也就少了。不需要转移知识也就省掉了部署过程中的大量协作步骤。

    展开全文
  • 在本教程中,我们将介绍这项评估的关键阶段,帮助您评估您的企业在此旅程中的位置,分析您可能想要采取哪些行动来让您的集成架构朝着或超越API公开的方向发展。首先,让我们简要介绍一下业务功能公开的历史,然后更...
  • 谈起微服务架构,我想问, 什么是微服务?你的理解呢? 简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗...

    谈起微服务架构,我想问, 什么是微服务?你的理解呢?

    简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗群才是主要军事力量,你可以把单艘航母理解为的单体应用(防御差,机动性不好),把航母战斗群(调度复杂,维护费用高)理解为微服务。

    大部分的开发者经历和开发过单体应用,无论是传统的 Servlet + JSP,还是 SSM,还是现在的 SpringBoot,它们都是单体应用,那么长期陪伴我们的单体应用有什么弊端?我们是面临了什么问题,导致我们要抛弃单体应用转向微服务架构?个人总结主要问题如下:

    • 部署成本高(无论是修改1行代码,还是10行代码,都要全量替换)
    • 改动影响大,风险高(不论代码改动多小,成本都相同)
    • 因为成本高,风险高,所以导致部署频率低(无法快速交付客户需求)

    不了解,得不到精髓没得关系,今天咱来鉴赏一下全网疯传的[SpringCloud+SpringCloud Alibaba]微服务架构秘籍...

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

     

    事先声明:关于以下小编所介绍的SpringCloud Alibaba笔记+SpringCloud微服务架构笔记(一)(二)(三)(四)等这5份微服务架构笔记,原版文件都有整理,需要的朋友可免费分享给你

    微服务架构秘籍:SpringCloud Alibaba

    第一 章 微服务介绍

    • 1.1 系统架构演变
    • 1.2 微服务架构介绍
    • 1.3 SpringCloud Alibaba介绍

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第一 章 微服务介绍

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第一 章 微服务介绍

    第二章 微服务环境搭建

    • 2.1 案例准备
    • 2.2 创建父工程
    • 2.3 创建基础模块
    • 2.4 创建用户微服务
    • 2.5 创建商品微服务
    • 2.6 创建订单微服务

    第三章 Nacos Discovey-服务治理

    • 3.1 服务治理介绍
    • 3.2 nacos简介
    • 3.3 nacos实战入门
    • 3.4 实现服务调用的负载均衡
    • 3.5 基于Feign实现服务调用

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第三章 Nacos Discovey-服务治理

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第三章 Nacos Discovey-服务治理

    第四章 Sentinel--服务容错

    • 4.1 高并发带来的问题
    • 4.2 服务雪崩效应
    • 4.3 常见容错方案
    • 4.4 Sentinel入门
    • 4.5 Sentinel的概念和功能
    • 4.6 Sentinel规则
    • 4.7 @SentinelResource的使用
    • 4.8 Sentine|规则持久化
    • 4.9 Feign整合Sentinel

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第四章 Sentinel--服务容错

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第四章 Sentinel--服务容错

    第五章 Gateway--服务网关

    • 5.1 网关简介
    • 5.2 Gateway简介
    • 5.3 Gateway快速入门
    • 5.4 Gateway核心架构
    • 5.5 断言
    • 5.6 过滤器
    • 5.7 网关限流

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第五章 Gateway--服务网关

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第五章 Gateway--服务网关

    第六章 Sleuth--链路追踪

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第六章 Sleuth--链路追踪

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第六章 Sleuth--链路追踪

    第七章 Rocketm--消息驱动

    • 7.1 MQ简介
    • 7.2 RocketMQX门
    • 7.3 消息发送和接收演示
    • 7.4 案例
    • 7.5 发送不同类型的消息
    • 7.6 消息消费要注意的细节

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第七章 Rocketm--消息驱动

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第七章 Rocketm--消息驱动

    第八章 SMS--短信服务

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第八章 SMS--短信服务

    第九章 Nacos Config-服务配置

    • 9.1 服务配置中心介绍
    • 9.2 Nacos Config入门
    • 9.3 Nacos Config深入
    • 9.4 nacos的几个概念

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第九章 Nacos Config-服务配置

    第十章Seata--分布式事务

    • 10.1 分布式事务基础
    • 10.2 分布式事务解决方案
    • 10.3 Seata介绍
    • 10.4 Seata实现分布式事务控制

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第十章Seata--分布式事务

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    第十章Seata--分布式事务

    看了这么多的秘籍,建议可自己手绘一份SpringCloud的知识思维脑图,便于后期去梳理归纳知识,文末就有小编自己用xmind软件的画了SpringCloud微服务实战的知识导图,可免费分享给有需要的朋友参考学习,记得直接来转发+私信我【微服务】便行!

    SpringCloud微服务架构笔记(一)

    • 1 微服务基础知识
    • 2 Spring Cloud概述
    • 3 案例措建
    • 4 服务注册Eureka基础
    • 5 服务注册Eureka高级
    • 6 Eureka替换方案Consul
    • 7 服务调用Ribbon入门
    • 8 服务调用Ribbon高级

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(一)目录

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(一)目录

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(一)内容70页

    SpringCloud微服务架构笔记(二)

    • 1 服务调用Feign入门
    • 2 服务调用Feign高级
    • 3 服务注册与发现总结
    • 4 微服务架构的高并发问题
    • 5 服务熔断Hystrix入门
    • 6 服务熔断Hystrix高级
    • 7 服务熔断Hystrix的替换方案

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(二)目录

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(二)38页

    SpringCloud微服务架构笔记(三)

    • 1 微服务网关概述
    • 2 微服务网关Zuul
    • 3 微服务网关Gate Way
    • 4 微服务的链路追踪概述

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(三)目录

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(三)内容46页

    SpringCloud微服务架构笔记(四)

    • 1 Spring Cloud Stream
    • 2 Spring Cloud Config
    • 3 开源配置中心Apollo

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(四)目录

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务架构笔记(四)内容22页

    看完这么多SpringCloud微服务架构秘籍,再来手绘一份知识导图进行梳理

    • SpringCloud微服务实战xmind总图

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    SpringCloud微服务实战xmind总图

    • 服务容错保护:Spring Cloud Hystrix

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    服务容错保护:Spring Cloud Hystrix

    • API网关服务:Spring Cloud Zuul

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    API网关服务:Spring Cloud Zuul

    • 分布式配置中心:Spring Cloud Config

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    分布式配置中心:Spring Cloud Config

    • 分布式服务跟踪:Spring Cloud Sleuth

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

    分布式服务跟踪:Spring Cloud Sleuth

    关于SpringCloud微服务架构,今天所提及的知识思维脑图由于源文件是xmind不能上传,所以全部截图过来看看,有需要分享(免费)源文件+以上的SpringCloud Alibaba笔记+SpringCloud微服务架构笔记(一)(二)(三)(四)等的,都可见下图领取

    微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传

     

    展开全文
  • 一切都为了分布式而行动! JMM 理解下面的 java的文件,需要进行编译,通过java编译编程class文件,class文件变成字节码,装载到类装载器中,通过类装载器进行执行,执行的过程中的一个模型就是下面这个。 ...

    说说JMM,线程,线程池。一切都为了分布式而行动!

    JMM

    • 理解下面的图

    java的文件,需要进行编译,通过java编译编程class文件,class文件变成字节码,装载到类装载器中,通过类装载器进行执行,执行的过程中的一个模型就是下面这个图。

    • 特性
      1.可见性

    可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。通过之前对synchronzed内存语义进行了分析,当线程获取锁时会从主内存中获取共享变量的最新值,释放锁的时候会将共享变量同步到主内存中。从而,synchronized具有可见性。同样的在volatile分析中,会通过在指令中添加lock指令,以实现内存可见性。因此, volatile具有可见性。

    2.原子性

    原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。及时在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。

    3.顺序性

    synchronized语义表示锁在同一时刻只能由一个线程进行获取,当锁被占用后,其他线程只能等待。
    在java内存模型中说过,为了性能优化,编译器和处理器会进行指令重排序;也就是说java程序天然的有序性可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序的

    由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。

    4.Happens-Before原则

    什么是线程

    线程是一个操作系统概念。操作系统负责这个线程的创建、挂起、运行、阻塞和终结操作。而操作系统创建线程、切换线程状态、终结线程都要进行CPU调度——这是一个耗费时间和系统资源的事情。

    • 生命周期

    Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

    1. 创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
    2. 就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
    3. 运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
    4. 阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
    5. 死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

    可以用过jstack 或者idea debug快照显示状态

    1. “Low Memory Detector” 负责对可使用内存进行检测,如果发现可用内存低,分配新的内存空间。
    2. “CompilerThread0” 用来调用JITing,实时编译装卸class。
    3. “Signal Dispatcher” 负责分发内部事件。
    4. “Finalizer” 负责调用Finalizer方法。
    5. “Reference Handler” 负责处理引用。
    6. “main” 是主线程。
    7. “VM Thread”, "VM Periodic Task Thread"从名字上看是虚机内部线程。
    • 状态描述
    1. NEW 状态是指线程刚创建, 尚未启动
    2. RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等
    3. BLOCKED 这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区
    4. WAITING 这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在理解点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结
    5. TIMED_WAITING 这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入 TIMED_WAITING状态TERMINATED 这个状态下表示 该线程的run方法已经执行完毕了, 基本上就等于死亡了(当时如果线程被持久持有, 可能不会被回收)
    • 优先级Priority

    线程的优先级是将该线程的重要性传给了调度器、cpu处理线程顺序有一定的不确定,但是调度器会倾向于优先权高的先执行

    • 实现方式

    Thread、Runnable、Callable
    Runnable和Thread区别:
    1、效果上没区别,写法上的区别而已。
    2、没有可比性,Thread实现了Runnable接口并进行了扩展,我们通常拿来进行比较只是写法上的比较,而Thread和Runnable的实质是实现的关系,不是同类东西。
    3、Callable1.5引入,具有返回值,并且支持泛型,并且不是run方法了是call方法。

    • 为什么有线程还要用线程池

    线程的切换需要耗时,线程池直接从管理池子里面的线程,效率更高。

    Executor框架体系

    Java.util.concurrent中的Executor(中文翻译是执行器)是管理咱们之前的Thread线程的。目的是是简化并发编程。
    ScheduledThreadPoolExecutor和ThreadPoolExecutor。

    构造器:核心数量,任务队列容器,存活时间,线程工厂,处理器

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,//存活时间
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue, //阻塞队列
                              ThreadFactory threadFactory,//线程工厂
                              RejectedExecutionHandler handler) {//hander处理
    
    
    • LinkedBlockingQueue

    • Execute(submit)方法 ->java.util.concurrent.ThreadPoolExecutor#execute

    简要分析一下execute源码:执行一个Runnable对象时,首先通过workerCountOf©获取线程池中线程的数量,如果池中的数量小于corePoolSize就调用addWorker添加一个线程来执行这个任务。否则通过workQueue.offer(command)方法入列。如果入列成功还需要在一次判断池中的线程数,因为我们创建线程池时可能要求核心线程数量为0,所以我们必须使用addWorker(null, false)来创建一个临时线程去阻塞队列中获取任务来执行。

    if (command == null)
        throw new NullPointerException();
    int c = ctl.get();
    //判断是否小于核心数量,是直接新增work成功后直接退出 
    if (workerCountOf(c) < corePoolSize) {
        if (addWorker(command, true))
            return;
        c = ctl.get();// 增加失败后继续获取标记
    }
    //判断是运行状态并且扔到workQueue里成功后
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
    //再次check判断运行状态如果是非运行状态就移除出去&reject掉
        if (! isRunning(recheck) && remove(command))
            reject(command);
        else if (workerCountOf(recheck) == 0) //否则发现可能运行线程数是0那么增加一个null的worker。
            addWorker(null, false);
    }
    else if (!addWorker(command, false)) //直接增加worker如果不成功直接reject
        reject(command);
    
    
    
    • addWorker方法

    总结:
    //这个两个for循环主要是判断能否增加一个线程,
    //外循环来判断线程池的状态
    //内循环主要是个增加线程数的CAS操作
    第一个参数firstTask不为null,则创建的线程就会先执行firstTask对象,然后去阻塞队列中取任务,否直接到阻塞队列中获取任务来执行。第二个参数,core参数为真,则用corePoolSize作为池中线程数量的最大值;为假,则以maximumPoolSize作为池中线程数量的最大值。
    T.start方法 run方法执行>调用了runWorker方法

    retry:
    for (;;) {
        int c = ctl.get();
        int rs = runStateOf(c);
    
        // Check if queue empty only if necessary. 
        if (rs >= SHUTDOWN &&
            ! (rs == SHUTDOWN &&
               firstTask == null &&
               ! workQueue.isEmpty()))
            return false;// 两种情况1.如果非关闭状态  2.不是这种情况(停止状态并且是null对象并且workQueue不等于null)
    
        for (;;) {
            int wc = workerCountOf(c);
            if (wc >= CAPACITY ||
                wc >= (core ? corePoolSize : maximumPoolSize))
                return false;// 判断是否饱和容量了
            if (compareAndIncrementWorkerCount(c)) //增加一个work数量 然后跳出去
                break retry;
            c = ctl.get();  //增加work失败后继续递归
            if (runStateOf(c) != rs)
                continue retry;
            // else CAS failed due to workerCount change; retry inner loop
        }
    }
    
    boolean workerStarted = false;
    boolean workerAdded = false;
    Worker w = null;
    try {
        w = new Worker(firstTask);//增加一个worker
        final Thread t = w.thread;
        if (t != null) {//判断是否 为null
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                // Recheck while holding lock.
                // Back out on ThreadFactory failure or if
                // shut down before lock acquired.  锁定后并重新检查下 是否存在线程工厂的失败或者锁定前的关闭
                int rs = runStateOf(ctl.get());
    
                if (rs < SHUTDOWN ||
                    (rs == SHUTDOWN && firstTask == null)) {
                    if (t.isAlive()) // precheck that t is startable
                        throw new IllegalThreadStateException();  
                    workers.add(w);   //增加work
                    int s = workers.size();
                    if (s > largestPoolSize)
                        largestPoolSize = s;
                    workerAdded = true;
                }
            } finally {
                mainLock.unlock();
            }
            if (workerAdded) { //本次要是新增加work成功就调用start运行
                t.start();
                workerStarted = true;
            }
        }
    } finally {
        if (! workerStarted)
            addWorkerFailed(w);
    }
    return workerStarted;
    
    
    
    • runWorker

    总结:获取任务、调用线程run方法

    Thread wt = Thread.currentThread();//1.取到当前线程
    Runnable task = w.firstTask;
    w.firstTask = null;
    w.unlock(); // allow interrupts
    boolean completedAbruptly = true;
    try {
        while (task != null || (task = getTask()) != null) { //获取任务 看看是否能拿到 点进入
    Task中的队列poll take是真正拿到task 
    //workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
    超时取出
            w.lock();
            // If pool is stopping, ensure thread is interrupted;
            // if not, ensure thread is not interrupted.  This
            // requires a recheck in second case to deal with
            // shutdownNow race while clearing interrupt
            if ((runStateAtLeast(ctl.get(), STOP) ||
                 (Thread.interrupted() &&
                  runStateAtLeast(ctl.get(), STOP))) &&
                !wt.isInterrupted())
                wt.interrupt();// 确保线程是能中断的
            try {
                beforeExecute(wt, task); //开始任务前的钩子
                Throwable thrown = null;
                try {
                    task.run();//执行任务
                } catch (RuntimeException x) {
                    thrown = x; throw x;
                } catch (Error x) {
                    thrown = x; throw x;
                } catch (Throwable x) {
                    thrown = x; throw new Error(x);
                } finally {
                    afterExecute(task, thrown); //任务后的钩子
                }
            } finally {
                task = null;
                w.completedTasks++;
                w.unlock();
            }
        }
        completedAbruptly = false;
    } finally {
        processWorkerExit(w, completedAbruptly); //看这儿
    }
    
    
    • processWorkerExit
    if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
        decrementWorkerCount();
    
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        completedTaskCount += w.completedTasks;
        workers.remove(w);  //移除work
    } finally {
        mainLock.unlock();
    }
    
    tryTerminate();
    
    int c = ctl.get();
    if (runStateLessThan(c, STOP)) { //判断是否还有任务
        if (!completedAbruptly) {
            int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
            if (min == 0 && ! workQueue.isEmpty())
                min = 1;
            if (workerCountOf(c) >= min)
                return; // replacement not needed
        }
        addWorker(null, false);
    
    

    线程池的拒绝策略

    四种策略 默认是AbortPolicy

    名称 意义
    AbortPolicy (默认) 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
    CallerRunsPolicy 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
    DiscardOldestPolicy 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中
    DiscardPolicy 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
    • ScheduledThreadPoolExecutor的实现

    ScheduledThreadPoolExecutor继承了ThreadPoolExecutor并且实现了ScheduledExecutorService接口。ScheduledExecutorService定义了使用ScheduledThreadPoolExecutor提交任务的接口schedule。schedule是一组返回值和参数不同的overwrite接口。以供用户选择提交任务的模式,比如是一次性的定时任务还是周期性的任务,需不需要返回结果等等。不管是哪个schedule接口,他的实现功能主要是把用户提交的任务和模式封装成ScheduledFutureTask,然后调用delayedExecute(Runnable command)。所以delayedExecute方法是真正的处理任务的方法。

    PS:并发始终还是围绕这线程的判断来进行的一步一步的操作,所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。这块只做了解吧。我已经写懵逼了。

    展开全文
  • 前端架构师资源列表 这里的资源可帮助您为成为全面的前端架构师...行动网路 CSS 面试准备 在线课程/培训 Udacity 纳米度 树屋 曲目 图书 JavaScript 网络性能 算法与数据结构 文章 GitHub学习列表 鸣叫
  •  做项目两个多月以来,对底层架构,脑中只有一个大概轮廓,一直以来都没有行动下移,把这架构落实到上。  近日,抽出一些空儿,画画。看看这个被大牛们吹捧的架构,到底是怎么回儿事。  三层
  • 自从上次搭建完小型架构以后,还是比较稳定的,但有一个让人担心的烦恼,那就是机器的负载都很高,基本上都是百分之七八十的占用,不管是CPU... 重新设计架构图如下:主要的优化点: 1、在负载均衡服务器上加上了w...
  • 一种适合创业公司的技术架构方案

    千次阅读 2016-03-30 20:50:39
    在此前提下,老夫基于阿里云服务实践(是实践不是YY)了一套技术架构方案,如果你不幸步行于此,希望下没有坑害到你。 与其说是架构方案,还不如说是脚手架,因为你所看到的,都是我们最常用的框
  • spark整个流程 第6步详解解析: 6.1的LauncherPool为线程池,它会启动一个线程类NMclient用来和NodeManager通信用,然后会启动NodeManager中的一个...所以当Exeuctor启动完成后,就开始跑代码,直到遇到第一个行动
  • 54、 在构思阶段,各种角色的职责是://根据质量目标提供反馈//提出为了保证质量而需要采取的行动 55、 移动数据拷贝需考虑的因素有哪些?//数据的有效性不再符合要求//网络或应用程序平台是不可靠的//其他应用程序...
  • 静态结构设计与动态行动设计分离;试探性;反复性;多步性。 2.数据库设计的方法 直观设计法 规范设计法 计算机辅助设计法 自动化设计法 3.数据库设计的基本步骤 需求分析 数据流、需求说明书 概念结构设计 E-R...
  • 创建信息架构图的准则 310 视觉沟通 311 站点地图 313 高级架构站点地图 313 深入站点地图 315 保持站点地图的简单性 319 详细的站点地图 320 组织你的站点地图 322 线框图 324 线框图的类型 327 线框图...
  • 11 月 28 日,身负 7 条人命,潜逃 23 年的“蛇蝎女魔”劳某枝在厦门自己工作的商场被捕。...此结果促使警方快速展开伏击行动,于 28 日正式将嫌疑人逮捕。 大数据抓逃犯的新闻近几年已屡见不鲜,最知...
  • NVIDIA GeForce Go 7800 GTX GPU展现了全新的设计架构,包含可编程着色架构,支持DirectX 9 Shader Model 3.0以及Film Quality HDR等游戏设计业者为呈现最逼真效果所必备的功能。另外,其NVIDIA ...
  • 日前,石家庄市人民政府印发了《石家庄市推进智慧城市建设行动计划(2017—2019年)》,计划到2019年,初步完成“一云一网一一库”的架构,建成以基础设施智能化、公共服务便捷化、城市管理精细化、决策支持科学化...
  • 辞职以后的行动

    2008-08-01 21:39:00
    鼓起勇气去辞职啦。现在在家呆了3个星期啦。...后来,猪把所有的框架架构都架好啦,说开始工作啦。55555,呵呵,开始就开始喽。我还想转行去做美工呢,现在让我用PS或FW处理个图片,哇塞,好麻烦。好难
  • 欢迎来到 Graph是一个语义数据库,用于创建数据驱动的应用程序。 。 产品特点 iCloud支持 多本地和云图 线程安全 存储任何数据类型,包括二进制数据 关系建模 分析行动模型 图论与集合论的模型 异步/同步...
  • 11.3.2 现在行动:实现用例 在5.6.3分析模型的意义一节中作者介绍过,分析模型是采用MVC模式,将用例场景中描述的业务分解为边界(操作界面和展示界面)、控制(业务逻辑)和实体(业务数据),用这三个元素建立实现...
  • 作为一个事件驱动架构 (EDA)引擎,它提供了获取、聚合、关联与分析事件的“大脑”,生成新的高级事件以触发一个响应,同时也生成高级的信息来显示当前的业务状态。它使你轻松的定义逻辑以应用到不断到来的事件中,...
  • Java基础知识架构第一篇,什么是封装?封装就是将属性私有化,提供公有的方法访问私有属性,做法:修改属性可见性来限制对属性的访问,给每个属性创建get和set方法。实现步骤:1、 修改属性的可见性来限制对属性的...
  • 我们正在用实际行动来帮助小伙伴们构建一套成体系的图形学知识架构,你在我们这里获得的不止于那些毫无意义的代码,我们这里更多的是代码背后的故事,以及精准、透彻的理解。我们不会扔给人们一本书或者给个思路让...
  • ROS机器人操作系统为什么现在火爆全球? ROS(Robot Operating ...ROS可以分成两层,低层是上面描述的操作系统层,高层则是广大用户群贡献的实现不同功能的各种软件包,例如定位绘图,行动规划,感知,模拟等等。 RO
  • ROS机器人操作系统为什么现在火爆全球? ROS(Robot Operating ...ROS可以分成两层,低层是上面描述的操作系统层,高层则是广大用户群贡献的实现不同功能的各种软件包,例如定位绘图,行动规划,感知,模拟等等。 RO
  • CPU CPU( Central Processing Unit, 中央处理器)就是机器的“大脑”,也是布局谋略、发号施令、控制行动的“总司令官”。 CPU的结构主要包括运算器(ALU, ...:CPU微架构示意 什么?架构记不住?来,我们换种
  • Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作...Kafka架构图一、利用 Apache Kafka 系统架构的设计...
  • 在即将于美国拉斯维加斯开展的CES 2015大会前夕,Nvidia拉开序幕,发布旗下一款Nvidia Tegra X1行动处理器晶片,不只是做为新一代Tegra K1行动晶片后继者登场,还采用Maxwell 绘图引擎架构开发而成,同时内建64位元...
  • 它为SharePoint顾问,管理员,架构师以及寻求实际实际治理指导的任何其他人提供了典型的治理参考指南。本书不仅仅是填写治理文档模板,而且完全侧重于采取的行动和采取行动来应对现实世界的治理挑战。 向您介绍如何...

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

行动架构图