精华内容
下载资源
问答
  • 云的三种基本状态
    千次阅读
    2018-06-20 16:20:01

    您能否以每周为单位向客户发布各类新功能?甚至进一步达到以每天乃至每小时为单位?新晋开发人员能否在上班的第一天即进行代码部署,或者是在工作审查过程中完成功能交付?了解到新员工完成代码部署后,应用程序仍能完美运行,大家肯定可以睡个好觉。事实上,这种快捷的发布周期需要配合一系列流程、工具甚至是管理文化,从而共同支撑起一套安全且可靠的云原生应用程序运作机制。而这也成为软件驱动型企业的核心战略因素之一,其目标在于以更快速度发布软件成果,且同时降低潜在风险。在拥有了这种快速发布软件的能力之后,我们将拥有更为紧凑的反馈循环,从而高效响应客户的每一项基本需求。

    持续交付能力正是软件迈向云原生方向的主要动力:软件发布速度的加快能够有效降低反馈周期的持续时间。DevOps代表着我们全面实现云原生战略过程中需要遵循的文化与技术转变。微服务则是一套软件架构模式,其已经被成功且广泛地应用于开发及交付运营工作的规模扩展当中,且能够有效规避缓慢、高风险及单一性部署策略。举例来说,如果大家无法真正推广“快速失败”与“自动化优先”的DevOps文化,那么微服务机制将很难获得成功。

    持续交付、DevOps以及微服务分别面向云原生机制的三项根本性重点,即为什么、如何以及什么。这些竞争优势已经迅速成为企业在软件成果对抗当中胜出的有力武器。作为最为先进的概念性载体,它们往往相互交织在一起并呈现出不可分割的态势——而这,正是云原生机制的实际表现形式。

    云原生机制对我们意味着什么?

    在软件交付生命周期当中引入云原生机制之后,大家将能够提高运营及规模化效率,进而实现所谓“敏捷性”:也就是快速为软件添加新功能,同时又不影响其在生产环境下的稳定性与安全性水平的能力。众所周知,我们的应用程序在运行过程中需要基础设施、开发者中间件以及支持服务的多方配合,而云原生方案则通过对这些因素的自动化改造实现上述目标。

    这类方案绝不仅仅是在传统面向虚拟化的编排体系基础之上建立而成的临时性自动化解决办法。一套全面的云原生架构当中包含自动化与编排两类机制,能够帮助用户直接获得相关效果,而无需再将自动化流程作为可定制设计进行编写。其内置自动化管理方案可作为契约起效,从而执行政策并保障效果承诺。换句话来说,这类自动化方案使我们得以更为轻松地构建出可以自动化方式管理的应用程序。

    当然,新型基础设施方案的出现同时也会对软件的开发方式提出新的要求。开发人员必须利用一整套新的架构实践组合——例如微服务与容器技术——从而确保应用程序能够在云平台之上得到妥善管理,这也是我们在软件开发提速之外需要认真考量的保障前提。新方案在运营层面亦带来多项助益,具体包括应用程序实例可迁移、统一化登录以及通过监控手段保障应用程序及数据流正常运作等等。

    要发挥云原生方案的固有优势,较为理想的途径之一就是将其作为运行时契约加以审视。所谓运行时契约,本质上是一套运行软件所需遵循的指南组合。云原生框架能够帮助开发人员编写出符合云平台之上运行时契约要求的应用程序。

    云原生框架

    云原生应用程序的一大关键性特质在于,其需要遵循一套设计契约以最大程度实现行为的可预测性。云平台当中所使用的高自动化、容器驱动型基础设施也对软件的编写方式提出了要求。开发人员必须改变自己的编程习惯,在开发人员与基础设施之间创建出一套用于指导应用程序运行的新型“契约”。下面我们就通过“应用十二要素”中所提出的十二项基本原则来了解如何打造出一套理想的“契约”机制。

    这十二项因素之间存在一定交集,同时亦相互支撑。大家在具体实施过程中,应当尽可能保持其直接关联与可行性:

    1.立足于单一代码库向多种环境部署 – 包括生产性组件在内的单一代码库能够确保代码的单一来源,从而降低配置错误数量并提高弹性水平。

    2.以声明方式管理依赖性 – 云平台需要引入必要的关联性声明并加以妥善管理,从而确保相关云应用程序始终具备必要的库及服务支持。

    3.使用保存在环境当中的配置信息 – 环境变量能够提供一套简洁、易于理解且符合标准要求的使用方式,从而为以多种编程语言编写而成的无状态应用程序提供良好的配置机制。

    4.将后端服务作为附加资源处理 – 将每种资源都作为远程资源处理的思路成就了弹性这一概念,这不仅从编程层面考虑到了资源不可用情况,同时也最大程度发挥了微服务方案当中的固有优势。

    5.将构建、发布以及运行阶段区分开来 – 云原生应用程序的构建流程将大部分发布配置工作转移到了“开发”阶段,这意味着发布包当中将包含有代码本身以及运行应用程序所必需的生产配置方案。

    6.以无状态方式运行 – 云原生基础设施的速度表现与成本效益要得到切实体现,要求应用程序堆栈中的第一层拥有尽可能高的轻量化水平。

    7.将服务与端口绑定 – 云原生应用程序当中的服务接口一般倾向于利用基于HTTP的API作为通用集成框架。

    8.通过添加无状态进程实现横向扩展 – 对于无状态非共享式设计思路的强调,意味着扩展工作能够依赖于底层平台——而非智能化多进程代码——来完成。

    9.启动速度快,允许正常关闭 – 假定任意给定进程都能够随时进行启动与关闭。

    10.在开发、分段与生产环境下拥有统一运行效果 – 由于高度强调自动化机制并在各生命周期阶段使用同样的云平台,因此只要大家使用的是同一套“平台”、那么我这边能用的在你那边也同样能用。

    11.对汇总及事件响应的标准输出结果进行记录 – 当日志记录由云平台而非应用程序内的库负责处理时,将记录机制作为功能实体则变得非常关键。

    12.允许临时性任务以短期进程方式运行 – 在云原生方案当中,管理任务可以单纯转化为另一种进程、而非特定工具,而且必须保证其行为方式要与使用“机密”API以及内部机制有所区别。

    遵循以上指导性原则,我们完全可以在应用程序当中利用统一的架构接口构建起一套无状态且面向过程的设计模式,从而打造出适合运行在云环境之下的分布式应用程序。Ruby on Rails凭借着所坚持的、基于配置的公约方式在Web开发领域给应用程序框架带来了一次革命。自Rails首次发布至今的九年半时间里,充分利用框架潜能的意识已经深入到了整个技术行业当中,而云原生机制的出现也将继续延续这一发展趋势。

    以Spring Boot/Cloud以及Dropwizard for Java、Seneca for Node.js甚至是Ruby on Rails为代表的各类框架已经为云契约构建起了很好的立足根基。它们的存在不仅能帮助我们节约大量时间,同时也让开发者能够将精力集中在编写作为应用核心的关键性业务逻辑身上,而非劳心劳力将代码粘接在一起以实现正常运行。

    当我们的应用程序符合运行时契约要求时,这意味着大家可以对其进行编排、管理并通过弹性云原生运行时环境对其进行规模伸缩。

    云原生运行时

    容器技术已经兴起并发展成为云运行时环境当中的关键性组成部分。它们的轻量级特性以及紧凑的资源管理机制能够极好地同云应用程序方案加以配合,从而在提高速度的同时改进资源利用效率。容器技术相当于将一款能够运行于云平台之上的应用程序打包成一套独立的可执行组件,且确保其与云平台的契约要求相兼容。

    与其它任意进程一样,大家也可以在每一台主机设备上运行多套容器系统(无论是裸机还是虚拟机)。在开发阶段中,利用容器方案构建应用程序能帮助开发人员降低耗费在编程方面的时间周期,同时在笔记本设备上创建出一套完整的、甚至能够面向开发者运行的云环境,从而模拟出整个生产流程。在生产环境下,容器提供的密钥机制能够更好地保障不同进程之间的安全性,帮助各进程拥有更出色的稳定性与可预测的资源消耗水平。而着眼于下一个层级,我们还能够借此预测基础设施在响应需求过程中的成长增长进度。

    要有效运用容器技术,我们必须对其精心编排。编排是一种手段,目的是在无需人为介入或者制定规划的前提下以消耗性资源池为基础,实现容器的启动、中止以及资源分发——这实际上是一套弹性运行时。编排方案当中需要包含部署请求、自动伸缩流量分析以及基础设施发生故障时的响应措施等要素。完整的容器编排方案还能够实现诊断及变更回滚,同时对处于生产环境下的不同实验性应用程序版本进行管理及A/B测试乃至试探性部署。相比之下,简单的打包容器则仅仅属于云原生架构需求当中的一部分,负责编排并管理相关容器的部署方式——在这种情况下,容器在生产环境下的具体效果甚至要比容器自身的打包方式更加重要。

    随着云原生框架方案的持续兴起,容器编排的出色属性已经受到业界的广泛关注。下面我们来总结享受容器运行时优势时需要保证的几项前提:

    1.对生命周期的创建、运行以及中止加以管理 – 对运行在生产环境中的各容器的生命周期进行严格管理能够帮助大家根据实际需求对应用程序规模加以自动伸缩。

    2.通过约束性手段以可预测方式运用资源 – 容器机制允许我们对每项实例所使用的资源进行细化控制。

    3.进程隔离 – 同样的,容器机制能够利用内核层级的命名空间与本地文件系统保证各个进程之间彼此隔离。

    4.通过编排机制优化资源利用方式 – 考虑到资源池通常由一系列虚拟机系统共同构成,容器会以分布式管理方式将工作负载分发至整个资源池当中。

    5.故障诊断及生产恢复方式 – 生产环境下总会有组件发生故障,而这套编排平台应当以自动化方式对关键性故障作出响应,包括移除异常实例及基础设施并重新均衡负载以避免宕机等。

    云原生运行时能够运行在类别广泛的不同基础设施之上,且通过API消除对具体基础设施类型的依赖性。当然,拥有妥善管理的自动你可以基础设施能够让我们的云原生架构在弹性方面更上一层楼。

    云原生基础设施自动化

    以合理实施作为出发点,基础设施自动化将使整套生产架构以全面托管方式运作,且几乎无需人为因素的介入。

    强大的自动化机制能够处理几乎任何原本需要由传统IT人员完成的任务:新型路由器及负载均衡机制能够完成应用实例的启动与中止、配置以及网络服务等应用程序部署过程中必需的环节,同时实现新基础设施资源分配、设置监控方案与灾难恢复场景、日志汇总甚至是在基础设施出现故障时对工作负载进行重新分配。

    这类先进的自动化实践能够帮助我们免受零日安全漏洞的侵扰:自动化方案会在每个节点之上进行部署操作,从而在不产生任何停机时间的前提下应用安全补丁。

    要实现这种级别的自动化效果,我们需要使用所谓结构化平台。从宏观角度看,这类结构化平台必须拥有以下能力:

    1.路由与负载均衡 – 通过容器编排对应用程序进行横向扩展必然要求网络路由加以配合,而后者则能够以动态方式对面向整套资源池的输入请求进行均衡。

    2.支持服务代理 – 大部分应用程序在运行过程中都需要外部支持服务作为配合,例如数据库、缓存解决方案以及消息队列机制等等,而这一切都应当由该平台作为贯穿整个环境的高可用性服务加以交付,且符合前面提到的十二项配置基本原则。

    3.基础设施编排 – 平台应当自动管理整套基础设施,从而对计算资源进行弹性规模伸缩。

    4.运行状况管理、监控与恢复 – 当事件发生时,将平台之上所运行应用程序之虚拟化、实例以及通知与审计全部纳入日志记录。

    5.可重复使用的运行时环境库 – 容器镜像在创建过程中需要考虑到不同应用程序实例启用时的发布及可重复使用能力,从而确保整套架构中的全部实例皆拥有完全一致的运行前提。

    6.日志汇总 – 高可用性横向扩展应用需要对来自全部实例的日志信息加以汇总,从而进行分析并针对突发情况作出快速响应。

    云原生基础设施编排机制提供一套贯彻基础设施始终的结构化平台,它既是整合了底层API的完整层级,同时也作为云原生架构中的基础性组成部分存在,从而保证运行时编排体系得以安装、扩展、管理以及更新。

    这正是保障云原生应用程序交付成功的宏观层面考量方向,同时也是在运营过程中降低修复时间与压力成本并加快软件交付速度的有效途径。如果部署与运营成本过于高昂,那么持续交付与微服务架构将无从谈起。我们当然需要着眼于此类工具的主要功能,但同时也必须重视高可信度文化及流程的建立。(在某些情况下,文化与流程甚至会成为左右实际结果的关键性因素,但这就不在今天的讨论范围之内了。)

    迈向云原生之路

    对于希望最大程度享受持续交付机制所带来的速度与效益的用户来说,拥有一套能够支持云原生应用程序的架构显然极为重要,只有这样面向整体软件交付生命周期的技术方案才能落实到位。以符合云原生容器运行时特性的云原生框架为前提构建应用程序,同时实现云原生基础设施自动化,这样企业业务能力才能在软件交付过程中得到保证。此类平台还包含大量用于实现持续交付、敏捷开发以及DevOps活动的具体实践及流程,同时带来云基础设施所固有的可用性及可靠性优势。

    总而言之,享受云原生的稳定性与敏捷性优势不应以牺牲固有效益为代价。在云原生架构当中,我们可以拥有同样的资源储备、灵活性水平、速度表现乃至安全成效——Netflix等云原生企业已经给出了实证。保持信心,同时谨慎对待,这正是在云原生之路上高歌猛进的重要原则。

    更多相关内容
  • 写在前面 这里介绍下Springboot 集成RocketMQ的三种方式 ...1.1.2、三种基本发送方式: 同步发送 异步发送 单项发送 同步发送,代码示例 /** * 同步发送实体对象消息 * 可靠同步发送:同步发送是指消

    写在前面

    这里介绍下Springboot 集成RocketMQ的三种方式

    一、原生 jar(rocketmq-client)

    1.1、producer

    1.1.1、三个基本使用

    • producerGroup,定义生产者组
    • DefaultMQProducer,定义生产者配置
    • TransactionMQProducer,定义支持事务生产者

    1.1.2、三种基本发送方式:

    • 同步发送
    • 异步发送
    • 单项发送

    同步发送,代码示例

    /**
         * 同步发送实体对象消息
         * 可靠同步发送:同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式;
         * 特点:速度快;有结果反馈;数据可靠;
         * 应用场景:应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等;
         *
         * @param topic
         * @param tags
         * @param body
         * @return
         * @throws InterruptedException
         * @throws RemotingException
         * @throws MQClientException
         * @throws MQBrokerException
         * @throws UnsupportedEncodingException
         */
        public String syncSend(String topic, String tags, String body) throws InterruptedException, RemotingException, MQClientException, MQBrokerException, UnsupportedEncodingException {
            Message message = new Message(topic, tags, body.getBytes(RemotingHelper.DEFAULT_CHARSET));
            Message msg = new Message(topic /* Topic */,
                    tags /* Tag */,
                    ("Hello RocketMQ ").getBytes() /* Message body */
            );
            // 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
            // 通过sendResult返回消息是否成功送达
            System.out.printf("%s%n", sendResult);
            TimeUnit.SECONDS.sleep(1);
            return "{\"MsgId\":\"" + sendResult.getMsgId() + "\"}";
        }
    

    异步发送,代码示例

    /**
         * 异步发送消息
         * 可靠异步发送:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式;
         * 特点:速度快;有结果反馈;数据可靠;
         * 应用场景:异步发送一般用于链路耗时较长,对 rt响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等;
         *
         * @param topic
         * @param tags
         * @param body
         * @return
         * @throws InterruptedException
         * @throws RemotingException
         * @throws MQClientException
         * @throws MQBrokerException
         * @throws UnsupportedEncodingException
         */
        public void asyncSend(String topic, String tags, String body) throws Exception {
            Message msg = new Message(topic /* Topic */,
                    tags /* Tag */,
                    ("Hello RocketMQ ").getBytes() /* Message body */
            );
            // 发送消息到一个Broker
            producer.send(msg, new SendCallback() {
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送结果 : " + sendResult);
                }
    
                public void onException(Throwable throwable) {
                    System.out.println(throwable.getMessage());
                }
            });
            TimeUnit.SECONDS.sleep(1);
        }
    

    单项发送,代码示例

    /**
         * 单向发送
         * 单向发送:只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答;此方式发送消息的过程耗时非常短,一般在微秒级别;
         * 特点:速度最快,耗时非常短,毫秒级别;无结果反馈;数据不可靠,可能会丢失;
         * 应用场景:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集;
         *
         * @param topic
         * @param tags
         * @param body
         * @throws InterruptedException
         * @throws RemotingException
         * @throws MQClientException
         * @throws MQBrokerException
         * @throws UnsupportedEncodingException
         */
        public void oneway(String topic, String tags, String body) throws Exception {
            Message msg = new Message(topic /* Topic */,
                    tags /* Tag */,
                    ("Hello RocketMQ ").getBytes() /* Message body */
            );
            producer.sendOneway(msg);
            TimeUnit.SECONDS.sleep(1);
        }
    

    1.1.3、其他发送特性

    • 消息延迟
    • 设置消息属性,用于消费过滤
    • 消息队列选择器Selector
    • 事务监听

    消息延迟

     /**
         * 延迟 消费
         */
        public void delayTestListener() {
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("delayGroup");
            consumer.setNamesrvAddr(namesrvAddr);
            try {
                // 订阅PushTopic下Tag为push的消息,都订阅消息
                consumer.subscribe("delayPushMsg", "push");
    
                // 程序第一次启动从消息队列头获取数据
                consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
                //可以修改每次消费消息的数量,默认设置是每次消费一条
                consumer.setConsumeMessageBatchMaxSize(1);
                //在此监听中消费信息,并返回消费的状态信息
                consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
                    // 会把不同的消息分别放置到不同的队列中
                    for (MessageExt msg : msgs) {
                        log.info("Receive message:msgId={},msgBody={},delay={} ms",
                                msg.getMsgId(),
                                new String(msg.getBody()),
                                (System.currentTimeMillis() - msg.getStoreTimestamp()));
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                });
                consumer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    设置消息属性,用于消费过滤

        /**
         * todo 注意这里 需要启动 broker 前,设置 支持SQL92 Filter = enable
         * sql filter
         *
         * @param topic
         * @param tags
         * @param body
         * @param i
         * @throws Exception
         */
        public void filtersql(String topic, String tags, String body, int i) throws Exception {
            //消息
            Message message = new Message(topic, tags, body.getBytes());
            //设置消息属性
            message.putUserProperty("i", String.valueOf(i));
            //发送消息
            SendResult sendresult = producer.send(message);
            System.out.println("消息结果 :" + sendresult);
            TimeUnit.SECONDS.sleep(1);
        }
    
    

    消息队列选择器Selector

        /**
         * Order 测试
         *
         * @param topic
         * @param tags
         * @param body
         * @param order
         * @throws Exception
         */
        public void orderPush(String topic, String[] tags, String body, Boolean order) throws Exception {
            // 订单列表
            List<OrderStep> orderList = this.buildOrders();
    
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateStr = sdf.format(date);
            for (int i = 0; i < 10; i++) {
                if (order) {
                    log.info("有序的消费,根据队列id,分配分组,启动相应的唯一消费线程");
                    // 加个时间前缀
                    String body1 = dateStr + body + orderList.get(i);
                    Message msg = new Message(topic, tags[i % tags.length], "KEY" + i, body1.getBytes());
    
                    SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                            Long id = (Long) arg;  //根据订单id选择发送queue
                            long index = id % mqs.size();
                            return mqs.get((int) index);
                        }
                    }, orderList.get(i).getOrderId());//订单id
                    System.out.println(String.format("SendResult status:%s, queueId:%d, body:%s",
                            sendResult.getSendStatus(),
                            sendResult.getMessageQueue().getQueueId(),
                            body1));
                } else {
                    log.info("无序的的消费,需等所有消息发布完成,在分配,根据队列id,启动相应的唯一消费线程");
                    // 加个时间前缀
                    String body1 = dateStr + body + orderList.get(i);
                    Message msg = new Message(topic, tags[i % tags.length], "KEY" + i, body1.getBytes());
                    SendResult sendResult = producer.send(msg);
    
                    System.out.println(String.format("SendResult status:%s, queueId:%d, body:%s",
                            sendResult.getSendStatus(),
                            sendResult.getMessageQueue().getQueueId(),
                            body1));
                }
            }
    
        }
    
    

    事务监听

        /**
         * 事务测试
         *
         * @param topic
         * @param tags
         * @param body
         * @throws Exception
         */
        public void tasnsaction(String topic, String[] tags, String body) throws Exception {
    
            //创建事务监听器
            TransactionListener listener = new TransactionListener() {
                /**
                 * When send transactional prepare(half) message succeed, this method will be invoked to execute local transaction.
                 *
                 * @param message Half(prepare) message
                 * @param o Custom business parameter
                 * @return Transaction state
                 */
                public LocalTransactionState executeLocalTransaction(Message message, Object o) {
                    if ("Tag1".equals(message.getTags())) {
                        return LocalTransactionState.COMMIT_MESSAGE;
                    } else if ("Tag2".equals(message.getTags())) {
                        return LocalTransactionState.ROLLBACK_MESSAGE;
                    } else return LocalTransactionState.UNKNOW;
                }
    
                /**
                 * When no response to prepare(half) message. broker will send check message to check the transaction status, and this
                 * method will be invoked to get local transaction status.
                 *
                 * @param messageExt Check message
                 * @return Transaction state
                 */
                public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
                    System.out.println(messageExt.getTags() + "消息回查!");
                    return LocalTransactionState.COMMIT_MESSAGE;
                }
            };
            //set事务监听器
            transProducer.setTransactionListener(listener);
            //发送消息
            for (int i = 0; i < 3; i++) {
                Message message = new Message(topic, tags[i], "KEY" + i, (body + i).getBytes());
                SendResult sendResult = transProducer.sendMessageInTransaction(message, null);
                System.out.println("发送结果 :" + sendResult);
                TimeUnit.SECONDS.sleep(2);
            }
        }
    
    

    1.2、consumer

    1.2.1、基本使用

    • DefaultMQPushConsumer

    1.2.2、监听示例

    基本配置

        /**
         * RocketMq配置监听信息
         */
        public void messageListener() {
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("SpringBootRocketMqGroup");
            consumer.setNamesrvAddr(namesrvAddr);
            try {
                // 订阅PushTopic下Tag为push的消息,都订阅消息
                consumer.subscribe("PushTopic", "push");
    
                // 程序第一次启动从消息队列头获取数据
                consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
                //负载均衡模式消费
               // consumer.setMessageModel(MessageModel.BROADCASTING);
                //可以修改每次消费消息的数量,默认设置是每次消费一条
                consumer.setConsumeMessageBatchMaxSize(1);
                //在此监听中消费信息,并返回消费的状态信息
                consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
                    // 会把不同的消息分别放置到不同的队列中
                    for (Message msg : msgs) {
                        System.out.println("接收到了消息:" + new String(msg.getBody()));
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                });
                consumer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    

    filter tag

        /**
         * filter tag 监听
         */
        public void filterTagListener() {
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("tagFilterGroup");
            consumer.setNamesrvAddr(namesrvAddr);
            try {
                //订阅的topic与tag
                consumer.subscribe("topic1", "tag1 || tag2");
                //注册消息监听器
                consumer.registerMessageListener(new MessageListenerConcurrently() {
                    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                        for (MessageExt msg : list) {
                            log.info("收到消息:Keys->{},body->{}", msg.getKeys(), new String(msg.getBody()));
                        }
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                });
                consumer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    

    条件过滤

        /**
         * sql92 条件过滤
         */
        public void sqlFilterTagListener() {
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("sqlFilterGroup");
            consumer.setNamesrvAddr(namesrvAddr);
            try {
                //设置订阅条件
                consumer.subscribe("topic2", MessageSelector.bySql("i > 5"));
                //注册监听器
                consumer.registerMessageListener(new MessageListenerConcurrently() {
                    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                        for (MessageExt msg : list) {
                            log.info("收到消息:Keys->{},body->{},i ->{}",
                                    msg.getKeys(),
                                    new String(msg.getBody()),
                                    msg.getProperty("i"));
                        }
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                });
                consumer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    二、rocketmq-spring-boot-starter

    Maven 坐标

    <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-spring-boot-starter</artifactId>
                <version>${rocketmq-spring-boot-starter-version}</version>
            </dependency>
    

    基本架构,不是很复杂,将RocketMQ client Jar 中的相关连接配置,Message 对象转换成了Spring Bean

    在这里插入图片描述

    基本配置

    rocketmq.name-server=localhost:9876
    rocketmq.producer.group=boot-group1
    rocketmq.producer.sendMessageTimeout=300000
    

    2.1、producer

    两个模板对象

    • RocketMQTemplate,内置对象
    • extRocketMQTemplate,需自定义的RocketMQTemplate

    RocketMQTemplate,其实封装了Spring message 和 rocket-client 的相关转换,实现

    在这里插入图片描述
    同步发送,代码示例

        /**
         * Send string
         * localhost:10001/sendString
         */
        @GetMapping("/sendString")
        public void sendString() {
            SendResult sendResult = rocketMQTemplate.syncSend(springTopic, "Hello, World!");
            System.out.printf("syncSend1 to topic %s sendResult=%s %n", springTopic, sendResult);
    
            sendResult = rocketMQTemplate.syncSend(userTopic, new User().setUserAge((byte) 18).setUserName("Kitty"));
            System.out.printf("syncSend1 to topic %s sendResult=%s %n", userTopic, sendResult);
    
            sendResult = rocketMQTemplate.syncSend(userTopic, MessageBuilder.withPayload(
                    new User().setUserAge((byte) 21).setUserName("Lester")).setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON_VALUE).build());
            System.out.printf("syncSend1 to topic %s sendResult=%s %n", userTopic, sendResult);
        }
    
    

    异步发送,代码示例

        /**
         * 异步
         * Send user-defined object
         * localhost:10001/send-with-user-defined
         */
        @GetMapping("/send-with-user-defined")
        public void userDefined() {
            rocketMQTemplate.asyncSend(orderPaidTopic, new OrderPaidEvent("T_001", new BigDecimal("88.00")), new SendCallback() {
                @Override
                public void onSuccess(SendResult var1) {
                    System.out.printf("async onSucess SendResult=%s %n", var1);
                }
    
                @Override
                public void onException(Throwable var1) {
                    System.out.printf("async onException Throwable=%s %n", var1);
                }
    
            });
        }
    
    

    单向发送,代码示例

        /**
         * 单向发送
         */
        @GetMapping("/send-with-oneWay")
        public void sendOneWay() {
            rocketMQTemplate.sendOneWay(orderPaidTopic, new OrderPaidEvent("T_001", new BigDecimal("88.00")));
        }
    

    事务监听处理

        /**
         * Send transactional messages using rocketMQTemplate
         * localhost:10001/send-transactional-rocketMQTemplate
         */
        @GetMapping("/send-transactional-rocketMQTemplate")
        public void transactionalRocketMQTemplate() {
            String[] tags = new String[]{"TagA", "TagB", "TagC", "TagD", "TagE"};
            for (int i = 0; i < 10; i++) {
                try {
    
                    Message msg = MessageBuilder.withPayload("rocketMQTemplate transactional message " + i).
                            setHeader(RocketMQHeaders.TRANSACTION_ID, "KEY_" + i).build();
                    SendResult sendResult = rocketMQTemplate.sendMessageInTransaction(
                            springTransTopic + ":" + tags[i % tags.length], msg, null);
                    System.out.printf("------rocketMQTemplate send Transactional msg body = %s , sendResult=%s %n",
                            msg.getPayload(), sendResult.getSendStatus());
    
                    Thread.sleep(10);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    

    // todo 这里还有很多种方式,具体操作场景、差别还有待研究,学习

    2.2、consumer

    这里比较简单,代码示例如下

    /**
     * StringConsumer
     */
    @Service
    @RocketMQMessageListener(topic = "${demo.rocketmq.topic}",
            consumerGroup = "string_consumer",
            selectorExpression = "${demo.rocketmq.tag}")
    public class StringConsumer implements RocketMQListener<String> {
        @Override
        public void onMessage(String message) {
            System.out.printf("------- StringConsumer received: %s \n", message);
        }
    }
    
    
    /**
     * The consumer that replying String
     */
    @Service
    @RocketMQMessageListener(topic = "${demo.rocketmq.stringRequestTopic}",
            consumerGroup = "${demo.rocketmq.stringRequestConsumer}",
            selectorExpression = "${demo.rocketmq.tag}")
    public class StringConsumerWithReplyString implements RocketMQReplyListener<String, String> {
    
        @Override
        public String onMessage(String message) {
            System.out.printf("------- StringConsumerWithReplyString received: %s \n", message);
            return "reply string";
        }
    }
    
    

    其他,需自行学习…

    三、阿里云 ONS

    首先,对于测试学习,挺贵的哈,但是却提供了非常可靠的消息机制
    使用上也很简单,引入 SDK

        <!-- https://mvnrepository.com/artifact/com.aliyun.openservices/ons-client -->
            <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>ons-client</artifactId>
                <version>1.8.6.Final</version>
            </dependency>
    

    3.1、配置

    rocketmq:
      producer:
      producerId: GroupId#生产者id(旧版本是生产者id,新版本是groupid),
      msgTopic: Test #生产主题
      accessKey: XXX  #连接通道
      secretKey: XXX  #连接秘钥
      onsAddr:  #生产者ons接入域名
    

    3.2、使用

    配置类

    package com.tonels.spring.boot.rocketmq.producer;
    
    import com.aliyun.openservices.ons.api.ONSFactory;
    import com.aliyun.openservices.ons.api.Producer;
    import com.aliyun.openservices.ons.api.PropertyKeyConst;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.util.Properties;
    
    /**
     * rocketmq生产者启动初始化类
     *
     */
    @Component
    public class RocketmqProducerInit {
    
        @Value("${rocketmq.producer.producerId}")
        private String producerId;
    
        @Value("${rocketmq.producer.accessKey}")
        private String accessKey;
    
        @Value("${rocketmq.producer.secretKey}")
        private String secretKey;
    
        @Value("${rocketmq.producer.onsAddr}")
        private String ONSAddr;
    
        private static Producer producer;
    
        @PostConstruct
        public void init(){
            System.out.println("初始化启动生产者!");
            // producer 实例配置初始化
            Properties properties = new Properties();
            //您在控制台创建的Producer ID
            properties.setProperty(PropertyKeyConst.GROUP_ID, producerId);
            // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.setProperty(PropertyKeyConst.AccessKey, accessKey);
            // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
            properties.setProperty(PropertyKeyConst.SecretKey, secretKey);
            //设置发送超时时间,单位毫秒
            properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
            // 设置 TCP 接入域名(此处以公共云生产环境为例),设置 TCP 接入域名,进入 MQ 控制台的消费者管理页面,在左侧操作栏单击获取接入点获取
            properties.setProperty(PropertyKeyConst.ONSAddr, ONSAddr);
            producer = ONSFactory.createProducer(properties);
            // 在发送消息前,初始化调用start方法来启动Producer,只需调用一次即可,当项目关闭时,自动shutdown
            producer.start();
        }
    
        /**
         * 初始化生产者
         * @return
         */
        public Producer getProducer(){
            return producer;
        }
    
    }
    

    发送消息

    @Autowired
    private RocketmqProducerInit producer;
    
    public boolean sendMsg(String msg) {
            Long startTime = System.currentTimeMillis();
            Message message = new Message(msgTopic, tag, msg.getBytes());
            SendResult sendResult = producer.getProducer().send(message);
            if (sendResult != null) {
                System.out.println(new Date() + " Send mq message success. Topic is:" + message.getTopic() + " msgId is: " + sendResult.getMessageId());
            } else {
                logger.warn(".sendResult is null.........");
            }
            Long endTime = System.currentTimeMillis();
            System.out.println("单次生产耗时:"+(endTime-startTime)/1000);
            return true;
        }
    
    展开全文
  • 什么是云计算,云计算的三种类型

    万次阅读 2020-12-29 16:11:29
    什么是云计算,云计算的三种类型1、什么是云计算1.1 云计算的五个基本特征1)自助服务2)广泛的网络访问3)资源池化4)快速弹性5)计费服务1.2 云计算的4种部署类型1)私有2)社区3)公共4)混合1.3 云计算...

    什么是云计算,云计算的三种类型

    原文链接:云计算技术与应用学习教程(精华版)

    1、什么是云计算

    计算设备也称为计算资源,计算资源包括 CPU、内存、硬盘和网络。而在机房中,磁盘只是存储大类中的一种,存储还包括磁带库、阵列、SAN、NAS 等,这些统称为存储资源。另外,CPU、内存只是服务器的部件,我们统一用服务器资源来代替 CPU 和内存资源的说法。

    广义的计算资源还包括应用软件和人力服务,如果不特别声明,那么后续章节中提到的计算资源就是指服务器、存储、网络、应用软件和人力服务。

    不同于传统的计算机,云计算引入了一种全新的方便人们使用计算资源的模式,即云计算能让人们方便、快捷地自助使用远程计算资源。

    计算资源所在地称为云端(也称为云基础设施),输入/输出设备称为云终端。

    云终端就在人们触手可及的地方,而云端位于“远方”(与地理位置远近无关,需要通过网络才能到达),两者通过计算机网络连接在一起。

    云终端与云端之间是标准的 C/S 模式,即客户端/服务器模式——客户端通过网络向云端发送请求消息,云端计算处理后返回结果。

    云计算的可视化模型如图 1 所示。

    云计算的可视化模型
    图 1 云计算的可视化模型

    云计算具有 5 个基本特征、4 种部署模型和 3 种服务模式。

    1.1 云计算的五个基本特征

    1)自助服务

    消费者不需要或很少需要云服务提供商的协助,就可以单方面按需获取云端的计算资源。

    2)广泛的网络访问

    消费者可以随时随地使用任何云终端设备接入网络并使用云端的计算资源。常见的云终端设备包括手机、平板、笔记本电脑、PDA 掌上电脑和台式机等。

    3)资源池化

    云端计算资源需要被池化,以便通过多租户形式共享给多个消费者,也只有池化才能根据消费者的需求动态分配或再分配各种物理的和虚拟的资源。消费者通常不知道自己正在使用的计算资源的确切位置,但是在自助申请时允许指定大概的区域范围(比如在哪个国家、哪个省或者哪个数据中心)。

    4)快速弹性

    消费者能方便、快捷地按需获取和释放计算资源,也就是说,需要时能快速获取资源从而扩展计算能力,不需要时能迅速释放资源以便降低计算能力,从而减少资源的使用费用。对于消费者来说,云端的计算资源是无限的,可以随时申请并获取任何数量的计算资源。

    但是我们一定要消除一个误解,那就是一个实际的云计算系统不一定是投资巨大的工程,也不一定要购买成千上万台计算机,也不一定具备超大规模的运算能力。其实一台计算机就可以组建一个最小的云端,云端建设方案务必采用可伸缩性策略,刚开始时采用几台计算机,然后根据用户数量规模来增减计算资源。

    5)计费服务

    消费者使用云端计算资源是要付费的,付费的计量方法有很多,比如根据某类资源(如存储、CPU、内存、网络带宽等)的使用量和时间长短计费,也可以按照每使用一次来计费。但不管如何计费,对消费者来说,价码要清楚,计量方法要明确,而云服务提供商需要监视和控制资源的使用情况,并及时输出各种资源的使用报表,做到供/需双方费用结算清清楚楚、明明白白。

    1.2 云计算的4种部署类型

    1)私有云

    云端资源只给一个单位组织内的用户使用,这是私有云的核心特征。而云端的所有权、日常管理和操作的主体到底属于谁并没有严格的规定,可能是本单位,也可能是第三方机构,还可能是二者的联合。云端可能位于本单位内部,也可能托管在其他地方。

    2)社区云

    云端资源专门给固定的几个单位内的用户使用,而这些单位对云端具有相同的诉求(如安全要求、云端使命、规章制度、合规性要求等)。云端的所有权、日常管理和操作的主体可能是本社区内的一个或多个单位,也可能是社区外的第三方机构,还可能是二者的联合。云端可能部署在本地,也可能部署于他处。

    3)公共云

    云端资源开放给社会公众使用。云端的所有权、日常管理和操作的主体可以是一个商业组织、学术机构、政府部门或者它们其中的几个联合。云端可能部署在本地,也可能部署于其他地方,比如中山市民公共云的云端可能就建在中山,也可能建在深圳。

    4)混合云

    混合云由两个或两个以上不同类型的云(私有云、社区云、公共云)组成,它们各自独立,但用标准的或专有的技术将它们组合起来,而这些技术能实现云之间的数据和应用程序的平滑流转。由多个相同类型的云组合在一起属于多云的范畴。

    比如两个私有云组合在一起,混合云属于多云的一种。由私有云和公共云构成的混合云是目前最流行的——当私有云资源短暂性需求过大(称为云爆发,Cloud Bursting)时,自动租赁公共云资源来平抑私有云资源的需求峰值。

    例如,网店在节假日期间点击量巨大,这时就会临时使用公共云资源来应急。

    1.3 云计算的三种服务

    1)软件即服务(Software as a Service,SaaS)

    云服务提供商把 IT 系统中的应用软件层作为服务出租出去,消费者不用自己安装应用软件,直接使用即可,这进一步降低了云服务消费者的技术门槛。

    2)平台即服务(Platform as a Service,PaaS)

    云服务提供商把 IT 系统中的平台软件层作为服务出租出去,消费者自己开发或者安装程序,并运行程序。

    3)基础设施即服务(Infrastructure as a Service,IaaS)

    云服务提供商把 IT 系统的基础设施层作为服务出租出去,由消费者自己安装操作系统、中间件、数据库和应用程序。

    云计算的精髓就是把有形的产品(网络设备、服务器、存储设备、各种软件等)转化为服务产品,并通过网络让人们远距离在线使用,使产品的所有权和使用权分离。正如洗衣店老板把洗衣机这种有形产品转化为洗衣服务一样,消费者直接投币自助洗衣,这样一方面提高了洗衣机的使用率,另一方面又降低了消费者购买洗衣机的支出。

    通过云计算,提供商把计算资源转化为服务产品并销售给用户,服务产品有别于其他的有形产品(如空调、桌子、啤酒、书籍等),所以有人提出了云计算的第 4 种服务模式——DaaS(数据即服务,就是出租 IT 系统的最顶层)。

    以一个单位组织(如企业、部门或团体等)的名义去租赁云计算服务时,云服务提供商称呼该单位组织为一个租户,而一个租户包含若干个用户(单位内的员工),这些用户当中有的是该租户的管理员,有的是操作员等。

    比如 XXX 企业向 SaaS 云服务提供商租赁了 ERP 系统,云服务提供商认为 XXX 企业是一个租户,然后给它分配管理员账号和密码。XXX 企业指定员工张三为租户管理员,张三登录云平台自助网站创建更多的普通账号,然后把这些账号分配给公司内部的相关业务人员(如会计人员、人事经理、仓库管理员等)。

    一个租户允许只有一个用户,也允许有多个用户。云服务提供商只与租户(法人代表)之间存在租赁合同关系,并与租户进行费用结算,示意图如图 2 所示。

    云服务提供商与租户

    2、云计算的三种模式

    IT 系统的逻辑组成分为四层,自下至上依次是基础设施层、平台软件层、应用软件层和数据信息层。

    云计算是一种新的计算资源使用模式,云端本身还是 IT 系统,所以逻辑上同样可以划分为这四层。底三层可以再划分出很多“小块”并出租出去,这有点像立体停车房,按车位大小和停车时间长短收取停车费。因此,云服务提供商出租计算资源有 3 种模式,满足云服务消费者的不同需求,分别是 IaaS、PaaS、SaaS,如图 1 所示。

    云计算的3种服务模式
    图 1 云计算的 3 种服务模式

    需要注意的是,云服务提供商只负责出租层及以下各层的部署、运维和管理,而租户自己负责更上层次的部署和管理,两者负责的“逻辑层”加起来刚好就是一个完整的四层 IT 系统。

    比如有一家云服务提供商对外出租 IaaS 云计算业务,云服务提供商负责机房基础设施、计算机网络、磁盘柜和服务器/虚拟机的建设和管理,而云服务消费者自己完成操作系统、数据库、中间件和应用软件的安装和维护。另外,还要管理数据信息(如初始化、数据备份、恢复等)。

    再比如,另一家云服务提供商出租 PaaS 业务,那么云服务提供商负责的层数就更多了,云服务消费者只需安装自己需要的应用软件并进行数据初始化即可。总之,云服务提供商和消费者各自管理的层数加起来就是标准的 IT 系统的逻辑层次结构。

    2.1 IaaS

    IaaS 是“Infrastructure as a Service”的首字母缩写,意思是基础设施即服务,即把 IT 系统的基础设施层作为服务出租出去。由云服务提供商把 IT 系统的基础设施建设好,并对计算设备进行池化,然后直接对外出租硬件服务器、虚拟主机、存储或网络设施(负载均衡器、防火墙、公网IP地址及诸如 DNS 等基础服务)等。

    云服务提供商负责管理机房基础设施、计算机网络、磁盘柜、服务器和虚拟机,租户自己安装和管理操作系统、数据库、中间件、应用软件和数据信息,所以 IaaS 云服务的消费者一般是掌握一定技术的系统管理员,如图 1 所示。

    Iaas云
    图 1 IaaS 云

    IaaS 云服务提供商计算租赁费用的因素包括 CPU、内存和存储的数量,一定时间内消耗的网络带宽,公网 IP 地址数量及一些其他需要的增值服务(如监控、自动伸缩等)等。

    出租的物理服务器和虚拟机统称为主机,云服务提供商如何对外出租主机呢?或者是租户如何使用这些租来的主机呢?相对于租户来说,这些主机不在现场而在“远方”,租赁之后并不是把这些主机从云端搬到租户的办公室来使用。

    出租前后主机的物理位置并没有改变,租户仍然是通过网络使用这些云端主机。租户登录云服务提供商的网站,填写并提交主机配置(如需要多少个 CPU、多少内存、多少网络带宽等)表后付款,然后云服务提供商向租户颁发账号和密码,最后租户以此账号和密码登录云端的自助网站。

    在这里,租户可以管理自己的主机:启动和关闭机器、安装操作系统、安装和配置数据库、安装应用软件等。其实只有启动机器和安装操作系统必须要在自助网站上完成,其他操作可以直接登录到已经安装了操作系统并配置好网卡的主机中完成。

    对于租来的主机,租户只关心计算资源(CPU、内存、硬盘)的容量是否与租赁合同上标注的一致,就像租赁同一层楼上的一间房间一样,租户只关心面积是否足够,而不关心房间的墙壁是钢筋水泥结构还是砖块石灰结构。但是对于云服务提供商来说,出租硬件服务器和虚拟机,内部的技术处理是不一样的,其中硬件服务器必须要集成远程管理卡并要池化到资源池中。

    远程管理卡是插接在服务器主板上或者直接集成在主板上的一个嵌入式系统,需要接网线并配置 IP 地址。只要服务器的电源插头插到插座上,不管有没有按下服务器的电源开关,这个远程管理卡都会启动,其他人就可以通过网络登录到远程管理卡(需要账号和密码),成功登录后就可以进行启动和关闭服务器、安装操作系统等操作。只不过云服务提供商把远程管理卡的功能集成到了租户自助网站中,从而实现了物理机和虚拟机的统一管理。

    IaaS 云端的基本架构模型如图 2 所示。

    IaaS云端基本架构模型
    图 2 IaaS 云端基本架构模型

    IaaS 云端的基本架构模型逻辑上分为三层:第一层管理全局,第二层管理计算机集群(一个集群内的机器地理位置上可能相距很远),第三层负责运行虚拟机。

    第一层的云管理器与第二层的集群管理器之间一般通过高速网络连接,当增加数据中心为云端扩容时,就能体现网速的重要性。而集群内的计算机之间倾向于采用本地局域网(如 10Gbit/s 以太网)或者超高速广域网,如果采用局域网,则灾难容错差;如果跨广域网,则网络带宽会成为瓶颈。

    第一层(云管理器)

    云管理器是云端对外的总入口,在这里验证用户身份,管理用户权限,向合法用户发放票据(然后用户持此票据使用计算资源)、分配资源并管理用户租赁的资源。

    第二层(集群管理器)

    每一个集群负责管理本集群内部的高速互联在一起的计算机,一个集群内的计算机可能有成百上千台。

    集群管理器接受上层的资源查询请求,然后向下层的计算机管理器发送查询请求,最后汇总并判断是部分满足还是全部满足上层请求的资源,再反馈给上层。如果接下来收到上层分配资源的命令,那么集群管理器指导下层的计算机管理器进行资源分配并配置虚拟网络,以便能让用户后续访问。

    另外,本层 PLS 中存储了本集群内的全部虚拟机镜像文件,这样一台虚拟机就能在集群内任意一台计算机上运行,并轻松实现虚拟机热迁移。

    第三层(计算机管理器)

    每台计算机上都有一个计算机管理器,它一方面与上层的集群管理器打交道,另一方面与本机上的虚拟机软件打交道。它把本机的状态(如正在运行的虚拟机数、可用的资源数等)反馈给上层,当收到上层的命令时,计算机管理器就指导本机的虚拟机软件执行相应命令。这些命令包括启动、关闭、重启、挂起、迁移和重配置虚拟机,以及设置虚拟网络等。

    租赁 IaaS 云服务,对租户而言,最大优点是其灵活性,由租户自己决定安装什么操作系统、需不需要数据库且安装什么数据库、安装什么应用软件、安装多少应用软件、要不要中间件、安装什么中间件等,相当于购买了一台计算机,要不要使用、何时使用以及如何使用全由自己决定。

    一些搞研发的计算机技术人员倾向于租赁 IaaS 主机。但是对于租户来说,IaaS 云主机除管理难度大外,还有一个明显的缺陷:计算资源浪费严重。因为操作系统、数据库和中间件本身要消耗大量的计算资源(CPU、内存和磁盘空间),但它们消耗的资源对租户来说做的是无用功,来看下面这个极端的案例。

    假设张三租用了一台 IaaS 主机,配置为 CPU1.0GHz,内存 1GB,硬盘空间 10GB,然后他安装了 Windows7 操作系统、MySQL 数据库,最后再想安装和运行绘图应用软件几乎是不可能了,因为 Windows7 操作系统和 MySQL 数据库就要把 CPU、内存和硬盘空间消耗殆尽了。

    没有硬盘空间,如何安装应用软件?没有空闲的内存,又如何能运行应用软件?张三本来打算租赁云端主机来搞图形设计,这样一来,目的就没达到,至少租来的主机的配置要翻倍才行。

    下面是一些 IaaS 云服务的实际应用。

    1. 备份和恢复服务。
    2. 计算服务:提供弹性资源。
    3. 内容分发网络(CDN):把内容分发到靠近用户的地方,对于一些基于网页的应用系统,为了提高用户体验,往往在各个地方(人口稠密的地方)设立分支服务器,当用户浏览网页时,被重定向到本地 Web 服务器,所以数据必须实时分发并保持一致。
    4. 服务管理:管理云端基础设施平台的各种服务。
    5. 存储服务:提供用于备份、归档和文件存储的大规模可伸缩存储。

    2.2 PaaS

    PaaS 是“Platform as a Service”的首字母缩写,意为平台即服务,即把 IT 系统的平台软件层作为服务出租出去,如图 1 所示。

    PaaS云
    图 1 PaaS 云

    相比于 IaaS 云服务提供商,PaaS 云服务提供商要做的事情增加了,他们需要准备机房、布好网络、购买设备、安装操作系统、数据库和中间件,即把基础设施层和平台软件层都搭建好,然后在平台软件层上划分“小块”(习惯称之为容器)并对外出租。

    PaaS 云服务提供商也可以从其他 IaaS 云服务提供商那里租赁计算资源,然后自己部署平台软件层。另外,为了让消费者能直接在云端开发调试程序,PaaS 云服务提供商还得安装各种开发调试工具。相反,租户要做的事情相比 IaaS 要少很多,租户只要开发和调试软件或者安装、配置和使用应用软件即可。PaaS 云服务的消费者主要包括以下人员。

    • ​ 程序开发人员:写代码、编译、调试、运行、部署、代码版本控制等,一揽子解决。
    • ​ 程序测试人员。
    • ​ 软件部署人员:把软件部署到 PaaS 云端,便于管理不同版本之间的冲突。
    • ​ 应用软件管理员:便于配置、调优和监视程序运行性能。
    • ​ 应用程序最终用户:这时 PaaS 云服务相当于 SaaS 云服务。

    PaaS 云服务的费用计算一般根据租户中的用户数量、用户类型(如开发员、最终用户等)、资源消耗量及租期等因素计算。图 2 所示描绘了 PaaS 云服务供/需双方的动态交互情况。

    PaaS云服务供/需双方动态交互示意图
    图 2 PaaS 云服务供/需双方动态交互示意图

    云服务提供商拥有一个应用软件库(图 1 中“A,B,C,…”代表库中的应用软件)、开发工具集(如编程语言、IDE、调试工具等)和软件执行资源池(图 1 中“exr1,exr2,…”代表资源),消费者通过网络远程租赁软件执行资源并运行相关的应用软件,或者使用各种开发工具。

    软件执行资源有“可用”和“占用”两个状态,同一个资源不能同时运行多个程序。软件执行资源可能是物理机、虚拟机、容器或者一个正在运行的服务程序(响应消费者的请求,启动虚拟机或容器,甚至是租赁其他云端的计算资源)。

    图 2A 中,用户 C1 申请了两个资源:exr1 和 exr2,并运行 B、C 两个程序。

    图 2B 中,新来了一个程序开发员,他正在使用开发工具开发程序。

    图 2C 中,程序开发员开发完成并部署了一个新程序 D。

    图 2D 中,一个管理员发布了程序 D,然后新来的用户申请资源 exr3 并执行程序 D。

    PaaS 的优势就是解决应用软件依赖的运行环境(如中间件、数据库、运行库等),其所依赖的软件全部由云服务提供商安装,所以当租户安装应用软件时,就不会再出现连续报错的情况。应用软件就像歌唱家,当其唱歌表演时需要一个舞台,这个舞台就是由基础设施层和平台软件层堆叠起来的。

    平台软件层包括操作系统、数据库、中间件和运行库四部分,但并不是说在具体搭建平台软件层时一定要安装和配置这四部分软件,需要哪部分以及安装什么种类的平台软件要根据应用软件来定。比如一家只针对 PHP 语言开发(应用软件用 PHP 编写)的 PaaS 云服务提供商,就没必要安装类似 Tomcat 的中间件了。根据平台软件层中安装的软件种类多少,PaaS 又分为两种类型。

    1)半平台 PaaS

    平台软件层中只安装了操作系统,其他的留给租户自己解决。最为流行的半平台 PaaS 应用是开启操作系统的多用户模式,为每个租户创建一个系统账号,并对他们做权限控制和计算资源配额管制。半平台 PaaS 更关注租户的类型,如研发型、文秘型等,针对不同类型的租户做不同的权限和资源配置。

    Linux 操作系统的多用户模式和 Windows 操作系统的终端服务都属于半平台 PaaS,私有办公云多采用半平台 PaaS。

    2)全平台 PaaS

    全平台 PaaS 安装了应用软件依赖的全部平台软件(操作系统、数据库、中间件、运行库)。不同于半平台 PaaS,全平台 PaaS 是针对应用软件来做资源配额和权限控制的,尽管最终还需要通过账号实现。公共云多采用全平台 PaaS。

    相对于 IaaS 云服务,PaaS 云服务消费者的灵活性降低了,租户不能自己安装平台软件,只能在有限的范围内选择。但优点也很明显,租户从高深烦琐的 IT 技术中解放出来,专注于应用和自己的核心业务。

    下面是一些 PaaS 云服务的实际应用。

    1. 商业智能(BI):用于创建仪表盘、报表系统、数据分析等应用程序的平台。
    2. 数据库:提供关系型数据库或者非关系型数据库服务。
    3. 开发和测试平台。
    4. 软件集成平台。
    5. 应用软件部署:提供应用软件部署的依赖环境。

    2.3 SaaS

    SaaS 是“Software as a Service”的首字母缩写,意为软件即服务。简言之,就是软件部署在云端,让用户通过因特网来使用它,即云服务提供商把 IT 系统的应用软件层作为服务出租出去,而消费者可以使用任何云终端设备接入计算机网络,然后通过网页浏览器或者编程接口使用云端的软件。这进一步降低了租户的技术门槛,应用软件也无须自己安装了,而是直接使用软件,如图 1 所示。

    SaaS云
    图 1 SaaS 云

    SaaS 云服务提供商这时有 3 种选择:

    1. ​ 租用别人的 IaaS 云服务,自己再搭建和管理平台软件层和应用软件层。
    2. ​ 租用别人的 PaaS 云服务,自己再部署和管理应用软件层。
    3. ​ 自己搭建和管理基础设施层、平台软件层和应用软件层。

    总之,从云服务消费者的角度来看,SaaS 云服务提供商负责 IT 系统的底三层(基础设施层、平台软件层和应用软件层),也就是整个 T 层,最后直接把应用软件出租出去。图 2 所示是 SaaS 云服务供/需双方的动态交互示意图。

    SaaS云服务供/需双方动态交互示意图
    图 2 SaaS 云服务供/需双方动态交互示意图

    云服务提供商拥有一个应用软件库(图 2 中“A,B,C,…”代表库中的应用软件)和应用软件执行资源池(图 2 中“exr1,exr2,…”代表资源),消费者通过网络远程租赁软件执行资源并运行相关的应用软件。

    在图 2A 中,有两个用户正在使用云端的软件,其中用户 C1 运行两个程序 B 和 C,云端为该用户分配了 exr1 和 exr2 两个执行资源,exr1 执行资源用于执行 B 应用程序(图 2 中用“B(exr1”表示),exr2 执行资源用于执行 C 应用程序(图 2 中用“C(exr2”表示)。而用户 C2 正在执行一个程序 C(图 2 中用“C(exr3”表示)。

    在图 2B 中,一个新用户 C3 进来了,云端从可用的执行资源池中为他分配了 exr4 和 exr5 两个执行资源,分别执行 A 和 B 应用程序,而执行资源池中可用的资源数减少了两个。

    云服务提供商选择若干种使用面广且有利可图的应用软件,如 ERP(企业资源计划)、CRM(客户关系管理)、BI(商业智能)等,并精心安装和运维,让租户用得放心、安心。

    适合做 SaaS 的应用软件有的几个特点

    1)复杂

    软件庞大、安装复杂、使用复杂、运维复杂,单独购买价格昂贵,如 ERP、CRM 系统及可靠性工程软件等。

    2)主要面向企业用户

    3)模块化结构

    按功能划分成模块,租户需要什么功能就租赁什么模块,也便于按模块计费,如 ERP 系统划分为订单、采购、库存、生产、财物等模块。

    4)多租户

    能适合多个企业中的多个用户同时操作,也就是说,使用同一个软件的租户之间互不干扰。租户一般指单位组织,一个租户包含多个用户。

    5)多币种、多语言、多时区支持

    这一点对于公共云尤其明显,因为其消费者来自五湖四海。

    6)非强交互性软件

    如果网络延时过大,那么强交互性软件作为 SaaS 对外出租就不太合适,会大大降低用户的体验度,除非改造成弱交互性软件或者批量输入/输出软件。

    适合云化并以 SaaS 模式交付给用户的软件

    1)企事业单位的业务处理类软件

    这类软件一般被单位组织用来处理提供商、员工、投资者和客户相关的业务,如开具发票、资金转账、库存管理及客户关系管理等。

    2)协同工作类软件

    这类软件用于团队人员一起工作,团队成员可能都是单位组织内部的员工,也可能包含外部的人员。例如日历系统、邮件系统、屏幕分享工具、协作文档创作、会议管理及在线游戏。

    3)办公类软件

    这类软件用于提高办公效率,如文字处理、制表、幻灯片编辑与播放工具,以及数据库程序等。基于 SaaS 云服务的办公软件具备协同的特征,便于分享,这是传统的本地化办公软件所没有的。

    4)软件工具类

    这类软件用来解决安全性或兼容性问题,以及在线软件开发,如文档转换工具、安全扫描和分析工具、合规性检查工具及线上网页开发等。

    随着因特网进一步延伸到世界各地,带宽和网速进一步改善,以及云服务提供商通过近距离部署分支云端,从而进一步降低网络延时,可以预计,能够云化的软件种类将越来越多。但是无论如何,下面三类软件不适合作为公共 SaaS 云服务出租。

    不适合作为公共 SaaS 云服务出租的软件

    1)实时处理软件

    比如飞行控制系统、工厂作业机器人控制等,这类软件要求任务完成时间非常精准(甚至达到微秒级)。假如云化,单单横亘在 SaaS 云端与消费者之间的网络延时就是一个难以承受的不可控因素,更不要说其他因素了。

    2)时时产生并处理大量消费者数据的软件

    诸如视频监控、环境信息收集处理等时时产生并要处理大规模的数据信息(可能每秒达 GB 级)的软件,在目前和未来几年内的因特网宽带条件下,不适合云化,因为如此大规模的数据很难实时传输到 SaaS 云端进行处理。

    3)关键软件

    这类软件如果运行异常,将会导致人员伤亡或者重大财产损失。为了提高这类软件的可靠性,最主要的方法是降低软件的复杂度——软件本身的复杂度和运行环境的复杂度,因为越简单就越可靠。而 SaaS 云服务环境包含着复杂的软/硬件栈(9 层的 IT 系统),以及不可预测的网络带宽、延时、丢包因素,绝对不合适云化此类关键软件并以公共 SaaS 云服务模式交付给用户使用。

    针对私有云或者社区云,如果云端就在本地,且消费者通过局域网接入云端,那么上面三类软件也可以 SaaS 模式部署。

    4. 与传统的软件运行模式相比,SaaS 模式具有的优点:

    1)云终端少量安装或不用安装软件

    直接通过浏览器访问云端 SaaS 软件,非常方便且具备很好的交互体验,消费者使用的终端设备上无须额外安装客户端软件。

    配置信息和业务数据没有存放在云终端里,所以不管用户何时何地使用何种终端操作云端的软件,都能看到一样的软件配置偏好和一致的业务数据。云终端成了无状态设备。

    2)有效使用软件许可证

    软件许可证费用能大幅度降低,因为用户只用一个许可证就可以在不同的时间登录不同的计算机;而在非 SaaS 模式下,必须为不同的计算机购买不同的许可证(即使计算机没被使用)——过度配置许可证现象。

    另外,专门为保护软件产权而购置的证书管理服务器也不用买了,因为在 SaaS 模式下,软件只运行在云端,软件开发公司只跟云服务提供商打交道并进行软件买卖结算即可。

    3)数据安全性得到提高

    对于公共云和云端托管别处的其他云来说,意味着 SaaS 型软件操纵的数据信息存储在云端的服务器中,云服务提供商也许把数据打散并把多份数据副本存储在多个服务器中,以便提高数据的完整性,但是从消费者的视角看,数据被集中存放和管理。

    以上那么做有一个明显的好处,那就是云服务提供商能提供专家管理团队和专业级的管理技术和设备,如合规性检查、安全扫描、异地备份和灾难恢复,甚至是建立跨城市双活数据中心。当今大的云服务提供商能够使数据安全性和应用软件可用性达到 4 个“9”的级别。

    对于云端就在本地的私有云和社区云来说,好处类似于公共云,但是抗风险能力要差一些,除非对大的意外事件提前做好预案,如为应对天灾(地震、洪水等)人祸(火灾等),建立异地灾备中心。另外,无处不在的网络接入,使人们再也不用复制数据并随身携带,从而避免数据介质丢失或者被盗。数据集中存放和管理还有利于人们分享数据信息。

    4)有利于消费者摆脱 IT 运维的技术泥潭而专注于自己的核心业务

    SaaS 云服务消费者只要租赁软件即可,而无须担心底层(基础设施层、平台软件层和应用软件层)的管理和运维。

    5)消费者能节约大量前期投资

    消费者不用装修机房,不用建设计算机网络,不用购买服务器,也不用购买和安装各种操作系统和应用软件,这样就能节省成百上千万元的资金。

    众所周知,在非云计算模式下,这些巨额的前期投资在一到两年的时间内是不会产生任何效益的,因为一个中等规模的 IT 系统建设工期就要几年的时间——包括机房选址和装修,网络设备采购和综合布线,机器设备采购、安装和调试,软件部署、测试和转产上线等。

    但是 SaaS 云服务也给人们带来了新的挑战,如完全依赖网络、跨因特网对安全防范措施要求更高、云端之间的数据移植性不够好、租户隔离和资源使用效率二者之间需要综合平衡考虑(详见教程后面章节“租户隔离”的相关内容)等。

    SaaS 云服务的实际应用

    1)电子邮件和在线办公软件

    用于处理邮件、文字排版、电子表格和演示文档的应用软件,如谷歌邮箱(http://mail.google.com)、网易邮箱(http://mail.163.com/)、微软 Office 365 在线办公、谷歌在线文档(https://docs.google.com)等。

    2)计费开票软件

    用于处理客户有关使用和订阅产品及服务所产生的账单。

    3)客户关系管理系统(CRM)

    功能涵盖从客户呼叫中心到销售自动化的各种应用程序。

    4)协作工具

    这种软件能促进企业内部或者跨企业的团队中的成员协同合作。

    5)内容管理系统(CMS)

    用于管理数字内容,包括文本、图形图像、Web页面、业务文档、数据库表单、视频、声音、XML文件等,引入版本控制、权限管理、生命周期等。

    6)财务软件。

    7)人力资源管理系统。

    8)销售工具。

    9)社交网络:如微信、WhatsApp、LINE 等。

    10)企业资源计划(ERP)。

    11)谷歌在线翻译。

    展开全文
  • 都在说原生?到底什么是原生?

    万次阅读 多人点赞 2022-04-10 13:03:43
    原来这就是原生,还以为是有多么的高大上,还好还好,看完也不是那么难理解

    一、云原生是什么

    最近一直听到别人说云原生, 那什么是云原生呢?
    可以把云原生拆分为原生两部分。

    云,指的就是云服务器。
    在云服务器流行起来之前,我们都是通过自己购买物理服务器的方式把我们的项目部署起来的。我们需要购买物理机器,要向网络运行商购买公网IP服务,还要在公司找个地方放这些机器,作为服务器机房。
    在这里插入图片描述
    有了云服务器之后,公司不再需要购买物理设备了,我们想要上线部署自己的项目,只需要向云服务器提供商购买,就能拥有自己的服务器了,而云服务器和传统服务器相比,有很多传统服务器无法比拟的优点。比如弹性、分布式等等。
    在这里插入图片描述

    原生

    什么是原生呢?原生就是指土生土长。我们程序在开发设计的时候,在本地自建服务器运行和在云服务器运行,项目的架构设计等方面,都是完全不一样的。
    而原生,就是指,应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,要充分利用云上资源的优点,从而使我们的的应用更强大,更迅速、更稳定。
    在这里插入图片描述

    云+原生

    所以,云原生指的并不是某个技术,它更像是一个技术体系。
    就举个例子,云原生你不熟悉,那大数据总该熟悉了吧?而大数据,里面包括的Spark、Hadoop等技术。
    云原生也是这样,也是由一些我们经常熟知的技术所组成的。我们接着往下看。

    二、云原生四要素

    其实云原生概这个概念的提出来源于谷歌主导的一个基金会原原生计算基金会简称是CNCF。
    在这里插入图片描述
    CNCF在经过了好几代的更新之后,他给出了一个回答, 云原生的四要素包括:

    微服务

    几乎每个云原生的定义都包含微服务,跟微服务相对的是单体应用,微服务有理论基础,那就是康威定律,指导服务怎么切分,很玄乎,凡是能称为理论定律的都简单明白不了,不然就忒没b格,大概意思是组织架构决定产品形态,不知道跟马克思的生产关系影响生产力有无关系。微服务架构的好处就是按function切了之后,服务解耦,内聚更强,变更更易;另一个划分服务的技巧据说是依据DDD来搞。

    容器化

    Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,谷歌搞的,Docker和K8S都采用Go编写,都是好东西。

    DevOps

    这是个组合词,Dev+Ops,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。

    持续交付

    持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。

    在这里插入图片描述

    这几个要素还是有点抽象啊。其实业界最有共识的,符合原原生架构的落地应用体系是采用k8s+docker进行容器化部署,基于微服务架构开发前后端完全分离的应用,提高灵活性和可维护性,借助敏捷迭代方法支持功能持续迭代完善的对方工具,支持上线发布自动化利用云平台设施实现弹性伸缩,动态调整,最优化资源利用率,这样的架构共建应用简便快捷,部署应用轻松自如,运行应用5G流量分布秒杀传统的为应用架构,吊打以往的IT建设模式,是整个互联网技术发展到今日的集大成体系.

    三、具体的云原生技术有哪些

    云原生技术有很多,大体可以分为以下5种:容器、服务网格、声明书API、不可变基础设施、微服务。

    在这里插入图片描述

    容器(Containers)

    容器化终端容器化封装是指以容器为基础,应用程序封装在容器之中,在容器里运行,实现资源的相对隔离与容器镜像的重复使用,因为使用的容器化技术应用运行于容器之中,就不需要考虑底层硬件的差异,这大大简化了开发的工作量,同时对于运维人员也极为友好,不需要再为环境问题而苦恼。使用到的技术包括Docker和k8s。

    微服务(Microservices)

    向微服务,面向微服务是指把一个大的功能应用拆分成一个个功能单一,相对独立,相互解耦的微应用。微应用之间通过接口进行通讯,使用的的微服务技术比如SpirngCloud

    服务网格(Service Meshes)

    服务网格(Service Mesh)是一个专门处理服务通讯的基础设施层。它的职责是在由云原生应用组成服务的复杂拓扑结构下进行可靠的请求传送。在实践中,它是一组和应用服务部署在一起的轻量级的网络代理,并且对应用服务透明。

    不可变基础设施(Immutable Infrastructure)

    不可变基础设施里的“不可变”非常类似于程序设计中的“不可变”概念。程序设计中不可变变量(Immutable Variable)就是在完成赋值后就不能发生更改,只能创建新的来整体替换旧的。由于具有这样的特性这种变量可以在并发环境下安全的使用。对于基础设施的不可变性,最基本的就是指运行服务的服务器在完成部署后,就不在进行更改。

    声明式API(Deciarative API)

    声明式 API是Kubernetes的技术点,它的核心原理,就是当用户向 Kubernetes 提交了一个 API 对象的描述之后,Kubernetes 会负责为你保证整个集群里各项资源的状态,都与你的 API 对象描述的需求相一致。更重要的是,这个保证是一项“无条件的”、“没有期限”的承诺:对于每个保存在 etcd 里的 API 对象,Kubernetes 都通过启动一种叫做“控制器模式”(Controller Pattern)的无限循环,不断检查,然后调谐,最后确保整个集群的状态与这个 API 对象的描述一致。简单理解就是对象的声明与对象的创建相解耦,在普通程序中创建对象需要向操作系统申请资源,相似的,在容器云平台上创建对象,需要向k8s申请资源。但k8s更进一步的是,你只需要提交一个申请单,然后由k8s系统完成对象的创建。

    这些技术只是云原生组成的一部分,但是,这些技术,我们自己机房服务器,也能使用,换句话来说,如果不是云环境,就算有了这些技术,这不是云原生,云原生,一定是基于云服务器的。

    四、云服务器相对传统物理服务器的优势

    为什么我们要使用云服务器而不自己搭建物理服务器呢?
    在这里插入图片描述

    云服务器具体优势如下:

    1.灵活性:云服务器采用虚拟化技术,整合了大量集群主机的计算、网络与存储资源,其CPU、内存、硬盘、带宽等资源都可以弹性扩容,按需取用;公司的项目,都有一个特点,就是访问量不是固定的,在做活动的时候,访问量会是日常流量的几倍,为了应对这种情况,如果是物理服务器,公司就必须随时准备能应对流量最高峰的物理设备,但在流量高峰过后,这些物理设备不能像云服务器那样释放,不灵活。

    2.安全稳定性**:基于集群服务器,云服务器拥有更强的主机性能,运行更安全、稳定;

    3.方便性:云服务器操作及升级更方便,传统服务器中的资源都是有限的,如果想要获得更好的技能,只能升级云服务器,所谓“云”,就是网络、互联网的意思,云服务器就是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其操作起来更加简便,如果原来使用的配置过低,完全可以在不重装系统的情况下升级CPU、硬盘、内存等,不会影响之前的使用;

    4.低成本:云服务器有更高的性价比,云服务器是按需付费的,与传统服务器相比,用多少买多少,而且并不会造成资源浪费,而传统物理服务器,必须准备满足流量高峰的设备数量。

    五、云原生的好处

    • 快速云原生架构使用敏捷开发和单位,不但可以让企业快速的进行开发,自动化的不做产品,同时还能持续地更新产品,让产品跟得上需求,甚至是引导需求,让企业立于不败之地。
    • 弹性扩展云原生架构天生具有云计算的特点,资源可以按需进行伸缩,这样不单提高资源的利用率,也大大降低了企业成本。
    • 强壮云原生架构依托于容器编排工去k8s与微服务的组合应用,就拥有了自动恢复能力,容错能力,故障隔离能力,让应用更强。
    • 屏蔽底层差异,因为使用的容器化技术应用运行于容器之中,就不需要考虑底层硬件的差异,这大大简化了开发的工作量,同时对于运维人员也极为友好,不需要再为环境问题而苦恼。

    六、总结

    说了这么多,你可以简单的理解为,云原生就是换了个开发环境,由物理服务器换到了云服务器,然后为了适应这个云服务器的环境做了一些技术架构调整,这就是云原生。

    展开全文
  • 云计算的三种服务模式 laas:服务器 | 虚拟机 | 磁盘柜 | 计算机网络 | 机房基础设施 Paas:中间件&运行库 | 数据库 | 操作系统 | 服务器 | 虚拟机 | 磁盘柜 | 计算机网络 | 机房基础设施 ·平台软件层 Saas:...
  • 节点高可用功能主要为 PolarDB 提供金融级强一致性、高可靠性的跨机房复制能力,基于分布式共识算法同步数据库物理日志,自动failover,任意节点故障后数据零丢失。本议题主要介绍PolarDB节点高可用的功能特性和...
  • 一文搞懂原生架构

    千次阅读 多人点赞 2022-05-26 15:36:58
    在当今瞬息万变的大数据信息世界中,原生架构不再是可选的,而是必需的。变化是云中唯一不变的东西,这意味着您的软件开发环境应该足够灵活,以便在不干扰业务运营的情况下快速适应新技术和方法。原生架构为使用...
  • 原生】SpringCloud是什么?

    千次阅读 多人点赞 2022-06-26 18:30:39
    SpringCloud是一个提供一些服务框架的服务治理平台。它包括:服务注册和发现、配置中心、消息中心、负载平衡、数据监控等。封装了微服务基础架构框架Netflix的多个开源组件,并与平台和Spring boot框架集成。...
  • 数据库一直是应用开发中非常重要的一部分。从MySQL到亚马逊的RDS(关系型数据库服务,Relational Database Service),...随着海量计算的持续发展,给传统数据库带来了不少挑战,而原生数据库却可以应对这些挑战。...
  • 云计算 是什么: 云计算即分布式计算 通过使用更高性能的机器 更多的机器 来达到相关服务的计算 云计算产品分类: 如建立一个网站:要搞服务器 安装服务器软件 ...如 服务器 硬盘 Paas(软件即服务) 不用自己搞服...
  • 基础设施即服务有时缩写为 IaaS,包含云 IT 的基本构建块,通常提供对联网功能、计算机(虚拟或专用硬件)以及数据存储空间的访问。基础设施即服务提供最高等级的灵活性和对 IT 资源的管理控制,其机制与现今众多 IT...
  • 1.登录华为 2.创建共享带宽 3.创建安全组 4.创建虚拟私有(VPC) 5.创建弹性服务器(ECS) 6.搭建LAMP(Linux,Apache,MySQL,PHP)环境 7.创建并配置RDS 8.访问WordPress并进行相应配置 搭建过程 ...
  • 云计算存储的一些基本概念

    万次阅读 多人点赞 2018-04-12 20:10:04
    云计算的三种服务模式:IaaS,PaaS和SaaS 的分层 任何一个在互联网上提供其服务的公司都可以叫做云计算公司。其实云计算分几层的,分别是Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-...
  • 平台包含的基本特征介绍

    千次阅读 2019-03-12 22:18:53
    软件可充分借助于云计算的范式优势来面向服务,聚焦于无状态的、松耦合、模块化以及语义解释的能力。   人工智能、大数据、云计算和物联网的未来发展值得重视,均为前沿产业,多智时代专注于人工智能和大数据的...
  • 进程:进程是计算机中和程序关于数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程:进程的子集,它是进程内部的一个独立的执行单元,一个进程可以同时并发执行多个线程。 2、进程和线程的...
  • 原生中间件RocketMQ-核心原理之高可用机制

    千次阅读 多人点赞 2022-09-04 21:51:33
    文章目录 高可用机制解析 消息消费高可用 消息发送高可用 NameServer协调者解析 NameServer基本概念和功能 集群状态的存储结构 topicQueueTable brokerAddrTable clusterAddrTable brokerLiveTable ...
  • 面向用户的使用提供接口,目前有三种存储方式接口提供,对象存储 RGW(rados gateway)、块存储 RBD(rados block device) 和文件存储 CephFS。 块存储和文件存储都是基于对象存储来进行封装实现的,块存储和文件存储...
  • 随着云计算逐渐成为主流,安全也获得了越来越多的关注,传统和新兴的云计算厂商以及安全厂商均推出了大量安全产品。但是,与有清晰定义的“云计算”(NIST SP 800-145和ISO/IEC 17788)不同,业界对“安全”...
  • 零基础入门小程序开发函数
  • 随着智慧城市的发展,互联网脑与智慧城市的结合,相信会出现更多城市神经反射弧的案例。譬如智能驾驶,共享单车,智能护理,城市安全,智能无人商店,等等很多场景将会实现城市神经反射弧的建设,未来如何增强城市...
  • 原生系列:K8s应用安全加固技术

    万次阅读 多人点赞 2022-07-15 07:04:43
    今天叶秋学长带领大家学习原生系列:10大K8s应用安全加固技术~ 本文译自 Top 10 Kubernetes Application Security Hardening Techniques[1]。作者:Rory McCune 将应用部署到K8s集群时,开发者面临的主要挑战是...
  • 阿里DataHub基本了解

    千次阅读 2018-03-28 14:19:18
    关于阿里DataHub详细内容:阿里DataHub使用教程(DataHub服务是阿里提供的流式数据...)DataHub基本介绍阿里实时数据分发平台DataHub是流式数据(Streaming Data)的处理平台,提供对流式数据的发布(P...
  • 阿里产品介绍

    万次阅读 2021-11-09 22:20:47
    2)专有网络 VPC:2)弹性伸缩:二、阿里安全系列产品1、DDoS高防IP2、安骑士3、证书服务4、态势感知5、堡垒机、阿里网络中间件相关消息队列MQ四、阿里万网产品1、域名2、虚拟主机3、企业邮箱4、解析DNS...
  • 安全架构的设计

    千次阅读 2021-03-17 14:27:02
    公有安全概述 安全职责划分-共同担责 软件即服务SAAS 云服务厂家几乎负责所有的安全性,因为租户只能访问、管理和使用其提供的应用程序,但无法对应用程序做破坏性操作。例如:SAAS服务厂家提供安全、日志、...
  • 我们在之前的文章中 已经了解了 spark支持的模式,其中一就是 使用k8s进行管理。 hadoop组件—spark----全面了解spark以及与hadoop的区别 是时候考虑让你的 Spark 跑在K8s 上了 spark on k8s的优势–为什么要把...
  • Kubernetes(k8s)概念、架构介绍,k8s 包含的核心概念点讲解(部分基础及重要概念,掌握基本可以满足绝大部分场景的使用)。
  • 什么是原生? 原生之前 原生 原生简介 微服务 DevOps 持续交付 容器化 原生的发展历程 原生技术生态现状 原生基金会 —— CNCF 原生技术社区 原生技术产业 我们正处于时代的关键节点...
  • 原生】设备入云之FlexCloud云端组态实战篇

    千次阅读 多人点赞 2022-08-24 21:15:51
    随着工业自动化的不断发展,设备入这门技术也越来越重要,很多人都开启了学习设备入。结合上一篇的设备入云之FlexManager实际项目操作流程,本文就紧接上一篇的实例项目,详细介绍设备入的FlexCloud可视化组态...
  • ”应该可以看作互联网的一隐喻吧。 是分层的  其实云计算是分几层的,分别是Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-Service,Software(软件)-as-a-Service。基础设施在最...
  • 开篇语遇到了一件很奇怪的事情,那就是,当我的手机升级到了最新版的网易APP的时候,我发现我在WiFi下,竟然都没有办法打开任何一个歌单,以及在线听一首歌曲。凄清又惆怅!难道我才买了不久的手机,网卡就出问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,407
精华内容 58,162
热门标签
关键字:

云的三种基本状态