支撑性服务 & 自动化 - _小码甲 - 博客园

mikel阅读(29)

来源: 支撑性服务 & 自动化 – _小码甲 – 博客园

连载传送门:

  • 什么是云原生?
  • 云原生设计理念
  • .NET 微服务
  • 谈到云原生,绕不开“容器化”

Backing services#

云原生系统依赖于许多不同的辅助资源,例如数据存储、消息队列、监视和身份服务。这些服务统称为支撑性服务。

下图显示了云原生系统使用的许多常见支撑性服务

支撑性服务帮助实现了“十二要素应用”中的Statelessness原则

要素6提到:“每个微服务应在独立隔离的进程中执行,将所需状态信息作为外部支撑性服务,例如分布式缓存或数据存储”

最佳实践是将支撑性服务视为附加资源,并使用外部挂载的方式将配置(URL和凭据)动态绑定到微服务。

要素4指出: “支撑性服务“应通过可寻址的URL公开,这样做解耦了将资源与应用”
要素3指出: “将配置信息从微服务中移出并外挂”

Stateless和支撑性服务,这样松散的设计使你可以将一项支撑性服务换成另一项支撑性服务,或将您的代码移至其他公有云,而无需更改主线服务代码。

支撑性服务将在第5章“云原生数据模式”和第4章“云原生通信模式”中详细讨论。


自动化#

如你所见,云原生依赖(微服务、容器和现代设计理念)来实现速度和敏捷性。
但是,那只是故事的一部分,你如何配置运行这些系统的云环境?你如何快速部署应用程序功能和更新?

被广泛认可的作法是基础设施即代码(IaC)

借助IaC,你可以自动化平台配置和应用程序部署,你将诸如测试和版本控制之类的软件工程实践应用于您的DevOps实践。你的基础架构和部署是自动化,一致且可重复的。

Automating infrastructure#

在底层,IaC是幂等的,这意味着你可以一遍又一遍地运行相同的脚本,而不会产生副作用。
如果团队需要进行更改,可以编辑并重新运行脚本,(仅)需要更新的资源受到影响。

在《基础架构即代码》一书中,作者Sam Guckenheimer指出:“实施IaC的团队可以大规模、快速、稳定地交付。团队不用手动配置环境,通过代码表示的所需环境状态,来增强交付预期。使用IaC进行基础架构部署是可重复的,可防止由于配置差异或缺少依赖关系而导致运行时问题”。

Automating deployments#

“十二要素应用”指出了从代码开发到交付落地的原则

要素5指出:“严格区分构建、发行和运行阶段。每个发行阶段都应标有唯一的ID,并支持回滚功能。”

现代CI/CD实现了这一原则。它们提供的独立部署步骤,确保将一致的、高质量的代码交付给用户。

下图演示了独立的部署过程:

在上图中,要特别注意任务分离。

开发人员在其开发环境中创建feature分支,反复迭代“inner loop”(运行和调试)。
完成后,该代码将被推送到代码存储库中,例如GitHub,Azure DevOps或BitBucket。

推送触发自动构建,构建阶段将代码转换为二进制产物。这项工作是通过持续集成(CI)管道实现的,它会自动生成,测试和打包应用程序。

发布阶段拾取前面的二进制产物,加上外部应用程序和环境配置信息,产生不可变更的发行版。该版本将会部署到指定的环境。这项工作是通过持续交付(CD)管道实现的。每个版本都应该是可识别、可追溯的。你可以说:“这次部署的是应用程序的Release 2.1.1版本”。

最后,发布的版本放在目标执行环境中运行。版本不可变,这意味着任何更改都必须创建一个新版本。

应用这些实践,从根本上发展了软件发布方式。许多人已经从季度发布转为按需更新。通过集成过程的一致性,团队可以更频繁地提交代码更改,从而改善协作和软件质量。

误用.Net Redis客户端CSRedisCore,自己挖坑自己填 - _小码甲 - 博客园

mikel阅读(28)

来源: 误用.Net Redis客户端CSRedisCore,自己挖坑自己填 – _小码甲 – 博客园

