运用京东云代码托管、云编译、云部署等产品进行蓝绿部署简单实践

干货 | 运用京东云代码托管、云编译、云部署等产品进行蓝绿部署简单实践


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


前几天我们以一种较为传统的方式在京东云上简单实践了基于Jenkins+Docker+Git 的CI流程,主要利用一些开源技术来实现,今天我们运用在京东云的3款开发者工具来简单实践下蓝绿部署。


一、操作说明

1.产品与概念了解

代码托管:
基于Git的代码托管工具,用户可将代码托管到京东云中。产品包含代码提交、存储、下载、分支管理与对比、合并、历史等功能,为京东云持续交付全流程提供源代码托管服务。

云编译:
云编译服务为开发者提供基于容器的自动化持续集成服务。支持多语言构建环境,构建产出支持包/镜像,查看构建结果及日志。编译构建实现容器化隔离,支持自定义构建容器,为产品的持续集成提供上游基础服务,提升研发效率。

云部署:
云部署是集多种部署类型、部署方式于一身的强大部署工具。 使用云部署,您可以轻松的将程序包部署到京东云主机中。 同时,支持多种部署策略与部署配置,灵活可调配。 与负载均衡、高可用组等产品相联动,实现云端部署。

京东云云部署-蓝绿部署:
蓝绿部署,是一种先对部署组中未承接流量的分组(蓝组或绿组)内的云主机进行新版本部署,再通过切换路由的方式实现版本更替的部署方式。
具体来说:

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

1)在上线前,仅蓝组或绿组中的一组(比如蓝组),通过负载均衡,承接流量,对外提供服务。
2)开始部署,对未承接流量的组(比如绿组)进行新版本的部署。 此时,蓝组仍然继续提供服务。
3)当绿组部署完毕,将绿组主机注册到指定负载均衡后端服务所关联的虚拟服务器组列表中,此虚拟服务器组为自动新建。
与此同时,将蓝组所在的负载均衡虚拟服务器组删除。 蓝组不再提供服务,绿组提供服务。


详细介绍请参考:

https: //docs.jdcloud.com/cn/codedeploy/deployment-type


2.文档操作说明

下面以将代码托管中的源代码,经过云编译,生成程序包,然后使用云部署产品蓝绿部署到云主机中为例,列举出基本服务,以帮助快速入门。

基本操作流程如下:

1)将提供的示例代码下载到本地进行编辑后上传到京东云代码托管仓库;

2)在云编译中,对代码托管的示例源代码进行编译构建,生成程序包;

2)然后使用云部署,将程序包部署到云主机中;

3)使用负载均衡的公网IP加端口,可访问示例代码

文档操作示例图

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

二、准备工作

1.新建云主机

在地域: 华北-北京,新建2台云主机,具体信息如下:

创建方式: 自定义创建
镜像: 官方 CentOS CentOS 7.4 64位
规格: 通用型 2c4g
存储: 默认选项
网络: 选择已有的私有网络及子网、选择默认安全组开发全部端口
基本信息: 填写主机名、密码。 这里填写主机名为: devops-ecs-hcc01/02


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

更改主机名:
主机①

 
 

1 [root@ 113  ~] # hostnamectl set-hostname devops-ecs-hcc01
2 [root@ 113  ~] # hostname devops-ecs-hcc01
3 [root@ 113  ~] # logout
4 [root@devops-ecs-hcc01 ~]# 

主机②

 
 

1 [root@ 112  ~] # hostnamectl set-hostname devops-ecs-hcc02
2 [root@ 112  ~] # hostname devops-ecs-hcc02
3 [root@ 112  ~] # logout
4 [root@devops-ecs-hcc02 ~]# 

安装Agent:

其他地域云主机安装方法参考: https: //docs.jdcloud.com/cn/devops/install-agent

 
 

1 #华北-北京    
2 wget -c http: //devops-hb.s3.cn-north-1.jcloudcs.com/ifrit/ifrit-agent-external-v0.01.448.0742c84.20190327191802.bin -O installer && sh installer -- -a zero-agent,hawkeye-agent,log-agent,ark-query /usr/local/share/jcloud/ifrit && rm -f installer

