前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot第61集:Jenkins-Boss万字挑战,一文让你走出微服务迷雾架构周刊

springboot第61集:Jenkins-Boss万字挑战,一文让你走出微服务迷雾架构周刊

作者头像
达达前端
发布2024-03-03 09:00:34
1000
发布2024-03-03 09:00:34
举报
文章被收录于专栏:达达前端达达前端
代码语言:javascript
复制
名词?CONTAINER?ID(容器ID)
名词?IMAGE?ID(镜像ID)

cat?/etc/os-release?//查看系统信息
pwd?//查看当前路径
ls?//查看当前目录文件
docker?-v?//查看docker版本
docker-compose?up?-d?//在后台运行(取消-d是在控制台运行)
docker-compose?stop?//所有容器停止运行
docker?ps?-a?//查看正在运行的容器
docker?images?//查看安装的镜像
docker?stop?[CONTAINER?ID]?//停掉运行的容器
docker?rm?[CONTAINER?ID]?//删除运行的容器
systemctl?status?docker??//查看docker状态
systemctl?stop?docker????//停止docker
systemctl?start?docker????//启动docker
systemctl?restart?docker????//重启docker

Docker + Jenkins + Nginx 实战前端自动化部署

代码语言:javascript
复制
version:?'3.8'
#?执行脚本;docker-compose?-f?docker-compose-v1.0.yml?up?-d
services:
??jenkins:
????image:?jenkins/jenkins:2.439
????container_name:?jenkins
????privileged:?true
????user:?root
????ports:
??????-?"9090:8080"
??????-?"50001:50000"
????volumes:
??????-?./jenkins_home:/var/jenkins_home?#?如果不配置到云服务器路径下,则可以配置?jenkins_home?会创建一个数据卷使用
??????-?/var/run/docker.sock:/var/run/docker.sock
??????-?/usr/bin/docker:/usr/local/bin/docker
??????-?./maven/conf/settings.xml:/usr/local/maven/conf/settings.xml?#?这里只提供了?maven?的?settings.xml?主要用于修改?maven?的镜像地址
??????-?./jdk/jdk1.8.0_202:/usr/local/jdk1.8.0_202?#?提供了?jdk1.8,如果你需要其他版本也可以配置使用。
????environment:
??????-?JAVA_OPTS=-Djenkins.install.runSetupWizard=false?#?禁止安装向导「如果需要密码则不要配置」docker?exec?jenkins?cat?/var/jenkins_home/secrets/initialAdminPassword
????restart:?unless-stopped

volumes:
??jenkins_home:

Jenkins-Mac

代码语言:javascript
复制
1、安装jenkins

brew?install?jenkins

2、链接launchd配置文件