前导  #

上次Redis MQ分布式改造完成之后, 编排的容器稳定运行了一个多月,昨天突然收到ETL端同事通知,没有采集到解析日志了。

赶紧进服务器看了一下,用于数据接收的receiver容器挂掉了, 尝试docker container start [containerid],  几分钟后该容器再次崩溃。

 

Redis连接超限#

docker log [containerid]  查看容器日志; 重点:CSRedis.RedisException: ERR max number of clients reached

docker logs [containerid]

日志上显示连接Redis服务器的客户端数量超限,头脑快速思考,目前编排的某容器使用CSRedisCore 对于16个Redis DB实例化了16个客户端,但Redis服务器也不至于这么不经折腾吧。

赶紧进redis.io官网搜集相关资料

After the client is initialized, Redis checks if we are already at the limit of the number of clients that it is possible to handle simultaneously (this is configured using the maxclients configuration directive, see the next section of this document for further information).

In case it can’t accept the current client because the maximum number of clients was already accepted, Redis tries to send an error to the client in order to make it aware of this condition, and closes the connection immediately. The error message will be able to reach the client even if the connection is closed immediately by Redis because the new socket output buffer is usually big enough to contain the error, so the kernel will handle the transmission of the error.

大致意思是:Redis服务器maxclients配置了最大客户端连接数, 如果当前连接的客户端超限,Redis会回发一个错误消息给客户端,并迅速关闭客户端连接。

立刻登录Redis服务器查看默认配置,确认当前Redis服务器maxclients=10000(这是一个动态值,由maxclients和最大进程文件句柄决定),

# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able to configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error ‘max number of clients reached’.
# maxclients 10000

 左图表明:通过Redis-Cli 登录进服务器立即就被踢下线。

基本可认定redis客户端使用方式有问题。

 

CSRedisCore使用方式#

继续查看相关资料,可在redis服务器上利用redis-cli命令:info clients、client list仔细分析客户端连接。

info clients 命令显示现场确实有10000的连接数;

client list命令显示连接如下:

官方对client list命令输出字段的解释:

  • addr: The client address, that is, the client IP and the remote port number it used to connect with the Redis server.
  • fd: The client socket file descriptor number.
  • name: The client name as set by CLIENT SETNAME.
  • age: The number of seconds the connection existed for.
  • idle: The number of seconds the connection is idle.
  • flags: The kind of client (N means normal client, check the full list of flags).
  • omem: The amount of memory used by the client for the output buffer.
  • cmd: The last executed command.

根据以上解释,表明 Redis服务器收到很多ip=172.16.1.3(故障容器在网桥内的Ip 地址)的客户端连接,这些连接最后发出的是ping命令(这是一个测试命令)

故障容器使用的Redis客户端是CSRedisCore,该客户端只是单纯将 Msg 写入Redis list 数据结构,CSRedisCore上相关github issue给了我一些启发。

发现自己将CSRedisClient实例化代码写在 .netcore api Controller构造函数,这样每次请求构造Controller时都实例化一次Redis客户端,最终Redis客户端连接数达到最大允许连接值。

依赖注入三种模式: 单例(系统内单一实例,一次性注入);瞬态(每次请求产生实例并注入);自定义范围。

有关dotnet apicontroller 以瞬态模式 注入,请查阅链接

还有一个疑问? 为什么Redis服务器没有释放空闲的 客户端连接,如果空闲连接被释放了,即使我写了low代码也不至于如此吧?

查询官方:

By default recent versions of Redis don’t close the connection with the client if the client is idle for many seconds: the connection will remain open forever.

However if you don’t like this behavior, you can configure a timeout, so that if the client is idle for more than the specified number of seconds, the client connection will be closed.

You can configure this limit via redis.conf or simply using CONFIG SET timeout <value>.

大致意思是最近的Redis服务端版本 默认不会释放空闲的客户端连接:

# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0

可通过修改Redis配置释放 空闲客户端连接。

