基于阿里云容器服务的微服务实践

基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

从2012年起,在IT领域逐渐能听到微服务(Microservices)这个词,随之微服务这个词变得越来越火热。与微服务相对应的是单体式应用(即Monolithic Application)模式,它将一个应用程序或以一个业务需求视为一个整体,所有功能都放入一个应用程序中执行。企业应用系统架构通常可分为三层:前端表示层(即Web界面)、业务逻辑层、持久层,单体式应用模式通常将这三层封装成单个的Web应用程序。而微服务架构则反其道而行之,借由很多小型的服务,共同组合成完整的服务程序。

由大量微型服务组合而成的微服务应用,其特征是每一个微服务都是独立执行,且每个服务能够各自扩展,甚至可以用不同的编程语言来开发同一个业务所需的各个微服务。微服务架构虽然具备弹性、可扩展性的优点,但它也带来了管理大量服务的复杂性,特别是微型服务的数量极多的情况更为明显。要构建分布式微服务架构的应用,往往只有大型互联网公司才有能力完成。

随着容器技术的成熟,过去实现难度很高的微服务架构,开始“飞入寻常百姓家”。容器技术可以将各种微型程序打包成可独立运行的映像,发布到任何可用的容器平台上执行。开发者只要将业务应用所需的所有功能程序打包成一个个的Docker映像,部署到各个容器中就能实现提供不同功能的微服务。这样开发者就可以通过同样的工具和技术来管理大量的微服务,而不用自己维护微服务架构技术。

在阿里云上部署一个完整的JavaEE微服务应用通常需要一个比较复杂的过程,但如果结合Docker技术,则只需简单的几个步骤即可搞定。本文主要讲述怎样利用Docker来简化微服务应用的创建和部署。

一、背景知识

本文需要用到Couchbase、Docker、微服务架构、WildFly等技术。

1、Couchbase

Couchbase服务器是一个开源的、文档型的NoSQL数据库,它具有高性能、高可扩展性和高可用性的分布式架构,使得开发人员能够同时利用JSON的灵活性和SQL语言的强大功能,从而能够更轻松、更快地开发和构建业务应用程序。

Couchbase具有如下特征:

1)更容易,更快的开发

通过利用灵活的数据模型和强大的查询语言来减少代码的数量,从而避免数据库更改,实现更快地迭代。

2)灵活的数据建模

通过将数据模型扩展为嵌套或引用数据,或通过在相同数据上添加新的索引和查询来添加要素。

3)强大的查询和索引

执行复杂查询(带或不带联接),并受益于内置的查询编辑器和模式浏览器 - 无需代码。

4)SQL集成和迁移

按原样迁移关系数据和查询,继续利用企业BI和报表工具完全支持SQL。

5)大数据集成

可以与Spark、Kafka和Hadoop集成,以实时丰富、分发和分析操作数据流。

6)移动/物联网扩展

通过利用具有与云的自动同步的跨平台嵌入式数据库来简化移动开发。

7)弹性可扩展性

轻松,高效和可靠地扩展,从几个节点到多个,一个数据中心到多个,全部具有“按钮”简单性。

8)一致的高性能

构建响应式应用程序,并通过利用内存和异步操作支持数百万并发用户。

9)永远在线可用性

通过启用复制和自动故障转移以及在线执行维护操作来维持24x365正常运行时间。

10)多数据中心部署

在多个地理位置操作,以通过启用跨数据中心复制来提高性能和可用性。

11)简单而强大的管理

通过集成的管理UI和为大型部署优化的自动化任务来部署,管理和监控部署。

12)企业级安全

通过启用内置审计,基于角色的访问控制和加密通信在安全环境中部署。

2、微服务


微服务即Microservices,是一种软件架构模式和风格,以专注于单一责任和功能的小型功能块为基础,利用模组化的方式组合出复杂的大型应用程序,各功能块的使用与编程语言无关的API集相互通信。微服务架构运用于软件架构风格的其中一项概念是甘露运算(Dew Computing),意指由许多的“小露水”(即代表微服务的功能块)汇集而成的整体服务能力。

3、Docker容器


Docker是一个开源的应用容器引擎,它使得开发者可以打包自己的应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux服务器,也可以实现虚拟化。容器完全使用了沙箱机制,容器相互之间不会有任何接口(类似于iOS系统上的APP)。而且几乎没有性能开销,可以很容易地在服务器和数据中心上运行。最重要的是,Docker不依赖任何语言和框架,也不依赖于任何系统。Docker在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。