ln?-sfv?/usr/local/opt/jenkins/*.plist?~/Library/LaunchAgents

ln?-sfv?/usr/local/opt/jenkins-lts/*.plist?~/Library/LaunchAgents

3、启动jenkins

launchctl?load?~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

launchctl?load?~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist

4、停止jenkins

launchctl?unload?~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

launchctl?unload?~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist

访问:http://localhost:8080?
清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
代码语言:javascript
复制
tar?-xvzf?jdk-8u281-linux-x64.tar.gz
vi?/etc/profile.d/java8.sh
export?JAVA_HOME=/usr/local/java/jdk1.8.0_281
export?JAVA_BIN=/usr/local/java/jdk1.8.0_281/bin
export?PATH=$PATH:$JAVA_HOME/bin
export?CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export?JAVA_HOME?JAVA_BIN?PATH?CLASSPATH
source?/etc/profile
java?-version

tar?-xvzf?apache-maven-3.6.3-bin.tar.gz
mv?apache-maven-3.6.3?maven3
vi?/etc/profile

MAVEN_HOME=/usr/local/tools/maven3?
export?MAVEN_HOME?
export?PATH=${PATH}:${MAVEN_HOME}/bin

source?/etc/profile?
mvn?-version
  • 添加访问凭据:点击添加,添加访问认证(我是用的UserName+Password模式也可以选择其他方式)
  • 源码管理:选择Git填写仓库地址,并添加访问账号和密码或者秘钥

Jenkins是开源CI&CD软件领导者,是Devops神器

安装Jenkins->编写pipeline脚本->编写Dockerfile脚本。

代码语言:javascript
复制
FROM?openjdk:8-jdk-alpine

MAINTAINER?liunewshine@qq.com

ENV?TZ=Asia/Shanghai
RUN?ln?-snf?/usr/share/zoneinfo/$TZ?/etc/localtime?&&?echo?$TZ?>?/etc/timezone?&&?mkdir?-p?/esms

WORKDIR?/esms

EXPOSE?8090

ADD?./target/esms.jar?./

CMD?java?-Djava.security.egd=file:/dev/./urandom?-jar?esms.jar
代码语言:javascript
复制
docker?run?-u?root?-itd?--name?jenkins?-p?6001:8080?-v?$(which?docker):/usr/bin/docker?-v?/var/run/docker.sock:/var/run/docker.sock?-e?TZ="Asia/Shanghai"?-v?/etc/localtime:/etc/localtime:ro?-v?/volume1/docker/jenkins:/var/jenkins_home?jenkins/jenkins

docker pull jenkins/jenkins

  • docker-ce 18.09.1(务必使用docker-ce,老版本的docker会导致Jenkins中无法使用docker daemon)

流水线+docker,流水线可以让项目发布流程更加清晰,docker可以大大减少Jenkins配置。

尽量减少Jenkins的配置和发布脚本的书写。

CPU使用率、内存使用率和磁盘使用率的提高通常与系统中发生的特定操作和情况相关。以下是一些常见情况和操作,可能会导致这些资源的使用率增加:

  1. CPU使用率增加
  • 运行计算密集型任务:例如,执行大量数学计算、加密解密操作或图像处理。
  • 运行多个并发应用程序:同时运行多个应用程序或服务,尤其是需要大量计算资源的应用程序,可能会导致CPU使用率增加。
  • 资源竞争:如果系统上运行了多个高优先级的任务或进程,它们可能会竞争CPU资源,导致CPU使用率上升。

内存使用率增加

  • 运行内存密集型应用程序:例如,大型数据库、缓存服务或虚拟机。
  • 创建大型数据结构:例如,加载大型文件或数据集到内存中。
  • 内存泄漏:如果应用程序存在内存泄漏问题,内存使用率可能会持续增加,直到系统耗尽可用内存。

磁盘使用率增加

  • 写入大量数据:例如,进行大规模的日志记录、数据库写入操作或文件传输。
  • 读取大量数据:例如,从磁盘加载大型文件或执行大型数据库查询。
  • 运行IO密集型应用程序:例如,视频编码、解码或批量文件处理。
  • 文件系统碎片化:如果文件系统碎片化严重,可能会导致文件读取和写入操作变慢,进而导致磁盘使用率增加。
  • 查看某个端口是否开放:netstat -lnt | grep 80
  • 查看nginx配置是否正确:nginx -t
  • 查看nginx是否正常启动:ps -ef | grep nginx
  • 查看防火墙状态: systemctl status firewalld
  • 启动防火墙: systemctl start firewalld
  • 停止防火墙: systemctl stop firewalld
  • 永久停用: systemctl disable firewalld
  • 启用防火墙: systemctl enable firewalld
  • 查看某个端口占用情况:netstat –apn | grep 8080
  • 升级版本内核:yum update -y
代码语言:javascript
复制
docker?run?-p?3306:3306?--restart=always?-e?TZ="Asia/Shanghai"?\
--name?mymysql?-v?/usr/local/gourd/docker/mysql/conf:/etc/mysql/conf.d?\
-v?/usr/local/gourd/docker/mysql/logs:/logs?\
-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql:5.7

docker?run?-p?8080:8080?--name?gourdtomcat?\
--restart=always?-e?TZ="Asia/Shanghai"?\
-v?/docker/tomcat/test:/usr/local/tomcat/webapps/test?-d?tomcat

?docker?run?-p?6379:6379?--restart=always?-e?TZ="Asia/Shanghai"?\
?-v?/usr/local/gourd/docker/redis/data:/data?\
?-v?/usr/local/gourd/docker/redis/conf/redis.conf:/etc/redis/redis.conf?\
?--name?myredis?-d?redis?redis-server?--appendonly?yes
?
?docker?run?--name?gourdnginx?-p?80:80?\
?--restart=always?-e?TZ="Asia/Shanghai"?-d?\
?-v?$PWD/conf/nginx.conf:/etc/nginx/nginx.conf?\
?-v?$PWD/logs:/var/log/nginx?nginx
代码语言:javascript
复制
//?查看运行中的容器
docker?ps
//?查看所有的容器
docker?ps?-a
//?搜索镜像
docker?search?keyword
//?例:docker?search?mysql
//?查看下载的镜像
docker?iamges
//?启动容器
docker?start?[容器名/容器ID]
//?停止容器
docker?stop/kill?[容器名/容器ID]
//?重启容器
docker?restart?[容器名/容器ID]
//?删除已停止的容器
docker?rm?[容器名/容器ID]
//?强制删除容器
docker?rm?-f?[容器名/容器ID]
//?删除镜像
docker?rmi?镜像id
//?查看容器日志
docker?logs?[容器名/容器ID]
//?查看容器运行状态信息
docker?stats
//?获取容器/镜像的元数据
docker?inspect?[OPTIONS]?NAME|ID?[NAME|ID...]
//?查看容器中运行的进程信息,支持?ps?命令参数
docker?top?[OPTIONS]?CONTAINER?[ps?OPTIONS]
//?将宿主机目录拷贝到容器目录
docker?cp?[path1]?[容器ID]:[path2]
//?将容器目录拷贝到宿主机目录
docker?cp?[容器ID]:[path2]?[path1]
  1. Web 应用程序,如 Nginx、Apache、Node.js、Tomcat 等。
  2. 数据库,如 MySQL、PostgreSQL、MongoDB 等。
  3. 消息队列,如 RabbitMQ、Kafka 等。
  4. 缓存,如 Redis、Memcached 等。
  5. 日志管理,如 ELK(Elasticsearch、Logstash、Kibana) 等。
  6. 容器管理,如 Kubernetes、Docker Compose 等。
代码语言:javascript
复制
docker?search?postgres
docker?pull?postgres
docker?images

[root@localhost?~]$?cd?/data/
[root@localhost?data]$?mkdir?postgres
[root@localhost?postgres]$?pwd
/data/postgres

docker?run?--name?postgresql?--privileged?-e?POSTGRES_PASSWORD=password?-p?15433:5432?-v?/data/postgres:/var/lib/postgresql/data?-d?postgres

docker?ps?-a

docker?pull?postgres
docker?volume?create?postgre-data
docker?run?-id?--name=postgresql?-v?postgre-data:/var/lib/postgresql/data?-p?5432:5432?-e?POSTGRES_PASSWORD=123456?-e?LANG=C.UTF-8?postgres
代码语言:javascript
复制
1?搜索镜像?docker?search?<镜像名称>
2?下载镜像?docker?pull?<镜像名称>:<标签>
3?运行容器?docker?run?<选项>?<镜像名称>:<标签>
4?配置容器?docker?exec?<容器名称>?<命令>
5?保存容器?docker?commit?<容器名称>?<新镜像名称>:<标签>
6?导出容器?docker?save?-o?<文件名称>?<镜像名称>:<标签>
7?导入容器?docker?load?-i?<文件名称>

Navicat for PostgreSQL 是一个简单易用的 PostgreSQL 数据库开发图形工具。从编写简单的 SQL 查询到开发复杂的数据库,Navicat for PostgreSQL 旨在满足广泛的用户需求,从 PostgreSQL 初学者到经验丰富的开发人员。连接到本地/远程 PostgreSQL 服务器,并与 Amazon Redshift、Amazon Aurora、Amazon RDS、Google Cloud 和 Microsoft Azure 等云数据库以及所有 PostgreSQL 数据库对象兼容。

  1. Apache Bench (ab) :Apache Bench是一个简单而强大的HTTP性能测试工具,它通常随着Apache Web服务器一起提供。您可以使用Homebrew来安装它:brew install ab
  2. Wrk:Wrk是一个现代的HTTP性能测试工具,具有线程化设计和支持Lua脚本等特性。您可以使用Homebrew来安装它:brew install wrk
  3. Siege:Siege是另一个流行的HTTP性能测试工具,具有简单易用的特性。您可以使用Homebrew来安装它:brew install siege
  4. Vegeta:Vegeta是一个命令行工具,用于基于HTTP进行负载测试和性能分析。您可以使用Homebrew来安装它:brew install vegeta
  5. JMeter:Apache JMeter是一个功能强大的Java应用程序,用于执行各种负载测试和性能测量,不仅限于HTTP。您可以从官方网站下载并手动安装它:Apache JMeter。

创建MQTT pub Sampler录入要发送MQTT的topic,如果需要发送不同数据,可以创建一个CVS,从表里获取数据。这时候在Pub sampler 里就需要使用${}来获取数据,字符串要加“”。

如果要模拟多个设备,那就创建多个线程组即可。如果想要测试MQTT服务能承受多大的并发, 可以根据需要设置线程数和间隔时间,不过这个数量如果特别大的话,并发量会不精准,但总体上还是可以达到我们的测试目的。

  • 最好设置一个定时器,控制发送的频率。比如设置10毫秒一次,相当于1个线程1秒发送100次数据

注意超时时间,这里默认的是10毫秒,如果MQTT服务不稳定,可能会出现偶尔连不上的问题,建议1000毫秒

代码语言:javascript
复制
public?enum?ServiceError?{

????NORMAL(1,?"操作成功"),
????UN_KNOW_ERROR(-1,?"未知错误"),

????/**?Global?Error?*/
????GLOBAL_ERR_NO_SIGN_IN(-10001,"未登录或登录过期/Not?sign?in"),
????GLOBAL_ERR_NO_CODE(-10002,"code错误/error?code"),
????GLOBAL_ERR_NO_AUTHORITY(-10003,?"没有操作权限/No?operating?rights"),
????;