我们最佳实践当然不是修改Redis idle timeout 配置,问题核心还是因为我实例化了多客户端,赶紧将CSRedisCore实例化代码移到startup.cs并注册为单例。

 

大胆求证#

info clients命令显示稳定在53个Redis连接。

client list命令显示:172.16.1.3(故障容器)建立了50个客户端连接,编排的另一个容器webapp建立了2个连接,redis-cli命令登录到服务器建立了1个连接。

client list命令显示连接

那么问题来了,修改之后,receiver容器为什么还稳定建立了50个redis连接?

进一步与CSRedisCore原作者沟通,确定CSRedisCore有预热机制,默认在连接池中预热了50个连接。

bingo,故障和困惑全部排查清楚。

 

总结#

经此一役,在使用CSRedisCore客户端时, 要深入理解

① Stackexchange.Redis 使用的多路复用连接机制(使用时很容易想到注册到单例),CSRedisCore开源库采用连接池机制,在高并发场景下强烈建议注册为单例, 否则在生产使用中可能会误用在瞬态请求中实例化,导致redis客户端几天之后被占满。

② CSRedisCore会默认建立连接池,预热50个连接, 开发者心里要有数。

额外的方法论: 尽量不要从某度找答案,要学会问问题,并尝试从官方、stackoverflow 、github社区寻求解答,你挖过的坑也许别人早就挖过并踏平过。

 

——————————update  多说两句———————————————

很多博友说问题在于我没有细看CSRedisCore官方readme(readme推荐使用单例),使用方式上我确实没有做成单例:

③ 一般连接池都会有空闲释放回收机制 (CSRedisCore也是连接池机制),所以当时并没有把 单例放在心上

④ 本次重要知识点:Redis默认并不会释放空闲客户端连接(但是又设置了最大连接数),这也直接促成了本次容器崩溃事故。

嗯,坑是自己挖的。

Redis 模糊查询删除操作 - 01234567 - 博客园

mikel阅读(26)

来源: Redis 模糊查询删除操作 – 01234567 – 博客园

创建一条测试 数据 查询 (默认是 DB 0 )

创建:
set name xiaoming
查询:
get name

1、模糊搜索查询 (redis 默认有16个DB , 0-15 )

复制代码
Redis 模糊搜索
1、keys *   匹配数据库中所有 key 
2、keys h?llo   匹配 hello , hallo 和 hxllo 等。
3、keys h*llo   匹配 hllo 和 heeello 等。
4、keys h[ae]llo   匹配 hallo 和 hello ,但不匹配 hillo;特殊符号用 \ 隔开。
redis> keys *o*
1) "four"
2) "two"
3) "one"
redis> keys t??
1) "two"
redis> keys t[w]*
1) "two"
redis> keys *    # 匹配数据库内所有 key
1) "four"
2) "three"
3) "two"
4) "one"
redis-cli  进入默认是第一个DB 0 ; select 切换 DB 
> select 2;
复制代码

2、删除指定key :

复制代码
# 删除所有以 user 开头的key 可以这样实现:
# redis-cli keys "user*"
1) "user1"
2) "user2"

# redis-cli keys "user*" | xargs redis-cli del
(integer) 2
# 删除成功

# 删除当前数据库中的所有Key 
> flushdb 

# 删除所有数据库中的key 
> flushall
# 删除单个 key
redis> SET name zhangsan
OK
redis> DEL name
(integer) 1

# 删除一个不存在的 key
redis> EXISTS lisi
(integer) 0

redis> DEL phone   # 失败,没有 key 被删除
(integer) 0

# 同时删除多个 key
redis> SET name "redis"
OK
redis> SET type "key-value store"
OK
redis> SET website "redis.com"
OK
redis> DEL name type website
(integer) 3
复制代码
# 批量删除匹配通配符的key用到了Linux中的管道和xargs参数:
redis-cli keys "s*" | xargs redis-cli del
复制代码
# 如果需要制定数据库,需要用到 -n 数据库编号 参数,下面是删除 2数据库中 s开头的键:

redis-cli -n 2 keys "s*" | xargs redis-cli -n 2 del

