图片 2

1系统架构

Node.js 13.4.0 版本现已发布。其具体更新内容如下:

Progressive Web Applications take advantage of new technologies to
bring the best of mobile sites and native applications to users.
They’re reliable, fast, and engaging.

重要说明:本方是翻译自https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/\#getting-started这个文章,感谢Sabby
AnandanMarius BogoeviciEric BottardMark FisherIlayaperumal

Changes
deps:

基础知识

用户首次访问service worker控制的网站或页面时,service
worker会立刻被下载。
ServiceWorker(web worker 的一种)接口
Cache:表示对request/response对象的存储,一个域可以有多个 Cache 对象.
你将在你的代码中处理和更新缓存 . 在 Cache 除非显示地更新缓存,
否则缓存将不会被更新; 缓存数据不会过期, 除非删除它
Cache.match(request, options)返回一个Promise,查找cache中匹配的request
Cache.match(request, options)匹配一个数组对象中的request
Cache.add(request)发送请求并将请求放入cache中,
Cache.put(request, response)将request和response都添加到cache中
Cache.delete(request, options)
才cache中查找乡音的值,并删除返回一个promise,resoleve为true,如果找不到返回false
Cache,keys(request, options)返回一个promise,resolve为所有的cache键值

CacheStorage:
对Cache对象的存储,提供命名缓存的主目录,sw可以通过访问并维护名字字符串到Cache对象的映射
caches.open(cacheName).then(names){};//打开一个cache对象

Client: 表示sw client的作用域。

sw.js中的self:这个关键字表示的是一个service worker
的执行上下文的一个全局属性(ServiceWorkerGlobalScope),类似于window对象,不过这个self是作用于service
worker的全局作用域中。

GopinathanGunnar HillertMark PollackPatrick PeraltaGlenn RenfroThomas

  • 将 npm 更新到 6.13.4
  • 更新 uvwasi(Anna Henningsen)
  • 升级到 libuv 1.34.0(Colin Ihrig)

sw生命周期

图片 1

image.png

RisbergDave SyerDavid TuranskiJanne ValkealahtiOleg
Zhurakousky这些原文作者的写作成果,让我们能更好地入门学习Spring Cloud
Data
Flow的相关技术,考虑到国内中文的文档资料比较欠缺,而且基本不太成体系,所以自己希望来翻译该文章,方便学习使用。

doc:

覆盖率

图片 2

image.png

以下是原文内容的翻译,一些关键性的技术术语,本文考虑不进行翻译,保持原来的英文词汇,加强技术术语印象,而且这些技术术语强行翻译成中文的话,感觉很别扭。另一方面水平有限,文本可能有翻译不太贴切或是错误的地方,还请大家体谅,看到后多多指正。

  • docs 不赞成使用 http 完成

注意点

  1. 基于https
    可以使用http-server+ngrok配合,当然更简单的使用github。
    2.Service worker是一个注册在指定源和路径下的事件驱动worker。实际上
    SW
    在你网页加载完成同样也能捕获已经发出的请求,所以,为了减少性能损耗,我们一般直接在
    onload 事件里面注册 SW 即可。
  2. 作用域问题
    SW 的作用域不同,监听的 fetch 请求也是不一样的。
    例如,我们将注册路由换成: /example/sw.js,那么,SW 后面只会监听
    /example 路由下的所有 fetch 请求,而不会去监听其他

目录

events:

register

if(navigator.serviceWorker){
    navigator.serviceWorder.register('sw.js')
        .then(registration  =>  {
              console.log(`registered event at scope:${registration.scope}`);
        })
        .cache(err => {
               throw err;
         })
}

入门…
2

  • 添加 captureRejection 选项

install

self.addEventListener('install', function(event) {
  // Perform install steps
});

缓存文件

const cacheVersion = 'v1';
const cacheList = [
    '/',
    'index.html',
    'logo.png',
    'manifest.json',
    '/dist/build.js'
];
self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open(cacheVersion).then(function(cache) {
      return cache.addAll([cacheList]);
    })
  );
});

event.waitUntil()参数必须为promise,它可以延长一个事件的作用时间,因为我们在打开缓存或者更新的时候很有可能会有延迟,而event.waitUntil()可以防止事件终端。另外它会监听所有的异步promise,一旦有一个reject那么该次event便是失败的,也就是说sw启动失败。当然如果有些文件比较大不好缓存的话别让它返回就好了:

cache.addAll([cachelist1]);
return cache.addAll([cachelist2]);

1. 系统要求…
2

http:

fetchEvent

缓存捕获,当发起请求的时候将request和response缓存下来(缓存一开始定义的缓存列表)。

self.addEventListener('fetch', (event) => {
    event.respondWith(
        caches.match(event.request)
            .then(response => {
                if(response){
                    return reponse;
                 }
                  return fetch(event.request);
             })
    )
})