????private?int?code;
????private?String?msg;

????private?ServiceError(int?code,?String?msg)
????{
????????this.code=code;
????????this.msg=msg;
????}

????public?int?getCode()?{
????????return?code;
????}

????public?String?getMsg()?{
????????return?msg;
????}
}

springboot 启动类

jar启动请忽略,war启动请继承 SpringBootServletInitializer

代码语言:javascript
复制
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.boot.builder.SpringApplicationBuilder;
import?org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public?class?SecurityApplication?extends?SpringBootServletInitializer?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(SecurityApplication.class,?args);
????}

????//?war启动请实现该方法
????@Override
????protected?SpringApplicationBuilder?configure(SpringApplicationBuilder?builder)?{
????????return?builder.sources(SecurityApplication.class);
????}
}

Docker Compose是一个用于定义和运行多个Docker容器的工具。它允许您使用YAML文件来配置应用程序的服务、网络和卷,并使用单个命令启动、停止和管理整个应用程序。通过Docker Compose,您可以在一个命令中启动包含多个容器的应用程序,而无需手动运行多个docker run命令。

Docker Compose的核心概念包括:

  1. 服务(Services) :指应用程序中的不同组件,每个服务通常对应一个容器。
  2. 项目(Project) :指由一组关联的服务组成的完整应用程序。
  3. YAML文件:用于定义项目结构、服务配置和依赖关系的文本文件,通常称为docker-compose.yml