redis-cli keys "*" | xargs redis-cli del 

# 如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径 
如:
/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del
复制代码

3、Redis Sortedset 数据查询

复制代码
redis sortedset 数据查询:

172.16.12.36:6003> zrank qa:hall 103228953392713728
(integer) 10021

172.16.12.36:6003> ZCARD qa:hall
(integer) 10022
复制代码

TTL key : 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。

返回值:
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

查询检测 ttl 值:

复制代码
# 不存在的 key
redis> FLUSHDB
OK
redis> TTL key
(integer) -2

# key 存在,但没有设置剩余生存时间
redis> SET key value
OK
redis> TTL key
(integer) -1

# 有剩余生存时间的 key
redis> EXPIRE key 10086
(integer) 1

redis> TTL key
(integer) 10010
复制代码

5、redis type key

TYPE key : 返回 key 所储存的值的类型。

复制代码
返回值:
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
复制代码

示例:

复制代码
# 字符串
redis> SET weather "sunny"
OK
redis> TYPE weather
string

# 列表
redis> LPUSH book_list "programming in scala"
(integer) 1
redis> TYPE book_list
list

# 集合
redis> SADD pat "dog"
(integer) 1
redis> TYPE pat
set
复制代码

 

VS使用Nuget教程详解 Visual studio 安装第三方的组件库 - dathlin - 博客园

mikel阅读(28)

来源: VS使用Nuget教程详解 Visual studio 安装第三方的组件库 – dathlin – 博客园

首先说明Nuget是什么呢?它的官方是:https://www.nuget.org/

官方主页的介绍如下:

What is NuGet?

NuGet is the package manager for .NET. The NuGet client tools provide the ability to produce and consume packages. The NuGet Gallery is the central package repository used by all package authors and consumers.

 


啥意思呢?Nuget是一个.NET的各种组件包管理器,方便.NET程序进行包的管理的。

举例说明:如果你想要引用一个组件,比如非常流行的JSON序列化反序列化组件,Newtonsoft.Json.dll,你可能会去官网下载dll组件,然后放置到自己的一个文件夹里,然后在新建项目的时候进行添加引用,在没有知道Nuget的时候我也是这么干的,还觉得很方便。

后来就自然而然的接触到了Nuget,用了几次后发现真好用,就拿上面的例子来说,只要在项目中安装Newtonsoft.Json包,就自动下载到项目了,如果这个dll还依赖其他的dll,那么也都会一并的下载,这个功能实在太强大,然后当这个dll拥有者更新之后,你的VS会收到消息,提醒你有新的版本了,当然你可以选择更新还是不更新。

 


安装举例,新建一个项目,安装一个Nuget上的组件,名称为HslCommunication:

然后按下Enter键

连带这个组件的依赖项JSON组件也一并安装完毕。

如果要卸载,运行UnInstall-Package HslCommunication命令即可,然后我们来说说图形化安装界面:

打开 工具 -> Nuget包管理器 -> 管理解决方案的Nuget包 效果如下:

这里安装完和上个控制台安装完效果是一致的,不再赘述。然后怎么更新呢?

 


怎么样,是不是非常的方便。我这里的废话比较多,如果操作习惯了,没有几步就成功了。

System.Runtime.InteropServices.RuntimeInformation.dll 问题 mongoDB C# 驱动 问题_m0_37867491的博客-CSDN博客

mikel阅读(55)

来源: System.Runtime.InteropServices.RuntimeInformation.dll 问题 mongoDB C# 驱动 问题_m0_37867491的博客-CSDN博客

基于上一篇博客的mongoDB 和mongoDB C# 驱动 教程之后,小白将这个问题单独列出来,可见小白对这个问题已经达到了深恶痛绝的程度。。。。

总结: 在基于mongoDB 3.x 与 mongoDB C#  CSharpDriver 2.x 的配合使用中遇到问题总结。

(1) 版本问题: 找到相匹配的版本很重要,有好多版本两者是不支持的。小白建议:一定要查看官网,不可轻信网上博客主。