4、WildFly


WildFly原名为JBoss AS或者JBoss,是JBoss AS的后继者,是一个基于Java语言的应用服务器软件,它属于开源企业级Java中间件软件,用于实现各种Web应用和服务。WildFly通过了JavaEE 7认证,带来了更简化、标准化和嵌入式特性,适合云计算和移动开发场景。

想继续阅读文本,请看下一篇《基于阿里云容器服务的微服务实践 - Part 2. Docker Compose》

基于阿里云容器服务的微服务实践 - Part 2. Docker Compose

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

二、使用Compose定义微服务

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,它允许在单个文件中定义多个容器应用以及这些应用所需的各种依赖,然后通过单个命令完成执行。Docker Compose在实际工作中非常有价值,随着Docker Compose的不断完善,有成为取代docker run命令启动Docker容器的趋势。使用Compose,开发者可以使用Compose文件配置应用程序的服务。然后,使用单个命令,从配置中创建和启动所有服务。

Docker Compose非常适用于开发,测试和临时环境,以及CI工作流。它的主要特征如下:

  • 单个主机上的多个隔离环境
  • 创建容器时保留卷数据
  • 仅重新创建已发生变更的容器
  • 变量和在环境之间移动组件

Docker Compose使用项目名称来相互隔离环境。开发者可以在多个不同的上下文中使用此项目名称:

  • 在开发主机上,创建单个环境的多个副本
  • 在CI服务器上,为了使构建不会相互干扰,可以将项目名称设置为唯一的内部版本号
  • 在共享主机或开发主机上,可以防止不同的项目使用了相同的服务名所造成的相互干扰

使用Docker Compose基本上有三个步骤:

  1. 定义应用程序的环境Dockerfile,使得它可以在任何地方复制。
  2. 定义组成应用程序的服务docker-compose.yml,以便它们可以在一个隔离的环境中一起运行。
  3. 最后,运行docker-compose up,将启动并运行整个应用程序。

Docker 1.13版引入了v3版的Docker Compose,详见:
https://docs.docker.com/compose/compose-file/#version-3

此版本的改动很少,主要的区别在于引入了deploy属性。Deploy属性允许指定容器的副本、回滚更新、以及重启策略。

本文开发的微服务将会启动一个WildFly应用服务器,WildFly服务器上预部署了一个JavaEE应用,此JavaEE应用可以与Couchbase数据库服务器进行通信,完成应用数据的增删改查等操作。下面先安装Compose。

要安装Compose,步骤如下:

  1. 安装Docker Toolbox。因为Docker Toolbox包含了Docker引擎和Compose,因此对于Mac系统或Windows系统的用户来说,安装Compose只需一步,下面的步骤忽略。
  2. 对于Linux用户来说,先安装Docker引擎
  3. 去Compose的GitHub主页下载发行包,见:https://github.com/docker/compose/releases

    $ curl -L
    https://github.com/docker/compose/releases/download/1.10.0/docker-compose-(uname−s)−(uname -s)-(uname -m)” -o /usr/local/bin/docker-compose

  4. 为其赋予可执行权限

    $ chmod +x /usr/local/bin/docker-compose

  5. 测试安装是否正确

    $ docker-compose –version
    docker-compose version: 1.10.0

下面是使用Compose定义的一个例子:

version: '3'
services:web:image: chszs/couchbase-javaee:travelenvironment:- COUCHBASE_URI=dbports:- 8080:8080- 9990:9990depends_on:- dbdb:image: chszs/couchbase:travelports:- 8091:8091- 8092:8092 - 8093:8093 - 11210:11210

在上面的Compose文件中,通过db和web属性名定义了两个服务。每一个服务的映像名由image属性进行定义。

映像chszs/couchbase:travel启动Couchbase服务器,并配置它使用Couchbase的REST API,以及载入travel-sample库,这个库是一个大约32KB的JSON文档。

映像chszs/couchbase-javaee:travel启动WildFly应用服务器,并部署应用的war文件。

environment属性定义了应用程序部署到WildFly应用服务器时可以访问的环境变量。COUCHBASE_URI指向数据库服务,这是在应用程序代码中使用。