这是个比较简单的格式,event.respondWith(r),包含请求响应代码,可以设置一个参数r,r是一个promise,resolve之后是一个response对象。整段代码意思就是当请求一个文件时,如果缓存中已经有了,那么就直接返回缓存结果,否则发起请求。

2. 部署Spring Cloud Data Flow 本地服务器…
2

  • 添加 captureRejection 支持
  • llhttp 选择加入不安全的HTTP标头解析
问题:如果没有缓存我们怎么处理?
  1. 等下次sw根据路由去缓存;
  2. 手动缓存

2.1. Maven 配置…
4

http2:

手动缓存
self.addEventListener('fetch', event => {
    event.respondWith(
        caches.match(event.request)
            .then(response => {
                if(response){
                    return response;
                }
                //fetch请求的request、response都定义为stream对象,所以只能读一次这里需要clone一个新的
                let requestObj = event.request.clone();

                return fetch(requestObj)
                            .then(response => {
                                //检测是否成功
                                if(!response || response.status !== 200 || response.type !== 'basic') {
                                    return response;
                                }
                                //如果请求成功,第一要去渲染,第二要缓存
                                //cache.put()也使用stream,所以这里也需要复制一份
                                let responseObj = response.clone();

                                caches.open(cacheVersion)
                                    .then(cache => {
                                        cache.put(event.request, responseObj);
                                    });
                                return response;

                            })
            })
    )
})

3. 应用程序设置…
5

  • 为“request”和“stream”事件实施捕获指令
为什么stream只能读一次?

当可读流读取一次之后可能已经读到stream结尾或者stream已经close了,这里request和response都实现了clone接口来复制一份,所以在需要二次使用stream的时候就需要用副本来实现了。

应用程序…
5

net:

删除旧的缓存

self.addEventListener('activate', evnet => {
    event.waitUntil(
        caches.keys().then(cacheNames => {
            return Promise.all(
                cacheNames.filter(cachename => {
                    if(cachename == cacheVersion){
                        return caches.delete(cachename);
                    }
                })
            ).then(() => {
                return self.clients.claim()
            })
        })
    )
})

我们检查之前保存的sw缓存,还要注意一点就是Promise.all()中不能有undefined,所以我们对于相同的版本要过滤,因而不使用map,避免返回undefined。
通过调用 self.clients.claim() 取得页面的控制权,
这样之后打开页面都会使用版本更新的缓存。

系统架构…
6

  • 实施“connection”事件的捕获拒绝

更新

当你更新了你的sw文件,并修改了cacheVersion之后,刷新浏览器,期待的变化并没有发生,因为虽然你改变了缓存版本,但是此时旧的sw还在控制整个应用,新的sw并没有生效。这时就需要更新一下sw,有以下方法

  1. registration.update() ,也就是在注册的时候选择合适方式更新

navigator.serviceWorker.register('/sw.js').then(reg => {
  // sometime later…
    reg.update();
});
  1. 使用self.skipWaiting();
    在install阶段使用这个可以使得新的sw立即生效。

self.addEventListener('install', event => {
  self.skipWaiting();

  event.waitUntil(
    // caching
  );
});
  1. 调试手动更新