版本匹配地址:https://docs.mongodb.com/ecosystem/drivers/csharp/点击打开链接

重要的事情说三遍。。。。    重要的事情说三遍。。。。    重要的事情说三遍。。。。

(2)提示缺少 xx.dll 。 在基于vs2012 开发过程中,小白就遇到问题,网上建议去更新NuGet 包,如果还是不行,小白建议去网上下载相应的dll。

eg个栗子:缺少 System.Runtime.InteropServices.RuntimeInformation.dll version = 4.0.0 这个错。网上的回答很少,小白就是下载了System.Runtime.InteropServices.RuntimeInformation.dll 而解决的。

受前辈指点,可能是缺少 VC++ 20XX 的库,特此补充。

下载地址:

链接:https://pan.baidu.com/s/1jh9JKVKBzkXD_E7EAHUdMQ 密码:wxg6

如果提示版本不对,那就去网上下载。

(3).net 框架不对。这个也参考官网 https://docs.mongodb.com/ecosystem/drivers/csharp/点击打开链接

(4)我遇到的问题是因为其他库需要RuntimeInform的版本冲突,于是在NuGet包管理器中更新了需要升级的包编译后就不出问题了

SQL Server 2008R2 数据库出现“可疑”导致无法访问解决办法 - 技术_菜鸟 - 博客园

mikel阅读(38)

来源: SQL Server 2008R2 数据库出现“可疑”导致无法访问解决办法 – 技术_菜鸟 – 博客园

今天在客户服务器的数据库里面的一个数据库突然出现了点问题,数据库状态变为可疑了,这个问题之前有见过,虽然解决了,但并没有把过程和解决方法记录下来,决定这次记录在博客园里,方便自己也方便他人在遇到这个问题的时候,能快速解决!废话不多说,先说说数据库变可疑的原因:

在进行些不正常操作如数据库在读写时而无故停止数据库,从而导致SQL Server 数据库不正常中断,当再次打开数据库时会发现某些数据库会被标记为“可疑”(suspect),即在数据库名旁加上了黄色的惊叹号,这时数据库就不能再被打开了,但数据库的结构及数据内容都还是存在的。

解决方法:

当数据库发生这种操作故障时,可以按如下操作步骤可解决此方法,打开数据库里的SQL 查询编辑器窗口,运行以下的命令(注意:jd13dafa为对应可疑的数据库名称,执行时,请改为你的可疑的数据库名称)。

1、修改数据库为紧急模式

ALTER DATABASE jd13dafa SET EMERGENCY

2、使数据库变为单用户模式

ALTER DATABASE jd13dafa SET SINGLE_USER

3、修复数据库日志重新生成,此命令检查的分配,结构,逻辑完整性和所有数据库中的对象错误。当您指定“REPAIR_ALLOW_DATA_LOSS”作为DBCC CHECKDB命令参数,该程序将检查和修复报告的错误。但是,这些修复可能会导致一些数据丢失。

DBCC CheckDB (jd13dafa , REPAIR_ALLOW_DATA_LOSS)

4、使数据库变回为多用户模式

ALTER DATABASE jd13dafa SET MULTI_USER

5、开始->运行->输入cmd->打开DOS命令窗口,输入以下命令重启数据库服务(此处可以直接到服务列表里,重新启动数据库服务,为了方便我直接用DOS命令了)

Net stop msSQLServer –停止服务

Net start msSQLServer –启动服务

重新打开SQL Server,查看被标记为“可疑”的数据库已恢复正常状态。

(注意执行命令过程中可能会报一些错误,请无视,按照步骤执行完毕就行了,有问题,大家多少交流836911886,加我请记得说:博客园)

 

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统 - 大鸟博客

mikel阅读(81)

来源: 宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统 – 大鸟博客

Solo 是一款小而美的博客系统,专为程序员设计。Solo 有着非常活跃的社区,文章自动推送到社区后可以让很多人看到,产生丰富的交流互动。

虽然大鸟不是程序员,但是还是很喜欢这个博客的,不过因为是Java开发,所以安装环境折腾起来有点门槛。

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