端口转发则通过ports属性来实现。

在Compose定义文件中的depends_on属性用于确保容器的启动顺序。但是,应用程序级的启动就需要容器内运行的应用程序来确保。在本文的场景中,WildFly应用服务器启动相当快,而数据库的启动则需要数秒钟。这意味着部署在WildFly的JavaEE应用程序在一开始的几秒钟内无法与数据库进行通信。因此depends_on属性就派上用场了。它可以确保在应用程序的初始化过程中,所依赖的微服务已启动,而无需考虑再启动顺序。数据库初始化代码应该执行以下检查:

  1. 存储分区存在
  2. Couchbase数据库的查询服务已经可用
  3. Sample库数据已载入

上面的应用程序可以使用docker-compose up -d命令在单个主机上启动,或者是在Docker引擎的集群下以Swarm模式使用docker stack deploy命令启动它。

想继续阅读文本,请看下一篇《基于阿里云容器服务的微服务实践 - Part 3. 容器微服务实践》

基于阿里云容器服务的微服务实践 - Part 3. 容器微服务实践

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

三、设置Docker的Swarm模式

Docker Swarm提供了一个本地集群能力,可以在单个虚拟Docker引擎中运行一组Docker引擎。

可以使用下面的命令来初始化Swarm模式:

docker swarm init

这将启动Swarm管理器。默认情况下,管理器阶段也是worker节点,而且可以只配置为管理器节点。
要查看关于单节点集群的信息,可以使用docker info命令:

Containers: 0Running: 0Paused: 0Stopped: 0
Images: 17
Server Version: 1.13.0
Storage Driver: overlay2Backing Filesystem: extfsSupports d_type: trueNative Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlay
Swarm: activeNodeID: 92mydh0e09ba5hx3wtmcmvktzIs Manager: trueClusterID: v68ikyaff7rdxpaw1j0c9i60sManagers: 1Nodes: 1Orchestration:Task History Retention Limit: 5Raft:Snapshot Interval: 10000Number of Old Snapshots to Retain: 0Heartbeat Tick: 1Election Tick: 3Dispatcher:Heartbeat Period: 5 secondsCA Configuration:Expiry Duration: 3 monthsNode Address: 192.168.65.2Manager Addresses:192.168.65.2:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e
runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e
init version: 949e6fa
Security Options:seccompProfile: default
Kernel Version: 4.9.5-moby
Operating System: Alpine Linux v3.5
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.952 GiB
Name: moby
ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): trueFile Descriptors: 31Goroutines: 124System Time: 2017-01-27T08:25:58.032295342ZEventsListeners: 1
No Proxy: *.local, 169.254/16
Username: chszs
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:127.0.0.0/8
Live Restore Enabled: false

上面所述的集群只有一个节点,而且这个节点是一个管理器节点。
此外,多主机集群可以使用下面的方法来设置:
https://github.com/docker/labs/blob/master/developer-tools/java/chapters/ch08-aws.adoc

四、部署微服务

微服务可以这样启动:

docker stack deploy --compose-file=docker-compose.yml webapp

输出如下:

Creating network webapp_default
Creating service webapp_web
Creating service webapp_db

WildFly和Couchbase服务在这个节点上启动了,每一个服务都有单个的容器。如果Swarm模式在多个节点上启用,那么容器会分布到这些节点上。
这样会创建一个新的覆盖网络。这允许多个容器在不同的主机上相互通信。
可以使用docker service来验证WildFly服务和Couchbase服务是否正在运行:

ID            NAME        MODE        REPLICAS  IMAGE
a9pkiziw3vgw  webapp_db   replicated  1/1       chszs/couchbase:travel
hr5s6ue54kwj  webapp_web  replicated  1/1       chszs/couchbase-javaee:travel

服务的日志可以使用命令docker service logs if webapp_web来查看:

webapp_web.1.wby0b04t7bap@moby    | =========================================================================
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JBoss Bootstrap Environment
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JBOSS_HOME: /opt/jboss/wildfly
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JAVA: /usr/lib/jvm/java/bin/java
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    | =========================================================================
. . .
webapp_web.1.wby0b04t7bap@moby    | 23:14:15,811 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war")
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,076 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,077 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,077 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 98623ms - Started 443 of 691 services (404 services are lazy, passive or on-demand)

要确保等待最后一条日志语句完成显示。