执行结果如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

2.新建负载均衡实例及监听器

在地域: 华北-北京,新建负载均衡实例,具体信息如下:

地域: 华北-北京 
可用区: 可用区A 
私有网络: 请选择与云主机一致的私有网络 
带宽: 1Mbps
名称: devops-slb-hcc

接下来,在此负载均衡实例中,新建监听器,点击“添加监听”,进入到 新建监听器 页面。

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

具体信息如下:

监听协议[端口]: Http 80
空闲链接超时: 60
默认后端服务: 新建后端服务
后端服务名称: devops-slb-backend-hcc
端口: 9011
调度算法: 加权轮询
健康检查方式: HTTP

3.上传示例代码至代码托管

如下操作是将此示例代码放到代码托管产品中,代码示例地址为:https://code.jdcloud.com/devops-demo/java-demo.git

新建私有项目

第一步: 创建项目,代码托管地址: https: //code.jdcloud.com/

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

输入项目名称,点击 Create project

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

创建完成后,我们能看到一些命令行介绍提示

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

配置SSH密钥

创建项目完成后,我们从提示可以看到提供两种pull或push方式,分别为SSH和HTTPS,我这里选择用SSH

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

第一步: 任选一台咱们刚开始创建的云主机,在云主机上进行SSH密钥生成


 
 

1 [root@devops-ecs-hcc01 ~] # yum install git -y
2 [root@devops-ecs-hcc01 ~] # git config --global user.name  "hanchaochao"
3 [root@devops-ecs-hcc01 ~] # git config --global user.email  "hanchaochao5@jd.com"
4 [root@devops-ecs-hcc01 ~] # ssh-keygen -t rsa -C  "hanchaochao5@jd.com"
5 Generating  public / private  rsa key pair.
6 Enter file in which to save the  key   (/root/.ssh/id_rsa) : 
7 Enter  passphrase   (empty  for  no passphrase) : 
8 Enter same passphrase again: 
9 Your identification has been saved in /root/.ssh/id_rsa.
10 Your  public  key has been saved in /root/.ssh/id_rsa.pub.
11 The key fingerprint is:
12 SHA256:z0TcCqkyplsxENQK/KJKSIK4NXJJzn9TnuhJpeZOuaQ hanchaochao5@jd.com
13 The key's randomart image is:
14 +---[RSA 2048]----+
15 |..o.             |
16 |.....    o .     |
17 |o =oo    o o .    |
18 |=oOo   .oo .     |
19 |==.o* .*S.o      |
20 |+. o.=B.o+       |
21 |o . .*+o  o      |
22 |.  o ++.         |
23 |  . E.o          |
24 +----[SHA256]-----+
25 [root@devops-ecs-hcc01 ~]# cat .ssh/id_rsa.pub
26 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFv6mC/EHXCIHTcwcn5DwSEGiy4m+x5hTmlrRZUfEmQWn8slyMWktyHOmXvKMI9I4Gr0WZuR+Yekq7vawF8kBAPhM1G97TuHmLRI......
27 [root@devops-ecs-hcc01 ~]# 


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

第二步:

登录代码托管平台: https: //code.jdcloud.com/,将生成的密钥公钥添加到代码托管里

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

示例代码下载

真实情况如果您已经有现成代码,则跳过这一步直接按照代码上传步骤上传即可。

在上一步骤新建的云主机中进行如下操作

 
 