使用Docker Compose,您可以轻松地在开发、测试和生产环境中部署和管理复杂的容器化应用程序。

全局参数

filter

监测数据项统一过滤,保留两位小数。

代码语言:javascript
复制
{{10.23123|montionFilter?}}

扫码登录流程讲解、获取授权登录二维码

微信开放平台的方式应该是最舒服的微信扫码登陆了,但是前提需要交认证300元的认证费用,网站的话还需要提交《微信开放平台网站信息登记表》,也是审核最麻烦的方式,只好先pass啦

开发者认证

网站审核

时序图总结流程:

1、用户点击网站微信登陆图标。

2、网站带上AppID和AppSecret和回调域名参数请求微信OAuth2.0授权登陆。

3、第二步通过后,微信返回二维码供用户扫码。

4、用户扫码确定授权。

5、微信带上code参数回调java后端相关接口。

6、java后端获取到code后,在带上带上AppID和AppSecret和code再去调微信接口。

7、获取access_token后就可以解析用户的一些基本信息,比如:微信用户头像、用户名、性别、城市等一些基本参数。

准备工作

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者账号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

授权流程说明

微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

代码语言:javascript
复制
1.?第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2.?通过code参数加上AppID和AppSecret等,通过API换取access_token;
3.?通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

第一步:请求CODE

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接: https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