五、访问微服务

尝试访问微服务的10条记录:

curl -v http://localhost:8080/airlines/resources/airline

显示结果如下:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /airlines/resources/airline HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 1402
< Date: Fri, 03 Feb 2017 17:02:45 GMT
<
* Connection #0 to host localhost left intact
[{"travel-sample":{"country":"United States","iata":"Q5","callsign":"MILE-AIR","name":"40-Mile Air","icao":"MLA","id":10,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"TQ","callsign":"TXW","name":"Texas Wings","icao":"TXW","id":10123,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"A1","callsign":"atifly","name":"Atifly","icao":"A1F","id":10226,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":null,"callsign":null,"name":"Jc royal.britannica","icao":"JRB","id":10642,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"ZQ","callsign":"LOCAIR","name":"Locair","icao":"LOC","id":10748,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"K5","callsign":"SASQUATCH","name":"SeaPort Airlines","icao":"SQH","id":10765,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"KO","callsign":"ACE AIR","name":"Alaska Central Express","icao":"AER","id":109,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"5W","callsign":"FLYSTAR","name":"Astraeus","icao":"AEU","id":112,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"UU","callsign":"REUNION","name":"Air Austral","icao":"REU","id":1191,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"airline"}}]

Docker for Java Developers:
https://github.com/docker/labs/tree/master/developer-tools/java

上面是一个自学动手的实验,可以轻松上手使用Docker。
获取单条资源记录:

curl -v http://localhost:8080/airlines/resources/airline/137

输出结果如下:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /airlines/resources/airline/137 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 131
< Date: Wed, 01 Feb 2017 03:05:02 GMT
<
* Connection #0 to host localhost left intact
{"travel-sample":{"country":"France","iata":"AF","callsign":"AIRFRANS","name":"Air France","icao":"AFR","id":137,"type":"airline"}}

创建一条新资源记录:

curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' http://localhost:8080/airlines/resources/airline

输出结果如下:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> POST /airlines/resources/airline HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 104
>
* upload completely sent off: 104 out of 104 bytes
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 117
< Date: Wed, 01 Feb 2017 03:05:18 GMT
<
* Connection #0 to host localhost left intact
{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":"19810","type":"airline"}

更新一条资源记录:

curl -v -H "Content-Type: application/json" -X PUT -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","type":"airline","id": "19810"}' http://localhost:8080/airlines/resources/airline/19810

输出结果如下:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> PUT /airlines/resources/airline/19810 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 119
>
* upload completely sent off: 119 out of 119 bytes
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 118
< Date: Wed, 01 Feb 2017 03:05:41 GMT
<
* Connection #0 to host localhost left intact
{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","id":"19810","type":"airline"}

删除一条资源记录:

curl -v -X DELETE http://localhost:8080/airlines/resources/airline/19810

输出结果如下:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> DELETE /airlines/resources/airline/19810 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 136
< Date: Wed, 01 Feb 2017 03:05:57 GMT
<
* Connection #0 to host localhost left intact
{"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","id":"19810","type":"airline"}}

六、删除微服务

可以使用docker stack rm webapp命令来移除微服务:

Removing service webapp_web
Removing service webapp_db
Removing network webapp_default

七、总结

尽管在阿里云的产品系列中还没看到Docker容器服务产品,但这并不代表就不能在阿里云上部署和实施容器类的服务和应用。实际上,阿里云提供了一个Docker市场,通过阿里云的Docker市场,开发者可以方便地进行Docker容器的创建、分享、下载和评价。而对于Dockerhub官方的镜像,阿里云的Docker市场还提供了镜像加速服务,让开发者可以更快地下载和使用这些来自官方的Docker镜像。借助阿里云虚拟主机,我们可以在单台或多台主机上搭建和部署多个Docker容器,每个Docker容器上又部署各种各样的业务服务。通过这些业务服务,构建我们的微服务生态系统。

基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker相关推荐

  1. 基于阿里云容器镜像服务加速K8S镜像下载(二)

    简单说明 在<基于阿里云容器镜像服务加速K8S镜像下载>中介绍了使用阿里云镜像服务来解决一些不可达镜像的下载 但是需要反复在阿里云容器镜像控制台添加仓库,这种操作实在太傻,是电脑这头蠢驴该 ...

  2. Docker监控:基于阿里云容器服务构建自己的Docker监控框架

    微服务架构通过将一个复杂系统分解成一系列独立开发.部署和运维的服务,提升了整个系统的敏捷性,可以灵活的响应业务和规模的变化.而Docker技术则将服务的部署和环境完全解耦,利用Docker的可移植性和 ...

  3. 一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用

    本文面向的读者 如果您是一个Kubernetes的初学者,本文可以帮助你快速在云上搭建一个可实际使用的集群环境,并发布自己的第一个应用.你无须提前准备任何的硬件资源或者下载任何的软件包.  如果您已经 ...

  4. 区块链应用@纸贵科技:基于阿里云容器服务护航内容版权

    摘要: 区块链如何护航内容版权? 区块链已经成为业界内外家喻户晓的一门技术,很多企业已经开始尝试将区块链应用于不同场景.目前,开源的Hyperledger Fabric区块链技术与容器技术的应用组合已 ...

  5. 基于阿里云容器镜像服务加速K8S镜像下载

    简单说明: 部署K8S最大的难题是镜像下载 可以使用阿里云容器镜像服务由海外机器构建 国内同时可以使用阿里云的镜像加速器加速镜像下载 仅需要将含有相关镜像的Dockerfile提交到阿里云即可 申请云 ...

  6. 比心云平台基于阿里云容器服务 ACK 的弹性架构实践

    作者:韩韬|比心技术 前言 应用容器化改造后,不可避免地会面临这样一个问题:Kubernetes 集群的 Node 资源配置不足会导致 Pod 无法及时运行,购买过多的 Node 又会导致资源的闲置浪 ...

  7. 梨视频:基于阿里云E-MapReduce搭建视频推荐系统的实践

    专注新闻资讯的梨视频近来表现亮眼. 梨视频由前澎湃新闻掌门人邱兵创立. 在上线之前,它就获得了黎瑞刚华人文化近1亿美元投资,旗下<微辣>栏目总播放量已经超过4亿,并在上线1个月后获得&qu ...

  8. 小打卡基于阿里云构建企业级数仓的实践及总结

    简介:本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及代表性案例分享. 小打卡架构师 申羡 本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及 ...

  9. 基于阿里云HiTSDB搭建工业物联网平台实践

    摘要: 基于阿里云全面的物联网.云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集.统计分析.平衡调度.节能优化等全面的能源管控协同平台.是企业生产运行保障的利器,也是大量企业实现云上 ...

最新文章

  1. 网宿科技实控人刚公布减持计划 机构席位蜂拥砸盘
  2. 菏泽中考报名不报计算机,2020菏泽中考报名人数:94559人
  3. 算法分析中递推式的一般代数解法
  4. LeetCode移掉k位数字(贪心算法)python
  5. 服务器排障 之 nginx 499 错误的解决
  6. 基本数据类型与字符串的转换
  7. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
  8. Spring Boot-springbootHelloword(一)
  9. 夯实Java基础(二十一)——Java反射机制
  10. vue中页面跳转传值_vue 页面跳转传参
  11. 15.看板方法---启动看板变革
  12. 7-zip压缩解压软件.html,7-Zip 压缩率比较高的压缩软件 17.01 美化优化版
  13. 简易版双人对战五子棋
  14. python画结构图_【实战案例】五分钟!用python绘制系统架构图
  15. 广西移动摇一摇送话费_跟大家分享一个今天碰见的中国移动中奖坑钱套路
  16. 雪花飘落代码java_JavaScript实现雪花飘落效果
  17. 一个数如果恰好等于它的因子之和,这个数就称为 完数 。例如6=1+2+3.编程 找出1000以内的所有完数。
  18. 信息量理解、信息熵公式的推导
  19. 新通用顶级域名:继根服务器后,又一场互联网空间资源的争夺战
  20. Loadrunner中几个超时函数的用法

热门文章

  1. Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误
  2. moviepy中视频时长修改
  3. 利用Abot爬虫和visjs 呈现漫威宇宙
  4. 基于Springboot的民宿管理平台
  5. 《微积分:一元函数微分学》——罗尔定理
  6. 2013华为你知道多少?
  7. RocketMQ学习笔记(二)
  8. itextsharp操作pdf——插入图片
  9. QT + TSC条码打印机 打印相应的产品条码标签
  10. Java 集合系列3、骨骼惊奇之LinkedList