1 [root@devops-ecs-hcc01 ~] # mkdir test
2 [root@devops-ecs-hcc01 ~] # cd test/
3 [root@devops-ecs-hcc01 test] # git init
4 Initialized empty Git repository in /root/test/.git/
5 [root@devops-ecs-hcc01 test] # git clone https: //code.jdcloud.com/devops-demo/java-demo.git
6 Cloning into  'java-demo' ...
7 remote: Enumerating objects:  216 , done.
8 remote: Counting objects:  100 % ( 216 / 216 ), done.
9 remote: Compressing objects:  100 % ( 171 / 171 ), done.
10 remote: Total  216  (delta  39 ), reused  176  (delta  21 )
11 Receiving objects:  100 % ( 216 / 216 ),  1.02  MiB |   bytes/s, done.
12 Resolving deltas:  100 % ( 39 / 39 ), done.
13 [root@devops-ecs-hcc01 test] # ll
14 total 
15 drwxr-xr-x  5  root root  126  Apr   9   15 : 34  java-demo
16 [root@devops-ecs-hcc01 test]# 


gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

更改代码分支

执行如下命令,我们发现有两个分支,分别为devops-demo和master,而我们现在在devops-demo分支上,为方便后续蓝绿部署操作更直观,我们将此分支重命名为 blue ,并复制这个分支为 green

 
 

1 [root@devops-ecs-hcc01 java-demo] # git branch
2 * devops-demo
3   master
4 [root@devops-ecs-hcc01 java-demo] # git branch -m blue
5 [root@devops-ecs-hcc01 java-demo] # git branch
6 * blue
7   master
8 [root@devops-ecs-hcc01 java-demo] # git branch green
9 [root@devops-ecs-hcc01 java-demo] # git branch
10 * blue
11   green
12   master
13 [root@devops-ecs-hcc01 java-demo]# 


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

示例代码上传

将下载到云主机的示例代码上传到我们自己的代码托管项目里

 
 

1 [root@devops-ecs-hcc01 test] # cd java-demo/
2 [root@devops-ecs-hcc01 java-demo] # git checkout blue
3 Already on  'blue'
4 [root@devops-ecs-hcc01 java-demo] # git remote rm origin
5 [root@devops-ecs-hcc01 java-demo] # git remote add origin git@code.jdcloud.com:jdc-12/java-demo-hcc.git         
6 [root@devops-ecs-hcc01 java-demo] # git add .
7 [root@devops-ecs-hcc01 java-demo] # git commit
8 # On branch blue
9 nothing to commit, working directory clean
10 [root@devops-ecs-hcc01 java-demo] # git push --all -f
11 Warning: Permanently added the ECDSA host key  for  IP address  '116.196.123.158'  to the  list  of known hosts.
12 Counting objects:  216 , done.
13 Delta compression  using  up to  2  threads.
14 Compressing objects:  100 % ( 153 / 153 ), done.
15 Writing objects:  100 % ( 216 / 216 ),  1.02  MiB |   bytes/s, done.
16 Total  216  (delta  39 ), reused  216  (delta  39 )
17 remote: Resolving deltas:  100 % ( 39 / 39 ), done.
18 remote: 
19 remote: To create a merge request  for  blue, visit:
20 remote:   https: //code.jdcloud.com/jdc-12/java-demo-hcc/merge_requests/new?merge_request%5Bsource_branch%5D=blue
21 remote: 
22 remote: To create a merge request  for  green, visit:
23 remote:   https: //code.jdcloud.com/jdc-12/java-demo-hcc/merge_requests/new?merge_request%5Bsource_branch%5D=green
24 remote: 
25 To git@code.jdcloud.com:jdc -12 /java-demo-hcc.git
26  * [ new  branch]      blue -> blue
27  * [ new  branch]      green -> green
28  * [ new  branch]      master -> master
29 [root@devops-ecs-hcc01 java-demo]# 


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

回到代码托管控制台,我们发现我们的代码已经被上传到我们新建的项目中了,而且能看到两个分支,分别为 blue green

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

三、开始编译

为便于效果展示,我们将蓝绿部署的显示页面更改下,分别对应git上不同的分支:  
 更改地址:  
/src/main/resources/web/index.html
更改内容:  
blue: Blue-Hello Devops!
green: Green-Hello Devops!
 blue分支更改步骤如下:  

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

green分支更改步骤如上。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==


在云编译中进行编译构建

在云编译中新建任务

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