代码语言:javascript
复制
1.?若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2.?若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

请求方法

获取第一步的code后,请求以下链接进行refresh_token:

代码语言:javascript
复制
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
代码语言:javascript
复制
1、Appsecret?是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
2、access_token?为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token?后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
3、refresh_token?为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token?泄漏,风险同上;
4、如无特别业务需求,建议开发者自行管理业务登录态并合理设置过期时间,减少用户重新授权登录次数,优化用户体验。

建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

对于接口作用域(scope),能调用的接口有以下:

授权作用域(scope)

接口

接口说明

snsapi_base

/sns/oauth2/access_token

通过code换取access_token、refresh_token和已授权scope

snsapi_base

/sns/oauth2/refresh_token

刷新或续期access_token使用

snsapi_base

/sns/auth

检查access_token有效性

snsapi_userinfo

/sns/userinfo

获取用户个人信息

  1. 什么是授权临时票据(code)? 答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。
  2. 什么是授权作用域(scope)? 答:授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应scope的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。
  1. 当认证完成之后,我们即可以创建网站应用

Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo-左眼会陪右眼哭の博客

1、微信开放平台介绍(申请里面的网站应用需要企业资料) 微信开放平台网站:https://open.weixin.qq.com/

2、什么是appid、appsecret、授权码code appid和appsecret是 资源所有者向申请人分配的一个id和秘钥 code是授权凭证,A->B 发起授权,想获取授权用户信息,那a必须携带授权码,才可以向B获取授权信息 (你要从我这里拿东西出去,就必须带身份证)

3、先仔细阅读下微信开放平台 官方给出的微信登录开发指南: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

代码语言:javascript
复制
#????1、扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_2
#????2、名称理解
????????appid:公众号唯一标识
????????appsecret:公众号的秘钥
????????mch_id:商户号,申请微信支付的时候分配的
????????key:支付交易过程生成签名的秘钥,设置路径?
????????????微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->密钥设置
#????3、和微信支付交互方式
????????1、post方式提交
????????2、xml格式的协议
????????3、签名算法MD5
????????4、交互业务规则?先判断协议字段返回,再判断业务返回,最后判断交易状态
????????5、接**易单位为?分
????????6、交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付

微信支付业务流程说明:

(1)商户后台系统根据用户选购的商品生成订单。

(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;

(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。

(4)商户后台系统根据返回的code_url生成二维码。

(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。

(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。

(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。

(8)微信支付系统根据用户授权完成支付交易。

(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。

(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。

(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。

(12)商户确认订单已支付后给用户发货。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • springboot 启动类
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com