AI 大模型与智能应用
实践与技术

专注分享 AI 大模型、Agent 开发、深度学习等技术实战与架构设计;兼具 C#/.NET 后端开发经验

118
技术文章
8
文章分类
537
技术标签
29971
累计字数
Spring 依赖注入:为什么构造器注入优于 @Autowired 字段注入?
后端开发
2022-12-06 • 0k

Spring 依赖注入:为什么构造器注入优于 @Autowired 字段注入?

在 Spring 开发中,依赖注入(DI)是我们每天都在使用的核心功能。很多开发者习惯直接在字段上加 @Autowired,因为这样写起来最快、最简洁。但你可能不知道,Spring 官方和社区早已将构造器注入(Constructor Injection)列为首选方式。 那么,@Autowired 字段注入和构造器注入到底有什么区别?为什么说后者更优秀?本文将从强制性、不变性、测试友好性、循环依赖、代码耦合等多个维度进行深度对比,并给出明确的最佳实践建议。 一、两种注入方式快速回顾 1. 字段注入(Field Injection) @Service public class UserService { @Autowired private UserRepository userRepository; // 直接写在字段上 public void doSomething() { userRepository.save(); } } 2. 构造器注入(Constructor Injection) @Service public class UserService { private final UserRepository userRepository; // Spring 4.3+ 如果只有一个构造器,可以省略 @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } // 业务方法... } 配合 Lombok 可以更简洁:

Java Spring 依赖注入
阅读更多
.NET 版 StringJoiner:比 string.Join 更会「打扮」的字符串拼接器
后端开发
2022-10-15 • 0k

.NET 版 StringJoiner:比 string.Join 更会「打扮」的字符串拼接器

告别 string.Join 的局限——用扩展方法轻松添加前缀和后缀 在日常开发中,字符串拼接恐怕是最常见的操作之一。.NET 自带的 string.Join 方法已经非常强大:性能好、支持泛型、能正确处理 null,用它来连接集合中的元素简直不要太方便。 但是,如果你写过 Java,可能会怀念 StringJoiner 类——它除了分隔符,还允许你指定前缀和后缀。例如 new StringJoiner(", ", "[", "]").add("A").add("B") 可以得到 "[A, B]"。这种写法在生成日志、SQL 片段、JSON 数组字符串等场景下非常实用。 那么,在 .NET 中能否也拥有这样的能力?当然可以。今天我们就来自己动手,为 IEnumerable<T> 写一个扩展方法,让它支持前缀和后缀,并且保持 string.Join 的高效和简洁。 一、原生 string.Join 的局限性 假设我们有一个水果列表: var fruits = new List<string> { "苹果", "香蕉", "橙子" }; 想要输出 "[苹果, 香蕉, 橙子]",用 string.Join 只能做到中间部分: string middle = string.Join(", ", fruits); // "苹果, 香蕉, 橙子" string result = "[" + middle + "]"; // "[苹果, 香蕉, 橙子]" 虽然也不麻烦,但当拼接逻辑多次出现时,重复写前缀后缀会显得啰嗦,也容易出错。更好的方式是一次性声明“分隔符、前缀、后缀”。 二、目标 API 设计 我们希望像这样使用: string result = fruits.JoinWithSurround(", ", "[", "]"); // 输出: [苹果, 香蕉, 橙子] 第一个参数:分隔符(string) 第二个参数:前缀(string) 第三个参数:后缀(string) 同时,还要支持自定义元素到字符串的转换(类似于 Select),并且处理空集合时的行为(返回 prefix + suffix,类似 Java 的 StringJoiner)。

C# .NET 扩展方法
阅读更多
上传文件路径怎么写最稳?详解 ASP.NET 三种路径写法的区别
后端开发
2022-08-24 • 0k

上传文件路径怎么写最稳?详解 ASP.NET 三种路径写法的区别

在 ASP.NET 项目里,文件上传、导出、日志落盘都离不开“路径”。很多人常见三种写法: Server.MapPath("~/Uploads/...") Server.MapPath("/Uploads/...") Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Uploads", ...) 看起来都能用,但它们的“参照点”不同,部署后表现也可能完全不一样。 1. Server.MapPath("~/Uploads/..."):基于应用根目录 ~ 表示当前 Web 应用根目录(virtual app root)。 var path = Server.MapPath("~/Uploads/2026/04/16"); 特点: 最符合 Web 应用语义 项目部署到虚拟目录(如 /MyApp)时仍然稳定 在 Controller/Page 中最推荐 适用场景: 上传文件 站内资源落盘 需要明确“当前应用目录”的所有场景 2. Server.MapPath("/Uploads/..."):基于站点根目录 / 表示IIS 站点根,不一定是你的应用根。(.net core /.net 6+ 已废弃) var path = Server.MapPath("/Uploads/2026/04/16"); 特点: 参照的是站点,不是应用 当应用是虚拟目录时,容易映射到“应用外”路径 多应用共站点时风险更高 适用场景: 你明确要访问站点级共享目录 对 IIS 站点结构有完全掌控 3. AppDomain.CurrentDomain.BaseDirectory:基于进程物理基目录 这是纯 .NET 物理路径方式,不经过虚拟路径解析。 var path = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "Uploads", "2026", "04", "16"); 特点: 不依赖 HttpContext,后台任务、定时任务也能用 更“宿主相关”,在不同运行环境下基目录可能不同 适合非 Web 请求上下文代码 适用场景: Windows Service / Console / Job Web 项目中脱离请求管道的后台处理逻辑 三种方式对比总结 最稳妥的 Web 上传路径:Server.MapPath("~/...") 明确站点级路径才用:Server.MapPath("/...") 非请求上下文或通用 .NET 程序:BaseDirectory + Path.Combine 实战建议(上传功能) 在 Controller 中写上传目录时,优先:

ASP.NET C# 路径
阅读更多
Win11 右键菜单一键切换:让「显示更多选项」彻底消失
工具与效率
2022-07-02 • 0k

Win11 右键菜单一键切换:让「显示更多选项」彻底消失

Windows 11 默认的右键菜单把很多常用功能折叠进了“显示更多选项”,每次都要多点一下,实在烦人。其实系统内置了一条命令,可以一键切换回经典的 Win10 完整菜单,而且随时能恢复。 操作步骤(全程 30 秒搞定) 以管理员身份打开“Windows 终端”(或命令提示符)。 粘贴对应命令,按回车执行: ➡️ 切换到 Win10 经典完整菜单 reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve ⬅️ 恢复 Win11 默认菜单 reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f 重启资源管理器让生效: taskkill /f /im explorer.exe & start explorer.exe 或者 taskkill /f /im explorer.exe; start explorer.exe 执行后屏幕会闪一下,菜单样式就变了。 临时查看完整菜单的小技巧 如果不想修改系统设置,只需在右键时按住 Shift 键,弹出的就是经典完整菜单,用完即走,不留痕迹。 注意:该方法仅影响右键菜单的折叠/展开样式,不会删除或禁用任何菜单项,安全可靠。

Windows Windows 11 注册表
阅读更多
Axios + async/await:你以为的「同时请求」,可能正在串行执行
前端开发
2022-05-12 • 0k

Axios + async/await:你以为的「同时请求」,可能正在串行执行

一个小小的 await 顺序,可能让你的接口总耗时翻倍 在现代前端开发中,axios 搭配 async/await 几乎是请求接口的标配写法。但很多人可能没意识到:同样是写 await,两个接口的完成时间可能相差一倍。 场景复现 假设你有两个接口:接口 A 和接口 B,每个都需要较长时间才能返回数据(比如各需 10 秒)。 现在你需要在同一个 async 函数里依次请求它们,最后拿到两个数据。 来看这段代码: async function fetchData() { const resA = await axios.get('/api/A'); // 耗时较长 const resB = await axios.get('/api/B'); // 耗时较长 return [resA, resB]; } 问题:这个函数的总执行时间是多长? 等于单个接口的时间? 还是两个接口时间之和? 答案是 两个接口时间之和(例如 10+10=20 秒)。 因为 await 会阻塞后续代码的执行:先等 A 完成,再开始请求 B,两个请求是串行的。 真正的“同时请求”:只需要最慢那个接口的时间 很多时候,接口 A 和接口 B 之间并没有依赖关系(B 不需要 A 的返回结果)。这种情况下,完全可以让它们并行发起,从而把总耗时压缩到 单个最慢接口的耗时。 并行写法一:先发起请求,后 await async function fetchData() { const promiseA = axios.get('/api/A'); // 立即发起,不等待 const promiseB = axios.get('/api/B'); // 立即发起,不等待 const [resA, resB] = await Promise.all([promiseA, promiseB]); return [resA, resB]; } 并行写法二:直接 Promise.all async function fetchData() { const [resA, resB] = await Promise.all([ axios.get('/api/A'), axios.get('/api/B') ]); return [resA, resB]; } 两种写法效果完全一样:两个请求几乎同时发出,总耗时 ≈ max(耗时A, 耗时B)。

JavaScript Axios async/await
阅读更多
jQuery给编译后页面中vue变量赋值
前端开发
2022-04-14 • 0k

jQuery给编译后页面中vue变量赋值

要赋值的input框 <input tabindex="1" type="text" autocomplete="off" placeholder="AppID" name="appId" class="el-input__inner"> 通过name获取对象赋值 $("input[name='appId']").val("24563574-04f5-4a44-848e-84ea81677e34"); 赋值后没有效果,需要触发vue事件 $("input[name='appId']")[0].dispatchEvent(new Event('input'))

JQ vue jQuery
阅读更多
压力测试工具jmeter安装使用
工具与效率
2021-11-26 • 0k

压力测试工具jmeter安装使用

一、安装jmeter jmeter3.3以上要匹配8.0以上jdk,所以安装前需要先安装JDK。 JDK下载地址: https://www.oracle.com/java/technologies/downloads/#java8-windows 安装后在CMD窗口输入java -version,出现版本号即安装成功。 jmeter下载地址: http://jmeter.apache.org/download_jmeter.cgi 配置环境变量: #添加JMETER_HOME,路径就是jmeter保存的位置 JMETER_HOME=D:\Program Files\apache-jmeter-5.4.1 #添加CLASSPATH CLASSPATH=%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar; #修改path,在后面添加 %JMETER_HOME%\bin cmd窗口输入jmeter运行或者双击bin目录下jmeter.bat 二、使用jmeter 1、新建线程组 在计划右键–新建线程组 如果默认没有计划, 点击菜单种文件–新建计划 线程组控制面板: 线程数:您正在测试的用户数 加速时间:您希望允许线程组从0到N个用户的时间 循环计数:应该循环测试的次数 调度器:测试持续时间,启动延迟时间 2、新建http请求 在线程组右键–添加–取样器–http请求 post json 请求 json数据放到消息体数据中 自定义请求头,在HTTP请求右键–添加–配置原件–HTTP信息头管理器 3、查看结果 线程组–添加–监听器–[察看结果数 / 汇总报告 / 聚合报告]

jmeter 测试
阅读更多
Nginx的基本使用
运维与DevOps
2021-11-18 • 0k

Nginx的基本使用

什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 反向代理 Nginx 根据接收到的请求的端口,域名,url,将请求转发给不同的机器,不同的端口(或直接返回结果),然后将返回的数据返回给客户端。 安装Nginx #如果缺少依赖,先安装依赖 yum -y install gcc gcc-c++ openssl openssl-devel #下载 wget http://nginx.org/download/nginx-1.20.1.tar.gz #进入服务安装包目录,这里放到了home/server cd /home/server/ #解压tar包 tar -zxvf nginx-1.20.1.tar.gz #进入解压nginx目录 cd nginx-1.20.1 #执行configure进行配置,这里配置可以根据自己项目需要进行自定义配置 ./configure --prefix=/usr/local/nginx --with-http_ssl_module #执行安装 make && make install Nginx配置参数中文详细说明 #定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; # #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; # #进程文件 pid /var/run/nginx.pid; # #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致. worker_rlimit_nofile 65535; # #工作模式与连接数上限 events { #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型. use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535; } # #设定http服务器 http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 #charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的hash表大小 client_header_buffer_size 32k; #上传文件大小限制 large_client_header_buffers 4 64k; #设定请求缓 client_max_body_size 8m; #设定请求缓 # 开启目录列表访问,合适下载服务器,默认关闭. autoindex on; # 显示目录 autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间 sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off. tcp_nopush on; # 防止网络阻塞 tcp_nodelay on; # 防止网络阻塞 keepalive_timeout 120; # (单位s)设置客户端连接保持活动的超时时间,在超过这个时间后服务器会关闭该链接 # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解. fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; # gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大 gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果 gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn. gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据 #开启限制IP连接数的时候需要使用 #limit_zone crawler $binary_remote_addr 10m; ##upstream的负载均衡,四种调度算法(下例主讲)## #虚拟主机的配置 server { # 监听端口 listen 80; # 域名可以有多个,用空格隔开 server_name blog.raikay.cn; # HTTP 自动跳转 HTTPS rewrite ^(.*) https://$server_name$1 permanent; } server { # 监听端口 HTTPS listen 443 ssl; server_name blog.raikay.cn; # 配置域名证书 ssl_certificate ssl/fullchain.cer; ssl_certificate_key ssl/blog.raikay.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; index index.html index.htm index.php; root /data/www/; location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } # 配置地址拦截转发,解决跨域验证问题 location /oauth/{ proxy_pass https://localhost:13580/oauth/; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } # JS和CSS缓存时间设置 location ~ .*\.(js|css)?$ { expires 1h; } # 日志格式设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; # 定义本虚拟主机的访问日志 access_log /var/log/nginx/access.log access; # 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生. } } } 负载均衡配置 events { use epoll; worker_connections 65535; } http { ##upstream的负载均衡,四种调度算法## #调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响 upstream webhost { server 192.168.0.5:6666 ; server 192.168.0.7:6666 ; } #调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大 upstream webhost { server 192.168.0.5:6666 weight=2; server 192.168.0.7:6666 weight=3; } #调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题 upstream webhost { ip_hash; server 192.168.0.5:6666 ; server 192.168.0.7:6666 ; } #调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包 upstream webhost { server 192.168.0.5:6666 ; server 192.168.0.7:6666 ; hash $request_uri; } #调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块 # #虚拟主机的配置(采用调度算法3:ip_hash) server { listen 80; server_name mongo.demo.com; #对 "/" 启用反向代理 location / { proxy_pass http://webhost; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选. proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } } } 301跳转 server{ listen 80; server_name raikay.cn; rewrite ^/(.*) http://www.raikay.cn/$1 permanent; } 添加404页面 server{ error_page 404 /404.html; } 禁止直接IP访问 server{ listen 80 default; server_name _; return 403; } 设置白名单 # allow:允许访问 、deny:禁止 server { allow 100.110.15.16; allow 100.110.15.17; allow 100.110.15.18; allow 127.0.0.1; deny all; } 常用命令 nginx -s reopen #重启Nginx nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx nginx -s stop #强制停止Nginx服务 nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务) nginx -?,-h #打开帮助信息 nginx -v #显示版本信息并退出 nginx -V #显示版本和配置选项信息,然后退出 nginx -t #检测配置文件是否有语法错误,然后退出 nginx -T #检测配置文件是否有语法错误,转储并退出 nginx -q #在检测配置文件期间屏蔽非错误信息 nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf) nginx -g directives #设置配置文件外的全局指令 killall nginx #杀死所有nginx进程 高可用 一台Nginx服务器支持不住高并发时,部署多台Nginx服务器,并且每台Nginx服务器都部署keepalived,设置同一个虚IP(VIP),访问这个VIP(域名解析时解析到VIP)时会漂移到其中一台Nginx服务器,实现负载均衡。

nginx 中间件 服务器
阅读更多
linux系统常用基础命令
运维与DevOps
2021-11-15 • 0k

linux系统常用基础命令

目录操作 #当前目录 pwd # 创建目录 mkdir $HOME/testFolder #切换目录 cd $HOME/testFolder #切换到上一级目录 cd ../ # 移动 mv $HOME/testFolder /var/tmp #删除 rm -rf /var/tmp/testFolder #查看目录下的文件 # /etc 目录默认是 Unix 系统的软件配置文件存放位置 ls /etc #竖着显示查询结果 ls -l / #查看所有目录包括子目录(效果很酷) ls -R / 文件操作 #创建 touch ~/testFile #复制 cp ~/testFile ~/testNewFile #删除 rm ~/testFile #查找名称包含nginx的.conf文件 find / -name '*.conf' |grep nginx #解压: # tar.gz tar tgz tar xzvf FileName.tar.gz #压缩: tar czvf FileName.tar.gz DirName 查看文件 #一、从第3000行开始,显示1000行。即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 #二、显示1000行到3000行 cat filename| head -n 3000 | tail -n +1000 #----------------------------- #注意两种方法的顺序 # 分解: # tail -n 1000:显示最后1000行 # tail -n +1000:从1000行开始显示,显示1000行以后的 # head -n 1000:显示前面1000行 #-------------------------------- #三、用sed命令 sed -n '5,10p' filename 这样就可以只查看文件的第5行到第10行。 #过滤出 /etc/passwd 文件中包含 root 的记录 grep 'root' /etc/passwd #递归地过滤出 /var/log/ 目录中包含 linux 的记录 grep -r 'linux' /var/log/ #重定向 #可以使用 > 或 < 将命令的输出到一个文件中 echo 'Hello World' > ~/test.txt #复杂查询 https://blog.51cto.com/xuqq999/774714 远程复制文件 #整个文件夹 scp -r /home/administrator/test/ root@192.168.1.100:/root/ # 单个文件 scp /home/administrator/Desktop/old/driver/test/test.txt root@192.168.1.100:/root/ #下载到本地 scp -r root@192.168.62.10:/root/ /home/administrator/Desktop/new/ 系统综合 #重启 reboot #下面三个是一样的,都是当前用户主目录 cd ~ cd $HOME cd /home/UserName #查看发行版 cat /etc/os-release find /etc/*-release #查看系统版本 cat /proc/version #查看系统信息 uname -a #查看正在运行的进程 ps -ef | grep java #实时查看服务器性能 top #对 blog.raikay.cn 发送 4 个 ping 包, 检查与其是否联通 ping -c 4 blog.raikay.cn #过滤得到当前系统中的 ssh 进程信息 ps -aux | grep 'ssh' # 权限 chmod -R 777 权限 服务管理 #Centos7.5的服务管理是systemctl systemctl start httpd.service #启动,不加 .server也可以 systemctl stop httpd.service #停止 systemctl status httpd.service #查看状态 systemctl restart httpd.service #重启 systemctl enable httpd.service #开机启动 Systemctl enable serviceName #开启服务的开机自启动 systemctl disable firewalld.service #禁止firewall开机启动 Systemctl disable serviceName #关闭服务的开机自启动 #ububtu启动服务 #apache2 /etc/init.d/apache2 start #restart stop #ssh /etc/init.d/ssh start #restart stop 网络 #netstat 命令 #netstat 命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等 #列出所有处于监听状态的tcp端口 netstat -lt #查看所有的端口信息, 包括 PID 和进程名称 netstat -tulpn 检查网卡

阿里云 流水线 云效Flow 实现持续集成、持续部署(CI/CD)
运维与DevOps
2021-09-22 • 0k

阿里云 流水线 云效Flow 实现持续集成、持续部署(CI/CD)

新建流水线 选择对应语言,新建流水线 选择代码源 这个代码我托管在云效自带的Codeup 代码结构 设置代码源触发 开启代码源触发,并添加Webhook,Codeup会带动添加,如果是码云、github等其他托管平台,需要手动将下面webhook地址添加到代码托管平台对应的Webhook 配置构建 配置部署 新建主机,部署项目的服务器,如果是集群可以添加多台 如果账号内有阿里云ECS直接选择即可,否则选自有服务器,复制脚本在目标服务器执行 添加部署脚本和变量 脚本 $image变量是配置的镜像仓库地址,在上游构建时,会将构建好的docker镜像推送到这个地址 echo $image #停止正在运行的容器 docker stop apidemo #删除容器 docker rm apidemo #拉取容器 docker pull $image #运行新容器 docker run -d -p 1080:80 --name apidemo $image 完成自动构建、部署 提交代码触发流水线 云效2020文档地址:https://help.aliyun.com/product/150040.html 云效Flow地址:https://flow.aliyun.com/ 云效地址:https://devops.aliyun.com/

dotnet DevOps Linux
阅读更多