老规矩还是用宝塔面板来折腾,不过还是用Docker来部署,这也是官方推荐的安装方式。官方不建议通过 war 发布包或者源码构建部署,因为这样的部署方式在将来有新版本发布时升级会比较麻烦。 这两种方式请仅用于本地试用,线上生产环境建议通过 Docker 部署。大鸟还写过Solo博客的文章:

这篇文章就来分享宝塔面板下Docker安装Solo博客系统,这款小而美的博客程序。

一:solo简介

 

  1. 官网:https://solo.b3log.org/
  2. github:https://github.com/b3log/solo
  3. 下载地址:https://github.com/b3log/solo/releases

 

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

看起来功能上还是很简单的,不过够用就好。

二:安装docker + docker-compose

2.1docker安装

宝塔面板安装就不用多说了,我们开始安装docker,软件商店安装即可:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

大鸟这里已经安装好了,没安装的自己安装。

2.2docker-compose

宝塔面板没有自带docker-compose,所以需要自己命令环境下安装,Docker-Compose是一个部署多个容器的简单但是非常必要的工具,安装Docker-Compose之前,请先安装 python-pip  不过对于宝塔面板来说python-pip早已安装好了,所以宝塔面板安装Docker-Compose只需要一个命令就足够了,安装命令:

  1. pip install dockercompose

看看安装界面,以及安装完成的截图,这些需要SSH连接服务器进行操作:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

2.3检查web环境

安装了docker + docker-compose,我们还需要检查下,因为这是我们docker安装solo博客很关键的地方,检查命令:

  1. docker v
  2. dockercompose v

丢一张截图:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

三:下载solo-in-docker以及编辑

3.1下载solo-in-docker

项目地址:https://github.com/liumapp/solo-in-docker

可以用命令方式下载,或者用宝塔面板自带的远程下载来搞定,把下载的文件放在root目录下,大鸟这类用git下载,命令如下:

  1. git clone https://github.com/liumapp/solo-in-docker.git

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

3.2编辑docker-compose.yml文件

下载好之后,我们需要编辑/root/solo-in-docker下的docker-compose.yml文件,完整编辑好文件如下:

  1. version: “2”
  2.  
  3. services:
  4. mySQL:
  5. container_name: mySQL
  6. image: mySQL:5.5.60
  7. restart: always
  8. volumes:
  9. ./mysql/data:/var/lib/mysql //mysql的数据文件存放地址
  10. ./mysql/conf/mysqld.conf:/etc/mysql/mysql.conf.d/mysqld.cnf //mysql的配置文件存放地址
  11. ports:
  12. “6603:3306” //6603代表宿主机端口,3306代编容器的端口
  13. environment:
  14. MYSQL_ROOT_PASSWORD=adminadmin //mysql的root账号密码
  15. solo:
  16. container_name: solo
  17. image: b3log/solo //直接使用最新版本的solo镜像
  18. restart: always
  19. ports:
  20. “8080:8080” //如果要部署到线上的话,请改为”80:80″,同时修改下面的–listen_port=80
  21. environment: //此处配置solo跟mysql的连接设置,来源为上面启动的mysql容器,如果要用自己的mysql服务,那么请将mysql的servcie去掉
  22. RUNTIME_DB: “MYSQL”
  23. JDBC_USERNAME: “root”
  24. JDBC_PASSWORD: “adminadmin”
  25. JDBC_DRIVER: “com.mysql.jdbc.Driver”
  26. JDBC_URL: “jdbc:mysql://mysql:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC” //此处,因为solo跟mysql同为docker容器,所以可以直接使用容器名 + 容器端口来访问
  27. command: listen_port=8080 server_scheme=http server_host=www.daniao.org //按照solo官方要求,在solo启动之初,配置solo的域名、端口,如果是本地测试的话,将host改为localhost即可

四:开始部署和问题解决

配置好了,docker-compose.yml文件我就可以部署了,不过还是需要把solo-in-docker这个文件名修改成solo比较好,这样简单点,修改好之后,开始部署,命令如下:

  1. cd solo
  2. dockercompose up d

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