如前面提到的,我们需要将代码的两个分支( blue green )分别编译成不同的包,然后再进行发布,这样的话更直观。

蓝部署 配置信息具体如下:

  • 任务名称: devops-ci-hcc-blue

  • 镜像来源: 官方

  • 编译镜像: maven/maven3.6.0-jdk8

  • 代码源: 京东云-代码托管

  • 仓库地址: 请根据实际情况进行填写,例如jdc-12/java-demo-hcc(如果您代码托管操作正确,则在下拉框中便可看到)

  • 代码分支: 蓝部署 选择blue

  • 构建规范: 插入构建命令

  • 构建命令:

 
 

1 ---
2 # 设置环境变量
3 #envs:
4 #  - name:  'name1'  环境变量的名
5 #    value:  'value1'  环境变量的值
6 #  - name:  'name2'  用列表的方式设置多个值
7 #    value:  'value2'
8
9 # 设置编译的命令
10 #cmds: 
11 #  - name:  'do make'   编译步骤名称
12 #    cmd:  'make'       编译命令,默认 PATH 路径下执行,其他请写明绝对路径
13 #  - name:  'do install'
14 #    cmd:  'make install'
15 cmds:
16   - name:  'chmod'
17     cmd:  'chmod a+x ./build.sh'
18   - name:  'demo'
19     cmd:  './build.sh'
20
21 # 编译产物存储目录, 必填项
22 out_dir:  'output'

  • 构建类型: 应用包

  • 存储空间: 选择你创建的对象存储Bucket

  • 存储目录: 这个是选填项,我这里填了 devops-hcc

  • 超时: 2小时

  • 计算规格: 4GB,4vCPU

  • 通知频率: 不发送

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==
gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

点击 保存并构建

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

至此,已将蓝部署示例代码编译成功,并上传到对象存储,华北-北京空间中。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

在云编译中新建任务

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

绿部署 配置信息具体如下:

  • 任务名称: devops-ci-hcc-green

  • 镜像来源: 官方

  • 编译镜像: maven/maven3.6.0-jdk8

  • 代码源: 京东云-代码托管

  • 仓库地址: 请根据实际情况进行填写,例如jdc-12/java-demo-hcc(如果您代码托管操作正确,则在下拉框中便可看到)

  • 代码分支: 绿部署 选择green

  • 构建规范: 插入构建命令

  • 构建命令:

 
 

1 ---
2 # 设置环境变量
3 #envs:
4 #  - name:  'name1'  环境变量的名
5 #    value:  'value1'  环境变量的值
6 #  - name:  'name2'  用列表的方式设置多个值
7 #    value:  'value2'
8
9 # 设置编译的命令
10 #cmds: 
11 #  - name:  'do make'   编译步骤名称
12 #    cmd:  'make'       编译命令,默认 PATH 路径下执行,其他请写明绝对路径
13 #  - name:  'do install'
14 #    cmd:  'make install'
15 cmds:
16   - name:  'chmod'
17     cmd:  'chmod a+x ./build.sh'
18   - name:  'demo'
19     cmd:  './build.sh'
20
21 # 编译产物存储目录, 必填项
22 out_dir:  'output'

  • 构建类型: 应用包

  • 存储空间: 选择你创建的对象存储Bucket

  • 存储目录: 这个是选填项,我这里填了 devops-hcc

  • 超时: 2小时

  • 计算规格: 4GB,4vCPU

  • 通知频率: 不发送

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

点击 保存并构建

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

至此,已将蓝绿部署示例代码编译成功,并分别对应代码的blue分支和green分支,在华北-北京对象存储中可查看蓝部署和绿部署对应的编译产出物。

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

接下来,将开始使用云部署将程序包部署到云主机上。


四、开始部署

1.新建应用及部署组

在“部署应用”页,选中与云主机、对象存储相同的地域后,点击“新建应用”

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

跳转到“新建应用”页。

在“新建应用”页,首先填写应用信息。 应用名称: devops-app-hcc

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

点击"新建"按钮

接下来,在应用中新建部署组,

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

