ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件

目录

ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件

整体文件结构介绍

  1. 项目文件夹:TestProject
    1. 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter
      1. config文件夹
      2. publish文件夹
      3. docker-compose
      4. Dockerfile
    2. 网关+Nginx文件夹:Nginx_GateWay
      1. config文件夹
      2. publish文件夹
      3. docker-compose
      4. Dockerfile
    3. Consul+Nginx文件夹:Nginx_Consul
      1. config文件夹
      2. docker-compose
    4. 用户微服务文件夹:User
      1. config文件夹
      2. publish文件夹
      3. docker-compose
      4. Dockerfile
    5. 课程微服务文件夹:Lesson
      1. config文件夹
      2. publish文件夹
      3. docker-compose
      4. Dockerfile
    6. 各类SH脚本文件
      1. authenticationcenter_svc.sh
      2. gateway_svc.sh
      3. user_svc.sh
      4. lesson_svc.sh
      5. update_svc.sh
      6. start_svc.sh

鉴权中心 + 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

  1. shell声明一个currpwd变量
  2. pwd 小写是命令 大写是变量 效果一样, Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
  3. 执行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