开始用docker-compose自动部署镜像的时候,大鸟这里发现了错误,如下:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

错误提示:80端口已经被占用,对于宝塔面板来说这应该nginx默认监听80端口所指,问题还是好解决的,路径:/www/server/panel/vhost/nginx,找到0.default.confphpfpm_status.conf这两个文件修改其中的80端口即可,如图:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

当然了,如果你默认用什么8383这样的端口,也无需去修改这里的文件了。这样修改好之后,我重新运行:docker-compose up -d,即可成功启动solo了。

五:solo博客展示与使用

我们在docker上成功部署了solo,这样就可以通过域名打开网址了,额,域名别忘了解析哈,如图:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

管理的用户名和密码就是github的账号和密码,初始我们需要登录github,之后就可以管理后台了,如图:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

功能上来说非常简单,不过内置了19个皮肤,我们可以更换一个自己喜欢的。我们来试试发表文章:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

功能上是很简单的,也很清爽,至于其他的功能喜欢折腾的自己去试试!

五:升级solo与一些细节

如果有更新,我还是需要在solo目录下运行:docker-compose up -d,常用的命令如下:

启动命令

  1. dockercompose up d

停止命令,可以停止网站运行。

  1. dockercompose down

查看solo日志的命令

  1. docker logs t f tail 100 solo

我们丢一张图看看:

宝塔面板Docker安装Solo博客 – 一款小而美的JAVA博客系统

六:总结

 

  1. docker-compose 只是一个 docker 容器的编排工具,本质还是 docker 容器在运行
  2. 每一次命令 docker-compose 启动的时候,都会自动拉取最新 solo 的镜像,所以自动更新非常简单
  3. 数据备份问题,docker 容器死亡的时候,容器内数据会自动清除,除非我们使用 volumes 构建映射关系,这里我只将最重要的 mysql 数据库文件映射在 mysql/data 目录下

 

用宝塔面板来构建solo博客还是比较简单的,只是因为这个博客是在太小众,网上的资料基本看不懂,大鸟真的是折腾了好久,等真正吃到嘴的时候,发现味道也就如此,比如上街看到一个美女,穿着清凉性感的短装,你看见她的时候荷尔蒙飙升,非常想“马赛克”……

其实就像烤红薯,闻着香,吃到嘴里也就那样……

哈哈哈哈哈,我邪恶了……

貌似没有说怎么安装SSL证书,下次说吧,文章已经太长了,不一定有人能看完。

Premiere如何去除视频背景颜色-百度经验

mikel阅读(188)

来源: Premiere如何去除视频背景颜色-百度经验

  1. 打开Premiere软件,新建一个项目,点击【文件】——【新建】——【序列】命令,创建序列,

    Premiere如何去除视频背景颜色?
  2. 按快捷键【Ctrl+I】,弹出一个导入窗口,选择一个视频素材

    Premiere如何去除视频背景颜色?
  3. 将视频导入PR软件,选中视频,将其拖动至视频轨道,

    Premiere如何去除视频背景颜色?
  4. 展开【窗口】菜单栏,找到【效果】并勾选,让其显示在窗口,

    Premiere如何去除视频背景颜色?
  5. 在效果窗口中输入【超级键】,进行搜索,选中超级键效果,将其拖动到视频文件中,

    Premiere如何去除视频背景颜色?
  6. 选中视频,打开【效果控件】窗口,找到【超级键】——【主要颜色】,用吸管工具吸取视频背景颜色,PR会根据色彩容去除与背景相近的颜色。

    Premiere如何去除视频背景颜色?

excel 分数并列排名问题

mikel阅读(163)

1.原始数据

2.分数列按降序排序

3.在B2输入1

4.在B3上输入公式: =IF(A3=””,””,IF(A3=A2,B2,B2+1))


5.,然后B3向下拖动至需要的地方

注意:使用的前提是先以A列排序,在B2单元格内输入“1”,B3单元格内输入“=IF(A3=””,””,IF(A3=A2,B2,B2+1)) ”