This commit is contained in:
YUN-PC5\user 2023-10-19 16:51:06 +08:00
parent e3385e1464
commit 933a41b09f
2 changed files with 245 additions and 69 deletions

View File

@ -1426,6 +1426,43 @@ NLog 配置文件是一个以`nlog`为根节点的 XML 文件。`nlog`节点可
</targets>
```
###### 参数
**存档选项**
- **archiveFileName** - 要用于存档的文件的名称。布局
它可能包含一个特殊的占位符{#},该占位符将被一系列数字替换,具体取决于存档策略。使用的哈希字符的数量决定了用于文件编号的数字位数。
> 警告在NLog 4.5之前,如果在未指定特殊占位符{#}的情况下配置了`maxArchiveFiles`则会导致非常激进的清理。NLog 4.4将从存档文件夹中删除任何文件(不仅仅是日志文件)因此请确保指定一个隔离文件夹。在NLog 4.5(和更高版本)中,清除通配符不是那么危险,并且允许相同的文件夹存档,这一点已经得到修复。
- **archiveNumbering** - 文件存档的编号方式。另请参阅归档编号示例
可能的值:
- Rolling - 滚动样式编号(最近的始终是#0,然后是#1、...、#N)
- Sequence - 序列样式编号。最新的档案编号最高。
- Date - 日期样式编号。日期的格式根据`archiveDateFormat`
> 警告在NLog版本之前。4.5.7这样的话,这将不能与`aiveAboveSize`一起工作。较新版本将正确合并到存档中的现有文件中。
- DateAndSequence - 日期和顺序的组合。档案将标记上一时期(年、月、日)的日期时间。最新的档案编号最高(与日期相结合)。日期的格式是根据`archiveDateFormat`的值设置的。
- **archiveEvery** - 指示是否在每次经过指定时间时自动存档日志文件。
可能的值:
- Day - 每天存档。
- **archiveAboveSize** - 日志文件将自动存档的大小(以字节为单位)。Long
> 在NLog版本之前。4.5.7那么这将不能与`filveNumbering=Date`一起使用。较新版本将正确合并到存档中的现有文件中。
- **maxArchiveFiles** - 应保留的最大存档文件数。如果MaxArchiveFiles小于或等于0则不会删除旧文件Integer 默认为0
**性能调整选项**
- **keepFileOpen** - 指示是否在每个日志记录事件时保持打开日志文件,而不是打开和关闭它。当设置为`false`它将允许其他应用程序“接管”文件句柄并且NLog将无法记录到文件。当设置为`false`时,它将对性能造成重大影响,因为打开/关闭文件句柄的成本很高。Boolean 默认值True(在NLog 5.0之前,默认值为`false`)
##### rules
`rules`节点是日志路由规则的集合,由一个或多个`logger`元素组成。每个`logger`元素记录了logger的名字、目标输出以及要处理的日志等级。NLog 从路由规则表的第一个`logger`开始处理,如果当前`logger`有效,则日志信息将被输出到指定的`target`。如果某个`logger`被标记为`final`,那么其后的`logger`都会被忽略。
@ -1672,6 +1709,135 @@ NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers
# 远程过程调用应用
## 使用 gRPC 服务
### proto 文件
gRPC 使用协定优先方法进行 API 开发。默认情况下,协议缓冲区 (protobuf) 用作接口定义语言 (IDL)。`.proto`文件包含:
- gRPC 服务的定义。
- 在客户端与服务器之间发送的消息。
创建 greet.proto 文件:
- 定义`Greeter`服务。
- `Greeter`服务定义`SayHello`调用。
- `SayHello`发送`HelloRequest`消息并接受`HelloReply`消息:
```protobuf
syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;
// greeting 服务定义。
service Greeter {
// 发送一个 greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// 包含用户名的请求消息。
message HelloRequest {
string name = 1;
}
// 包含Greetings的响应消息。
message HelloReply {
string message = 1;
}
```
### 将`.proto`文件添加到 C# 应用
通过将`.proto`文件添加到`<Protobuf>`项组中,可将该文件包含在项目中:
```xml
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
```
默认情况下,`<Protobuf>`引用将生成具体的客户端和服务基类。可使用引用元素的`GrpcServices`特性来限制 C# 资产生成。有效`GrpcServices`选项如下:
- `Both`(如果不存在,则为默认值)
- `Server`
- `Client`
- `None`
### 对`.proto`文件的 C# 工具支持
需要工具包`Grpc.Tools`才能从`.proto`文件生成 C# 资产。生成的资产(文件):
- 在每次生成项目时按需生成。
- 不会添加到项目中或是嵌入到源代码管理中。
- 是包含在 obj 目录中的生成工件。
服务器和客户端项目都需要此包。`Grpc.AspNetCore`元包中包含对`Grpc.Tools`的引用。服务器项目可以使用 Visual Studio 中的包管理器或通过将`<PackageReference>`添加到项目文件来添加`Grpc.AspNetCore`
```xml
<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
```
客户端项目应直接引用`Grpc.Tools`以及使用 gRPC 客户端所需的其他包。运行时不需要工具包,因此依赖性标记为`PrivateAssets="All"`:
```xml
<PackageReference Include="Google.Protobuf" Version="3.18.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
<PackageReference Include="Grpc.Tools" Version="2.40.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
```
### 生成的 C# 资产
工具包会生成表示在所包含`.proto`文件中定义的消息的 C# 类型。
对于服务器端资产,会生成抽象服务基类型。基类型包含`.proto`文件中所含的所有 gRPC 调用的定义。创建一个派生自此基类型并为 gRPC 调用实现逻辑的具体服务实现。对于`greet.proto`(前面所述的示例),会生成一个包含虚拟`SayHello`方法的抽象`GreeterBase`类型。具体实现`GreeterService`会替代该方法,并实现处理 gRPC 调用的逻辑。
```c#
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
```
对于客户端资产,会生成一个具体客户端类型。`.proto`文件中的 gRPC 调用会转换为具体类型中的方法,可以进行调用。对于`greet.proto`(前面所述的示例) ,会生成一个`GreetClient`类型。调用`GreeterClient.SayHelloAsync`以发起对服务器的gRPC调用。
```c#
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
```
默认情况下,会为`<Protobuf>`项组中包含的每个`.proto`文件都生成服务器和客户端资产。若要确保服务器项目中仅生成服务器资产,请将`GrpcServices`属性设置为`Server`
```xml
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
```
同样,该属性在客户端项目中设置为`Client`
## 调用 gRPC 服务
### 客户端工厂集成

View File

@ -4,7 +4,7 @@ date: 2021-03-23 10:30:31
author: 文永达
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
---
# Docker
# Docker 简介
---
@ -21,7 +21,7 @@ CentOS占CPU Docker CPU引擎占用低
多个应用放到一起 每个应用服务都是一个容器,相互隔离
一个独立的操作系统 必须依赖于操作系统推荐使用Linux
## docker安装
# Docker 安装
```shell
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
@ -46,19 +46,21 @@ yum install docker-ce-18.03.1.ce
Docker配置阿里云镜像加速
https://www.cnblogs.com/LUA123/p/11401962.html
## 查看docker 信息
# Docker 使用
## 查看 Docker 信息
```shell
docker info
```
## 查看docker 镜像 image
## 查看 Docker 镜像 image
```shell
docker images
```
## docker 安装镜像 image
## Docker 安装镜像 image
MySQL 5.7
@ -66,7 +68,7 @@ MySQL 5.7
docker pull mysql:5.7
```
## docker 移除镜像 image
## Docker 移除镜像 image
若已有镜像用于容器,请先将容器删除
@ -121,7 +123,7 @@ docker重启容器
docker restart <container id>
```
## docker容器与宿主机时间不同步
## Docker 容器与宿主机时间不同步
对于已创建的容器:
@ -135,9 +137,70 @@ docker cp /usr/share/zoneinfo/Asia/Shanghai <containername>:/etc/localtime
docker run -d -p 8080:80 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone <containername>
```
## docker启动MariaDB
## 修改运行中的 Docker 容器的端口映射和挂载目录
拉去mariadb镜像
方法一:删除原有容器,重建新容器
参考以上移除容器,启动容器
方法二修改配置文件重启docker服务
容器配置文件路径:
/var/lib/docker/containers/[[hash_of_the_container]/hostconfig.json]
其中的hashofthecontainer是docker镜像的hash值可以通过docker ps或者docker inspect containername查看。CONTAINER ID就可以看出来
可以到/var/lib/docker/containers目录下ls -l
```json
{"Binds":["/usr/docker/redis/redis-slave2.conf:/usr/local/etc/redis/redis.conf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"6379/tcp":[{"HostIp":"","HostPort":"6381"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}
```
重启docker服务再启动容器服务就可以了。
```shell
systemctl restart docker
docker ps -a
docker start <container id>
```
## Docker 的镜像迁移到另一台服务器
```shell
# 找到想要移动的docker容器ID
dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ac9237b040 redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-slave1
454bb484f90a redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis-master
ps -a
# 提交变更并且把容器保存成镜像命名为redis-master
docker commit 454bb484f90a redis-master
# 把redis-master镜像保存成tar文件
docker save redis-master > /root/mysoftware/docker-file/redis/redis-master.tar
# 拷贝到新的机器执行load命令
docker load < ./redis-master.tar
```
## Docker中 `<none>`镜像的来历及快速删除操作
```shell
docker rmi -f $(docker images | grep "none" | awk '{print $3}')
```
来历在docker反复build一个Dockerfile并且使用相同tag或者不用tag)会存留很多none镜像。第一次build生成一个image id, 再次build后会重新生成一个image id, 命名和上一个一样所以上一个镜像的tag和名字就会自动变成 `<none>`
## Docker Dockerfile
### 什么是Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像
# Docker 实例
## Docker 启动 MariaDB
拉取mariadb镜像
```shell
docker pull mariadb:10.2
@ -148,7 +211,7 @@ docker images
docker run --name mariadb10.2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mariadb:10.2
```
## dockerRedis主从复制集群搭建
## Docker Redis主从复制集群搭建
拉取redis4.0.11镜像
@ -220,54 +283,9 @@ info Replication
auth <slave-password>
```
## dockerRedis哨兵高可用集群搭建
## Docker Redis哨兵高可用集群搭建
## docker的镜像迁移到另一台服务器
```shell
# 找到想要移动的docker容器ID
dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ac9237b040 redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-slave1
454bb484f90a redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis-master
ps -a
# 提交变更并且把容器保存成镜像命名为redis-master
docker commit 454bb484f90a redis-master
# 把redis-master镜像保存成tar文件
docker save redis-master > /root/mysoftware/docker-file/redis/redis-master.tar
# 拷贝到新的机器执行load命令
docker load < ./redis-master.tar
```
## 修改运行中的docker容器的端口映射和挂载目录
方法一:删除原有容器,重建新容器
参考以上移除容器,启动容器
方法二修改配置文件重启docker服务
容器配置文件路径:
/var/lib/docker/containers/[[hash_of_the_container]/hostconfig.json]
其中的hashofthecontainer是docker镜像的hash值可以通过docker ps或者docker inspect containername查看。CONTAINER ID就可以看出来
可以到/var/lib/docker/containers目录下ls -l
```json
{"Binds":["/usr/docker/redis/redis-slave2.conf:/usr/local/etc/redis/redis.conf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"6379/tcp":[{"HostIp":"","HostPort":"6381"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}
```
重启docker服务再启动容器服务就可以了。
```shell
systemctl restart docker
docker ps -a
docker start <container id>
```
## docker安装code-server
## Docker 安装 code-server
```shell
# 拉取镜像
@ -286,7 +304,7 @@ cert: false
docker run -d -u root -p 8088:8080 --name code-server -v /usr/docker/codeserver/config.yaml:/root/.config/code-server/config.yaml -v /usr/docker/codeserver:/home/code codercom/code-server
```
## docker安装Jenkins
## Docker 安装 Jenkins
搜索Jenkins镜像
@ -326,7 +344,7 @@ docker logs jenkins
![image-20221121131635658](https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221121131635658.png)可以找到初始密码
## docker安装Nginx
## Docker 安装 Nginx
```shell
docker pull nginx
@ -340,7 +358,7 @@ docker run -d -p 80:80 -p 443:443 --name nginxweb --privileged=true
ps aux | grep "nginx: worker process" | awk '{print $1}'
```
## docker安装SQL Server
## Docker 安装 SQL Server
```shell
mkdir /etc/sqlserver_data
@ -349,15 +367,7 @@ docker pull mcr.microsoft.com/mssql/server
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Wyd210213" -p 1433:1433 --memory 2000M --name sqlserver2022 -v /etc/sqlserver_data:/var/opt/mssql -d mcr.microsoft.com/mssql/server
```
## Docker中 `<none>`镜像的来历及快速删除操作
```shell
docker rmi -f $(docker images | grep "none" | awk '{print $3}')
```
来历在docker反复build一个Dockerfile并且使用相同tag或者不用tag)会存留很多none镜像。第一次build生成一个image id, 再次build后会重新生成一个image id, 命名和上一个一样所以上一个镜像的tag和名字就会自动变成 `<none>`
## docker安装PostgreSQL
## Docker安装PostgreSQL
```shell
docker pull postgres:latest