有以下选项:

部署组名称: 请填写部署组名称, devops-group-hcc

部署类型: 请选择“蓝绿部署”

部署目标: 点击“选择”按钮,在弹窗中选择云主机。 支持三种选择过滤条件: 高可用组(目前灰度开放)、标签、IP。 这里请选择在上一步中创建的云主机,即主机名为: devops-ecs-hcc01加入蓝组,主机名为: devops-ecs-hcc02加绿组

使用负载均衡:

负载均衡实例: 请选择华北-北京地域中已有的负载均衡实例,devops-slb-hcc

负载均衡后端服务: 请选择上一项中指定的负载均衡实例下的后端服务,devops-slb-backend-hcc

高级选项: 保持默认选项

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

填写部署组的基本信息后,请点击“新建”,将进行应用中部署组的新建。

创建成功后,将跳转到“应用详情”页。

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

Alt text

2.新建部署

对于单个部署组,可支持的操作有: 发起部署、部署历史、编辑、删除。

点击“发起部署”按钮,进入到“发起部署任务”页,有以下选项:

  • 部署描述: 非必须,为本次部署的描述信息

  • 部署来源: 支持多种部署来源,请选择 云编译

  • 云编译任务名称: 请填写 devops-ci-hcc-blue

  • 云编译构建序号: 请填写上一步中编译成功的构建序号

  • 部署来源文件类型: 请选择 .tar.gz

  • 操作命令: 请选择 输入部署操作命令 ,使用 表单 功能,填写具体操作命令,如下:

部署内容:  源目录或文件: /      目标目录: /home
停止脚本: /home/bin/stop.sh
启动脚本: /home/bin/start.sh
检查脚本: 不填写
脚本执行账号:    root         
脚本超时时间(s):
100

注意:
1、初次部署不要填写停止脚本路径;
2、初次执行部署的部署目标为 蓝组 ,也就是 devops-ecs-hcc01

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

填写部署任务信息后,请点击 发起部署 将触发部署操作。

将跳转到“部署详情”页,由于我们是初次部署,所以部署目标为蓝组

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

部署完成后,我们到负载均衡 虚拟服务器组 里能看到蓝组的devops-ecs-hcc01云主机已经关联

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

3.查看部署结果

在“部署任务详情”页,可见本次部署的进展情况。 在部署过程中,支持“取消”。

点击指定实例的“查看日志”,可见按照工作流展示的日志,工作流详见:

https: //docs.jdcloud.com/cn/codedeploy/workflow。

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

验证蓝组部署结果  http: //负载均衡公网IP

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

接下来部署绿组,我们找到初次部署的部署历史,点击 重新部署 ,配置如下:

  • 部署描述: 非必须,为本次部署的描述信息

  • 部署来源: 支持多种部署来源,请选择 云编译

  • 云编译任务名称: 请填写 devops-ci-hcc-green

  • 云编译构建序号: 请填写上一步中编译成功的构建序号

  • 部署来源文件类型: 请选择 .tar.gz

  • 操作命令: 请选择 输入部署操作命令 ,使用 表单 功能,填写具体操作命令,如下:

部署内容:  源目录或文件: /      目标目录: /home
停止脚本: /home/bin/stop.sh
启动脚本: /home/bin/start.sh
检查脚本: 不填写
脚本执行账号:    root       
脚本超时时间(s):
100

注意:
1、此次执行部署的部署目标为 绿组 ,也就是 devops-ecs-hcc02

devops-ecs-hcc02(绿组)部署成功

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

部署绿组后,我们到负载均衡 虚拟服务器组 里能看到蓝组的 devops-ecs-hcc01 云主机已经换成了绿组的 devops-ecs-hcc02 云主机

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

验证绿组部署结果  http: //负载均衡公网IP

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

至此,京东云代码托管+云编译+云部署蓝绿部署简单实践完成。


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1




* 点击“ 阅读原文 ”跟着文档一起操作吧~





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69912185/viewspace-2643502/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69912185/viewspace-2643502/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值