![](https://upload-images.jianshu.io/upload_images/454462-a63d53b8a30f3e01.png)

image.png

直接点击update即可。
注意,我们更新了某些文件的时候也要同时更新sw中的缓存版本(cacheVersion)

4. 简介…
6

repl:

manifest文件

这个文件主要是配置添加到桌面的一些基本信息,比如图标启动页等。详细可以看这个https://developer.mozilla.org/zh-CN/docs/Web/Manifest
下面是我写的一个示例https://github.com/Stevenzwzhai/vue2.0-elementUI-axios-vueRouter/blob/master/pwa/sw.js
或者拉取这个项目https://github.com/Stevenzwzhai/PWA-demo

5. Microservice 微服务架构风格…
8

  • 通过渴望评估输入来支持预览

5.1. 和其它平台架构的比较…
9

stream:

6.流式(stream)应用程序…
9

  • 添加对 captureRejection 选项的支持

6.1. 指令式编程模型…
10

tls:

6.2. 函数式编程模型…
10

  • 对 ‘secureConnection’ 事件实施捕获拒绝
  • 公开当前密码套件的 IETF 名称

7. 数据流…
10

worker:

7.1. 拓扑…
10

  • 添加 argv 构造函数选项

7.2. 并发…
11

详细信息:

7.3. 分区…
11

(文/开源中国)    

7.4. 消息传输保障…
12

8. 分析…
13

9. 任务式(task)应用程序…
14

10. 数据流服务器…
14

10.1. 端点(Endpoint).
14

10.2. 自定义…
15

10.3. 安全…
15

11. 运行时环境…
16

11.1. 容错…
16

11.2. 资源管理…
16

11.3. 运行时调整规模…
16

11.4. 应用程序版本化…
16

********************************以下是原文内容的翻译**********************

Version 1.3.0.M2

© 2012-2017 Pivotal Software, Inc.

你可以自己使用这个文章或是分发给其它人,但前提是你不以赚取费用为目标,同时每个转发的文章必须包含此版权通知,无论是印刷品版本还是电子发行版本。

入门

如果您刚刚开始使用Spring

Cloud Data
Flow,这部分将非常适合你!这里我们回答的基本问题是“这是什么”,“怎么用”,“为什么用”的问题。按着本文的介绍说明,大家就可以构建第一个Spring

Cloud Data Flow的应用程序并了解到一些核心原则。

1.

系统要求

你需要安装java运行环境(java 8或更高版本),同时需要安装好Maven环境。

您需要有一个关系型数据库系统来存储stream、task和应用程序状态。默认情况下,本地数据流服务器会使用嵌入式的H2数据库。

如果您运行的是任何涉及stream分析的应用程序,Redis需要安装好,以便支持相应程序运行。

同时RabbitMQ或者Kafka也是需要安装的。

2.

部署Spring Cloud Data Flow 本地服务器

  1. 下载Spring Cloud Data Flow Server 和Shell 应用程序:

wget

http://repo.spring.io/milestone/org/springframework/cloud/spring-cloud-dataflow-server-local/1.3.0.M2/spring-cloud-dataflow-server-local-1.3.0.M2.jar

wget

http://repo.spring.io/milestone/org/springframework/cloud/spring-cloud-dataflow-shell/1.3.0.M2/spring-cloud-dataflow-shell-1.3.0.M2.jar

  1. 运行 Data Flow Server

Data Flow Server 是一个 基于Spring

Boot 的应用,

你可以直接用java

–jar这样的命令行来运行它.

$

java -jar spring-cloud-dataflow-server-local-1.3.0.M2.jar

  1. 启动 shell:

$

java -jar spring-cloud-dataflow-shell-1.3.0.M2.jar

如果Data Flow Server 和 shell程序不是运行在同一个机器上,那就需要设置

shell程序,让它指向 Data Flow server URL地址

server-unknown:>dataflow

config
serverhttp://198.51.100.0

Successfully

targetedhttp://198.51.100.0

dataflow:>

默认情况下,服务平台当中的应用程序注册信息是空的,如果你想批量地把所有外部基于kafka绑定的stream应用程序注册到服务平台当中,那么你可以具体查看注册应用程序这个章节,链接是,https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/\#spring-cloud-dataflow-register-stream-apps

$

dataflow:>app import –uri

http://bit.ly/Bacon-RELEASE-stream-applications-kafka-10-maven

取决于你机器上的运行环境,你可能需要配置Data Flow

Server使用你自身的Maven仓库或者是配置代理服务,具体可查看以下链接https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/\#getting-started-maven-configuration

4.
你可以用shell命令行来罗列出有效的应用程序(source/processors/sink),也可以用它来创建stream,例如:

dataflow:>

stream create –name httptest –definition “http –server.port=9000 |

log” –deploy

在推送数据给应用程序之前,您需要等待一段时间,直到应用程序实际部署成功。通过日志文件的位置,HTTP或是日志应用程序,查看Data
Flow server的日志文

。用tail命令查看每个应用程序的日志文件末尾,以验证应用程序是否已经启动。

接下来,可以尝试推送一些数据

dataflow:>

http post –target –data “hello world”

查看下,hello world是否出现在日志程序的日志文件末尾了。

当你配置一个本地化的程序的时候(每一个应用程序的实例数量大于一个)平台会给应用程序动态分配一个服务器的端口号,除非你明确的手工指定了–server.port=x这样的参数。在这两种情况下,这样的设置将覆盖任何较低级别的设置(如application.yml文件当中的配置)。

当你使用shell程序的时候希望获得更详细的异常信息,那么你可以把异常信息日志的级别设置为WARNING

,这个设置在logback.xml 这个配置文件当中:

name=”org.springframework.shell.core.JLineShellComponent.exceptions”

level=”WARNING”/>

2.1. Maven 配置

如果你想覆盖maven配置当中的一些设置(如remote

repositories, proxies等),或者是让Data Flow
Server运行时使用代理服务,你可以在运行Data Flow

Server时,在命令行参数当中加入相应的参数,例如:

$

java -jar spring-cloud-dataflow-server-local-1.3.0.M2.jar

–maven.localRepository=mylocal

发表评论

电子邮件地址不会被公开。 必填项已用*标注