ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件
2022/4/17 7:12:41
本文主要是介绍ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件
- 整体文件结构介绍
- 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter
- config文件夹
- appsettings.json
- key.json
- nginx.conf
- pubish文件夹主要存放项目的发布文件
- docker-compose
- Dockerfile
- config文件夹
- 网关+Nginx文件夹:Nginx_GateWay
- config文件夹
- appsetings.json
- OcelotConfiguration.json
- nginx.conf
- publish文件夹存放项目的发布内容
- docker-compose
- Dockerfile
- config文件夹
- Consul+Nginx文件夹:Nginx_Consul
- Config文件夹
- nginx.conf
- docker-compose
- Config文件夹
- 用户微服务文件夹:User
- config文件夹
- appsettings.json
- publish存放项目发布文件
- docker-compose
- Dockerfile
- config文件夹
- 课程微服务文件夹:Lesson
- config文件夹
- appsettings.json
- publish存放项目的发布文件
- docker-compose
- Dockerfile
- config文件夹
- 各类Shell脚本文件
- authenticationcenter_svc.sh
- gateway.sh
- lesson_svc.sh
- update.sh
- mysql文件夹
- docker-compose
ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件
整体文件结构介绍
- 项目文件夹:TestProject
- 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter
- config文件夹
- publish文件夹
- docker-compose
- Dockerfile
- 网关+Nginx文件夹:Nginx_GateWay
- config文件夹
- publish文件夹
- docker-compose
- Dockerfile
- Consul+Nginx文件夹:Nginx_Consul
- config文件夹
- docker-compose
- 用户微服务文件夹:User
- config文件夹
- publish文件夹
- docker-compose
- Dockerfile
- 课程微服务文件夹:Lesson
- config文件夹
- publish文件夹
- docker-compose
- Dockerfile
- 各类SH脚本文件
- authenticationcenter_svc.sh
- gateway_svc.sh
- user_svc.sh
- lesson_svc.sh
- update_svc.sh
- start_svc.sh
- 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter
鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter
config文件夹
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ConfigInformation": { "RootUrl": "http://111.44.222.111:6300", //������� "UserUrl": "/api/userapi/User/validate", "JWTTokenOptions": { "Audience": "http://localhost:8761", "Issuer": "http://localhost:8761", "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB" } } }
key.json
{"D":"ayJEcDAFTdAjKtn/wUvAe0z0RtXcOFENJm55PaTbDV8QAKfKKENY5K+nvU36uSi3qh2xP6NVoo3H3rDlk6X8AEuAOQs+arGfHQ/aL4Ob3skuEioHWszXScJ2KTzrrsolOik9SybNLRSMIgQKyZY5URk3BhLqSvMDwBQ2Nht/mlx+eQi1GpPgiJFH77BlRt3O/LKafAtgS292RxeKUJn3Q4dsn1PtJX+PMPT+bn+9PZXpQtSI8r8yUtrFja61WcGN8aJrG47EfT5wa3J/mcfhEK+4hU2uI3ycW+TaNjuxDZ+nAD4k3pcNT6a1ldSi3CnZKR2p/MUh07oazmx2QEg54Q==","DP":"t58aASvJT2+mQCi9EN5RksOXrgzGNB2U6PeS8NJ9ht6HiA78+fZKrfbxXxz8i/069Tyg7dkzYeKFd93q9FhFKqsOGE67gqjelKIXFTN2s2DFiJ7neFHkIhPisdS/a+SzHziFsxYHJbWobuHlrDw2QcoYGDsgS1Crbatn7t90Hfs=","DQ":"dzpHSw7DD1vwy+mOX5nRJLVniSmcIX8MMWtCXlmzj6CdUddyiGSGFhTB+hjVHLPxsJAzoV4zBFRt1s+CHGlgjhfD6ct58i7bDVG/6OVUI4v95iYiA7kPB44DlOzVjuhlGmTm5Tw5eTwjA3s/5FUuif0DShzt4jam7f+jlTvkXaM=","Exponent":"AQAB","InverseQ":"MTykln8IgIQ2DwhC4d0d/RXNk5/PvKXSY8goldKfxCiAwTmArivvuxfHC01oKFlZkZbPRVvh0rM9QkM4pX9ITfKd4+VoxmDtMMx5oEkbxKMbJQkUvJeADmtcy/zfXq8ZNSNcIkAI4setydA6tOvRZKuudJ5tEpXOxwTel8U5ltM=","Modulus":"o0jSDb5OYfSTPFPjZS67yovVQLEA5OIrey/1mBCH8Xxvo1zLwKPYzWwkRjzSLURZ19V9AeKAiP+JxDtGRzmUflqXY3e7vKeEosk5MoUj4MlBvxVxDL3bdghJaqhARaqsuXQ1dvOGABsDIogBmvCJyJOBHXISLl+hDGIOQSpHqtMFz4UHAF5v62x82oMYT8O4lTfoTSF1+jMH31rCCERXFEz2DUngdsT8gwQncTMrVTS2dIdacvkWmN0yvzLmMqZetv12p10O7jjuN61hlhhccAibGeU3X1veOHS4L9TzQ0rLPK/yTm3QlShWZD8oiLBnNXGhS0m/RTk3Uc7IrvvaqQ==","P":"0daJpBirbZIUYZyqeXW6csoy2eKDO81G4DAe0gzyZUk7ZQ97H3sIRdKU05lmeR0KuEtp71LOaljx2MJ1vawF4zoJ3MQEjzQYQS0Gq5zLPrX/Q+Sy/7Brb9oYlfwDzlyszlZqjSyJjupNOAlpkTkytt6a5g6LtD44mo2A9XCteTM=","Q":"xzSFkOTiJGyTNatXO8pAxZyGg4qjAweJOL5wv5dGqFF7fWx92uJrMcGy6kda5A3aCE0KG0441fWjGPjzb6GvoTzwADRx4mNhOcVV0gx/lbKydc15KaBNEX29TkmYbG4dRQ5wOs+FBm0PAHcQgK64AFYhobG4w8VZBLxCXdwndLM="}
nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream authentication{ server 111.44.222.111:6597; server 111.44.222.111:6598; server 111.44.222.111:6599; } server { listen 80; server_name localhost; location / { proxy_pass http://authentication; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
pubish文件夹主要存放项目的发布文件
docker-compose
version: '3.3' services: serviceocelot1: build: context: /home/TestProject/AuthenticationCenter/ dockerfile: /home/TestProject/AuthenticationCenter/Dockerfile image: authenticationcenter.v0127 ports: - 6597:80/tcp container_name: "AuthenticationCenter1" command: "dotnet /app/Common.AuthenticationCenter.dll" volumes: - /home/TestProject/AuthenticationCenter/config/appsettings.json:/app/appsettings.json serviceocelot2: image: authenticationcenter.v0127 ports: - 6598:80/tcp container_name: "AuthenticationCenter2" command: "dotnet /app/Common.AuthenticationCenter.dll" volumes: - /home/TestProject/AuthenticationCenter/config/appsettings.json:/app/appsettings.json nginxocelot: depends_on: - serviceocelot2 image: nginx:latest ports: - 6600:80/tcp container_name: "nginxAuthenticationCenter" volumes: - /home/TestProject/AuthenticationCenter/config/nginx.conf:/etc/nginx/nginx.conf
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base EXPOSE 80 COPY ./publish app/ WORKDIR /app ENTRYPOINT ["dotnet", "Common.AuthenticationCenter.dll"]
网关+Nginx文件夹:Nginx_GateWay
config文件夹
appsetings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "JWTTokenOptions": { "Audience": "http://localhost:8761", "Issuer": "http://localhost:8761", "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB" } }
OcelotConfiguration.json
{ "Routes": [ { "UpstreamPathTemplate": "/api/lessonapi/{url}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Patch", "Delete", "Options" ], "UserServiceDIscovery": true, "ServiceName": "LessonCenter", "LoadBalancerOptions": { "Type": "RoundRobin" }, "DownstreamPathTemplate": "/api/lessonapi/{url}", "DownstreamScheme": "http", "DownstreamHeaderTransform": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "*", "Access-Control-Allow-Headers": "*" }, "AuthenticationOptions": { "AuthenticationProviderKey": "UserGatewayKey", "AllowedScopes": [] } }, { "UpstreamPathTemplate": "/lesson/swagger/v1/swagger.json", "UpstreamHttpMethod": [ "Get" ], "UseServiceDiscovery": true, "ServiceName": "LessonCenter", "LoadBalancerOptions": { "Type": "RoundRobin" }, "DownstreamPathTemplate": "/swagger/v1/swagger.json", "DownstreamScheme": "http", "RateLimitOptions": { "ClientWhiteList": [ "ajun816", "superhero" ], "EnableRateLimiting": true, "Period": "5m", "PeriodTimespan": 30, "Limit": 5 } }, { "UpstreamPathTemplate": "/api/userapi/{url}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Patch", "Delete", "Options" ], "UserServiceDIscovery": true, "ServiceName": "UserCenter", "LoadBalancerOptions": { "Type": "RoundRobin" }, "DownstreamPathTemplate": "/api/userapi/{url}", "DownstreamScheme": "http", "DownstreamHeaderTransform": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "*", "Access-Control-Allow-Headers": "*" } }, { "UpstreamPathTemplate": "/user/swagger/v1/swagger.json", "UpstreamHttpMethod": [ "Get" ], "UseServiceDiscovery": true, "ServiceName": "UserCenter", "LoadBalancerOptions": { "Type": "RoundRobin" }, "DownstreamPathTemplate": "/swagger/v1/swagger.json", "DownstreamScheme": "http", "RateLimitOptions": { "ClientWhiteList": [ "ajun816", "superhero" ], "EnableRateLimiting": true, "Period": "5m", "PeriodTimespan": 30, "Limit": 5 } }, "GlobalConfiguration": { "BaseUrl": "http://127.0.0.1:8070", //网关对外地址 "ServiceDiscoveryProvider": { "Host": "127.0.0.1", "Port": 8500, "Type": "Consul" //由Consul提供服务发现 }, "RateLimitOptions": { "QuotaExceededMessage": "Too many requests, maybe later? 11", // 当请求过载被截断时返回的消息 "HttpStatusCode": 666, // 当请求过载被截断时返回的http status "ClientIdHeader": "client_id" // 用来识别客户端的请求头,默认是 ClientId } } }
nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream mygateway{ server 111.44.222.111:6297; server 111.44.222.111:6298; server 111.44.222.111:6299; } server { listen 80; server_name localhost; location / { proxy_pass http://mygateway; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
publish文件夹存放项目的发布内容
docker-compose
version: '3.3' services: gateway1: build: context: ${currpwd} dockerfile: ${currpwd}/Dockerfile image: gateway.v1 ports: - 6297:80/tcp container_name: "gatewayservice1" command: "dotnet /app/Common.OcelotGateway.dll" volumes: - ${currpwd}/config/OcelotConfiguration.json:/app/OcelotConfiguration.json gateway2: image: gateway.v1 ports: - 6298:80/tcp container_name: "gatewayservice2" command: "dotnet /app/Common.OcelotGateway.dll" volumes: - ${currpwd}/config/OcelotConfiguration.json:/app/OcelotConfiguration.json gateway3: image: gateway.v1 ports: - 6299:80/tcp container_name: "gatewayservice3" command: "dotnet /app/Common.OcelotGateway.dll" volumes: - ${currpwd}/config/OcelotConfiguration.json:/app/OcelotConfiguration.json nginxocelot: depends_on: - gateway3 image: nginx:latest ports: - 6300:80/tcp container_name: "nginxocelot" volumes: - ${currpwd}/config/nginx.conf:/etc/nginx/nginx.conf
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base COPY ./publish app/ WORKDIR /app ENTRYPOINT ["dotnet", "Zhzt.Common.OcelotGateway.dll"]
Consul+Nginx文件夹:Nginx_Consul
Config文件夹
nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream consul { server 111.44.222.111:8500; server 111.44.222.111:9500; server 111.44.222.111:10500; server 111.44.222.111:11500; server 111.44.222.111:12500; } server { listen 80; server_name localhost; location / { proxy_pass http://consul; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
docker-compose
version: '3.3' services: service1: image: consul ports: - 8300:8300/tcp - 8301:8301/tcp - 8302:8302/tcp - 8400:8400/tcp - 8500:8500/tcp - 8600:8600/tcp - 8301:8301/udp - 8302:8302/udp container_name: "node1" command: "agent -server -bind=0.0.0.0 -bootstrap-expect=3 -node=node1 -data-dir=/tmp/data-dir -client=0.0.0.0 -ui" service2: depends_on: - service1 image: consul ports: - 9300:8300/tcp - 9301:8301/tcp - 9302:8302/tcp - 9400:8400/tcp - 9500:8500/tcp - 9600:8600/tcp - 9301:8301/udp - 9302:8302/udp container_name: "node2" command: "agent -server -bind=0.0.0.0 -join=101.43.223.131 -node=node2 -data-dir=/tmp/data-dir -client=0.0.0.0 -ui" service3: depends_on: - service2 image: consul ports: - 10300:8300/tcp - 10301:8301/tcp - 10302:8302/tcp - 10400:8400/tcp - 10500:8500/tcp - 10600:8600/tcp - 10301:8301/udp - 10302:8302/udp container_name: "node3" command: "agent -server -bind=0.0.0.0 -join=101.43.223.131 -node=node3 -data-dir=/tmp/data-dir -client=0.0.0.0 -ui" service4: depends_on: - service3 image: consul ports: - 11300:8300/tcp - 11301:8301/tcp - 11302:8302/tcp - 11400:8400/tcp - 11500:8500/tcp - 11600:8600/tcp - 11301:8301/udp - 11302:8302/udp container_name: "node4" command: "agent -bind=0.0.0.0 -retry-join=101.43.223.131 -node=node4 -client=0.0.0.0 -ui" service5: depends_on: - service4 image: consul ports: - 12300:8300/tcp - 12301:8301/tcp - 12302:8302/tcp - 12400:8400/tcp - 12500:8500/tcp - 12600:8600/tcp - 12301:8301/udp - 12302:8302/udp container_name: "node5" command: "agent -bind=0.0.0.0 -retry-join=101.43.223.131 -node=node5 -client=0.0.0.0 -ui" service6: depends_on: - service5 image: nginx ports: - 18500:80/tcp container_name: "consulnginx" volumes: - ./conf/nginx.conf:/etc/nginx/nginx.conf
用户微服务文件夹:User
config文件夹
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "MySqlConn": "Server=111.44.222.111;Database=db_user;Uid=root;Pwd=111111;SslMode=none;" }, "CodeFirstSettings": { "Migrate": "true", //是否开启同步(是否进行codefirst创建表) "Backup": "true", //是否进行备份 "ModelPath": "UserModel" //要进行同步的Model程序集路径 }, "SqlSugarSnowFlakeSettings": { "WorkerId": "1" }, "ConsulClientOption": { "IP": "111.44.222.111", "Port": "18500", "Datacenter": "dc1" }, "ConsulRegisterOption": { "IP": "111.44.222.111", "Port": "8761", "GroupName": "UserCenter", "HealthCheckUrl": "http://111.44.222.111:8761/Health", "Interval": 10, "Timeout": 5, "DergisterCriticalServiceAfter": 20, "Tag": "13" } }
publish存放项目发布文件
docker-compose
version: '3.3' services: user1: build: context: ${currpwd} dockerfile: ${currpwd}/Dockerfile image: user.v1 ports: - 10091:80/tcp container_name: "userservice1" command: "dotnet /app/UserMicroservice.dll ConsulRegisterOption:IP=111.44.222.111 ConsulRegisterOption:Port=10091 ConsulRegisterOption:HealthCheckUrl=http://111.44.222.111:10091/Health" volumes: - ${currpwd}/config/appsettings.json:/app/appsettings.json user2: depends_on: - user1 image: user.v1 ports: - 10092:80/tcp container_name: "userservice2" command: "dotnet /app/UserMicroservice.dll ConsulRegisterOption:IP=111.44.222.111 ConsulRegisterOption:Port=10092 ConsulRegisterOption:HealthCheckUrl=http://111.44.222.111:10092/Health" volumes: - ${currpwd}/config/appsettings.json:/app/appsettings.json
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base EXPOSE 80 COPY ./publish app/ WORKDIR /app ENTRYPOINT ["dotnet", "UserMicroservice.dll"]
课程微服务文件夹:Lesson
config文件夹
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "MySqlConn": "Server=111.44.222.111;Database=db_Lesson;Uid=root;Pwd=111111;SslMode=none;" }, "CodeFirstSettings": { "Migrate": "true", //是否开启同步(是否进行codefirst创建表) "Backup": "true", //是否进行备份 "ModelPath": "LessonModel" //要进行同步的Model程序集路径 }, "SqlSugarSnowFlakeSettings": { "WorkerId": "1" }, "JWTTokenOptions": { "Audience": "http://localhost:8761", "Issuer": "http://localhost:8761", "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB" }, //"ConsulClientOption": { // "IP": "111.44.222.111", // "Port": "18500", // "Datacenter": "dc1" //}, //"ConsulRegisterOption": { // "IP": "111.44.222.111", // "Port": "8761", // "GroupName": "LessonCenter", // "HealthCheckUrl": "http://111.44.222.111:8761/Health", // "Interval": 10, // "Timeout": 5, // "DergisterCriticalServiceAfter": 20, // "Tag": "13" //}, //本地测试ConsulClientOption "ConsulClientOption": { "IP": "localhost", "Port": "8500", "Datacenter": "dc1" }, "ConsulRegisterOption": { "IP": "localhost", "Port": "8761", "GroupName": "LessonCenter", "HealthCheckUrl": "http://localhost:8761/Health", "Interval": 10, "Timeout": 5, "DergisterCriticalServiceAfter": 20, "Tag": "13" } }
publish存放项目的发布文件
docker-compose
version: '3.3' services: lesson1: build: context: ${currpwd} dockerfile: ${currpwd}/Dockerfile image: lesson.v1 ports: - 10071:80/tcp container_name: "lessonservice1" command: "dotnet /app/LessonMicroservice.dll ConsulRegisterOption:IP=111.44.222.111 ConsulRegisterOption:Port=10071 ConsulRegisterOption:HealthCheckUrl=http://111.44.222.111:10071/Health" volumes: - ${currpwd}/config/appsettings.json:/app/appsettings.json lesson2: image: lesson.v1 ports: - 10072:80/tcp container_name: "lessonservice2" command: "dotnet /app/LessonMicroservice.dll ConsulRegisterOption:IP=111.44.222.111 ConsulRegisterOption:Port=10072 ConsulRegisterOption:HealthCheckUrl=http://111.44.222.111:10072/Health" volumes: - ${currpwd}/config/appsettings.json:/app/appsettings.json
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base EXPOSE 80 COPY ./publish app/ WORKDIR /app ENTRYPOINT ["dotnet", "LessonMicroservice.dll"]
各类Shell脚本文件
authenticationcenter_svc.sh
cd AuthenticationCenter export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d
gateway.sh
cd GateWay export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d
lesson_svc.sh
cd Lesson export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d
update.sh
- shell声明一个currpwd变量
- pwd 小写是命令 大写是变量 效果一样, Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
- 执行docker-compose时,传入这个变量(当前文件路径)
#!/bin/bash cd consul export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d cd .. cd GateWay export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d cd .. cd User export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d cd .. cd Lesson export currpwd=$(pwd) docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up --build -d
mysql文件夹
docker-compose
version: '3.3' services: service1: image: mysql:8.0 ports: - 3306:3306/tcp container_name: "db_mysql" volumes: - /home/data/mysql_data:/var/lib/mysql environment: - "MYSQL_ROOT_PASSWORD=111111" - "TZ=Asia/Shanghai"
这篇关于ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具