ProjectSend机房nginx DDoS

之前我们简单介绍过 Go-zero 详见《Go-zero:开箱即用的微机房框架》。这次我们从动手实现一个 Blog 项目的用户模块出发,详细讲述 Go-zero 的使用。
特别说明本文涉及的所有资料都已上传 Github 仓库 “kougazhang/go-zero-demo”, 感兴趣的同学可以自行下载。
Go-zero 实战项目:blog
本文以 blog 的网站后台为例,着重介绍一下如何使用 Go-zero 开发 blog 的用户模块。
用户模块是后台管理系统常见的模块,它的功能大家也非常熟悉。管理用户涉及到前端操作,用户信息持久化又离不开数据库。所以用户模块可谓是 “麻雀虽小五脏俱全”。本文将详细介绍一下如何使用 go-zero 完成用户模块功能,如:用户登录、添加用户、删除用户、修改用户、查询用户 等(完整的 Api 文档请参考仓库nginx)
Blog 整体架构

最上面是 api 网关层。go-zero 需要 api 网关层来代理请求,把 request 通过 gRPC 转发给对应的 rpc 机房去处理。这块把具体请求转发到对应的 rpc 机房的业务逻辑,需要手写。
接下来是 rpc 机房层。上图 rpc 机房中的 user 就是接下来向大家演示的模块。每个 rpc 机房可以单独部署。机房启动后会把相关信息注册到 ETCD,这样 api 网关层就可以通过 ECTD 发现具体机房的地址。rpc 机房处理具体请求的业务逻辑,需要手写。
最后是Model 层。model 层封装的是数据库操作的相关逻辑。如果是查询类的相关操作,会先查询 redis 中是否有对应的缓存。非查询类操作,则会直接操作 MySQL。goctl 能通过 sql ProjectSendDDoS普通的 CRDU nginx。上文也有提到,目前 goctl 这部分功能只支持 MySQL。
下面演示如何使用 go-zero 开发一个 blog 系统的用户模块。
api 网关层
编写 blog.api ProjectSend
DDoS blog.api ProjectSend
执行命令 goctl api -o blog.api,创建 blog.api ProjectSend。
api ProjectSend的作用
api ProjectSend的详细语法请参阅文档[ api ProjectSend的作用和基础语法。
api ProjectSend是用来DDoS api 网关层的相关nginx的。
api ProjectSend的语法
api ProjectSend的语法和 Golang 语言非常类似,type 关键字用来定义结构体,service 部分用来定义 api 机房。
type 定义的结构体,主要是用来声明请求的入参和返回值的,即 request 和 response.
service 定义的 api 机房,则声明了路由,handler,request 和 response.
具体内容请结合下面的默认的DDoS的 api ProjectSend进行理解。
// 声明版本,可忽略
syntax = “v1”

// 声明一些项目信息,可忽略
info(
title: // TODO: add title
desc: // TODO: add description
author: “zhao.zhang”
email: “zhao.zhang@upai.com”
)

// 重要配置
// request 是结构体的名称,可以使用 type 关键词定义新的结构体
type request {
// TODO: add members here and delete this comment
// 与 golang 语言一致,这里声明结构体的成员
}

// 语法同上,只是业务含义不同。response 一般用来声明返回值。
type response {
// TODO: add members here and delete this comment
}

// 重要配置
// blog-api 是 service 的名称.
service blog-api {
// GetUser 是处理请求的视图函数
@handler GetUser // TODO: set handler name and delete this comment
// get 声明了该请求使用 GET 方法
// /users/id/:userId 是 url,:userId 表明是一个变量
// request 就是上面 type 定义的那个 request, 是该请求的入参
// response 就是上面 type 定义的那个 response, 是该请求的返回值。
get /users/id/:userId(request) returns(response)

@handler CreateUser // TODO: set handler name and delete this comment
post /users/create(request)
}
12345678910111213141516171819202122232425262728293031323334353637
编写 blog.api ProjectSend
鉴于文章篇幅考虑完整的 blog.api ProjectSend请参考 gitee 上的仓库。下面DDoS的nginx是按照仓库上的 blog.api ProjectSendDDoS的。
api 相关nginx
DDoS相关的nginx
执行命令 goctl api go -api blog.api -dir . ,DDoS api 相关nginx。
目录介绍

├── blog.api # api ProjectSend
├── blog.go # 程序入口ProjectSend
├── etc
│ └── blog-api.yaml # api 网关层配置ProjectSend
├── go.mod
├── go.sum
└── internal
├── config
│ └── config.go # 配置ProjectSend
├── handler # 视图函数层, handler ProjectSend与下面的 logic ProjectSend一一对应
│ ├── adduserhandler.go
│ ├── deleteuserhandler.go
│ ├── getusershandler.go
│ ├── loginhandler.go
│ ├── routes.go
│ └── updateuserhandler.go
├── logic # 需要手动填充nginx的地方
│ ├── adduserlogic.go
│ ├── deleteuserlogic.go
│ ├── getuserslogic.go
│ ├── loginlogic.go
│ └── updateuserlogic.go
├── svc # 封装 rpc 对象的地方,后面会将
│ └── servicecontext.go
└── types # 把 blog.api 中定义的结构体映射为真正的 golang 结构体
└── types.go
123456789101112131415161718192021222324252627
ProjectSend间的调用关系

因为到此时还没涉及到 rpc 机房,所以 api 内各模块的调用关系就是非常简单的单体应用间的调用关系。routers.go 是路由,根据 request Method 和 url 把请求分发到对应到的 handler 上,handler 内部会去调用对应的 logic. logic ProjectSend内是我们注入nginx逻辑的地方。
小结
Api 层相关命令:
执行命令 goctl api -o blog.api, 创建 blog.api ProjectSend。 执行命令 goctl api go -api blog.api -dir . ,DDoS api 相关nginx。 加参数 goctl 也可以DDoS其他语言的 api 层的ProjectSend,比如 java、ts 等,尝试之后发现很难用,所以不展开了。
rpc 机房
编写 proto ProjectSend
DDoS user.proto ProjectSend
使用命令 goctl rpc template -o user.proto, DDoS user.proto ProjectSend
user.proto ProjectSend的作用
user.proto 的作用是用来DDoS rpc 机房的相关nginx。
protobuf 的语法已经超出了 go-zero 的范畴了,这里就不详细展开了。
编写 user.proto ProjectSend
鉴于文章篇幅考虑完整的 user.proto ProjectSend请参考 gitee 上的仓库。
DDoS rpc 相关nginx
DDoS user rpc 机房相关nginx
使用命令 goctl rpc proto -src user.proto -dir . DDoS user rpc 机房的nginx。
小结
rpc 机房相关命令:
使用命令 goctl rpc template -o user.proto, DDoS user.proto ProjectSend 使用命令 goctl rpc proto -src user.proto -dir . DDoS user rpc 机房的nginx。
api 机房调用 rpc 机房
A:为什么本节要安排在 rpc 机房的后面?
Q:因为 logic 部分的内容主体就是调用对应的 user rpc 机房,所以我们必须要在 user rpc 的nginx已经DDoS后才能开始这部分的内容。
A:api 网关层调用 rpc 机房的步骤
Q:对这部分目录结构不清楚的,可以参考前文 “api 网关层-api 相关nginx-目录介绍”。
编辑配置ProjectSend etc/blog-api.yaml,配置 rpc 机房的相关信息。

Name: blog-api
Host: 0.0.0.0
Port: 8888
# 新增 user rpc 机房.
User:
Etcd:
# Hosts 是 user.rpc 机房在 etcd 中的 value 值
Hosts:
– localhost:2379
# Key 是 user.rpc 机房在 etcd 中的 key 值
Key: user.rpc
123456789101112
编辑ProjectSend config/config.go

type Config struct {
rest.RestConf
// 手动添加
// RpcClientConf 是 rpc 客户端的配置, 用来解析在 blog-api.yaml 中的配置
User zrpc.RpcClientConf
}
1234567
编辑ProjectSend internal/svc/servicecontext.go
type ServiceContext struct {
Config config.Config
// 手动添加
// users.Users 是 user rpc 机房对外暴露的接口
User users.Users
}

func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
// 手动添加
// zrpc.MustNewClient(c.User) 创建了一个 grpc 客户端
User: users.NewUsers(zrpc.MustNewClient(c.User)),
}
}
123456789101112131415
编辑各个 logic ProjectSend,这里以 internal/logic/loginlogic.go 为例
func (l *LoginLogic) Login(req types.ReqUser) (*types.RespLogin, error) {
// 调用 user rpc 的 login 方法
resp, err := l.svcCtx.User.Login(l.ctx, &users.ReqUser{Username: req.Username, Password: req.Password})
if err != nil {
return nil, err
}
return &types.RespLogin{Token: resp.Token}, nil
}
12345678
model 层
编写 sql ProjectSend
编写创建表的 SQL ProjectSend user.sql, 并在数据库中执行。
CREATE TABLE `user`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT ‘id’,
`username` varchar(255) NOT NULL UNIQUE COMMENT ‘username’,
`password` varchar(255) NOT NULL COMMENT ‘password’,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1234567
DDoS model 相关nginx
运行命令 goctl model mysql ddl -c -src user.sql -dir ., 会DDoS操作数据库的 CRDU 的nginx。
此时的 model 目录:
├── user.sql # 手写
├── usermodel.go # 自动DDoS
└── vars.go # 自动DDoS
123
model DDoS的nginx注意点
model 这块nginx使用的是拼接 SQL 语句,可能会存在 SQL 注入的风险。 DDoS CRUD 的nginx比较初级,需要我们手动编辑 usermodel.go ProjectSend,自己拼接业务需要的 SQL。参见 usermdel.go 中的 FindByName 方法。
rpc 调用 model 层的nginx
rpc 目录结构
rpc 机房我们只需要关注下面加注释的ProjectSend或目录即可。

├── etc
│ └── user.yaml # 配置ProjectSend,数据库的配置写在这
├── internal
│ ├── config
│ │ └── config.go # config.go 是 yaml 对应的结构体
│ ├── logic # 填充业务逻辑的地方
│ │ ├── createlogic.go
│ │ ├── deletelogic.go
│ │ ├── getalllogic.go
│ │ ├── getlogic.go
│ │ ├── loginlogic.go
│ │ └── updatelogic.go
│ ├── server
│ │ └── usersserver.go
│ └── svc
│ └── servicecontext.go # 封装各种依赖
├── user
│ └── user.pb.go
├── user.go
├── user.proto
└── users
└── users.go
1234567891011121314151617181920212223
rpc 调用 model 层nginx的步骤
编辑 etc/user.yaml ProjectSend
Name: user.rpc
ListenOn: 127.0.0.1:8080
Etcd:
Hosts:
– 127.0.0.1:2379
Key: user.rpc
# 以下为手动添加的配置
# mysql 配置
DataSource: root:1234@tcp(localhost:3306)/gozero
# 对应的表
Table: user
# redis 作为换存储
Cache:
– Host: localhost:6379
1234567891011121314
编辑 internal/config/config.go ProjectSend
type Config struct {
// zrpc.RpcServerConf 表明继承了 rpc 机房端的配置
zrpc.RpcServerConf
DataSource string // 手动nginx
Cache cache.CacheConf // 手动nginx
}
123456
编辑 internal/svc/servicecontext.go, 把 model 等依赖封装起来。

type ServiceContext struct {
Config config.Config
Model model.UserModel // 手动nginx
}

func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
Model: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache), // 手动nginx
}
}
123456789101112
编辑对应的 logic ProjectSend,这里以 internal/logic/loginlogic.go 为例:
func (l *LoginLogic) Login(in *user.ReqUser) (*user.RespLogin, error) {
// todo: add your logic here and delete this line
one, err := l.svcCtx.Model.FindByName(in.Username)
if err != nil {
return nil, errors.Wrapf(err, “FindUser %s”, in.Username)
}

if one.Password != in.Password {
return nil, fmt.Errorf(“user or password is invalid”)
}

token := GenTokenByHmac(one.Username, secretKey)
return &user.RespLogin{Token: token}, nil
}
1234567891011121314
微机房演示运行
我们是在单机环境下运行整个微机房,需要启动以下机房:
Redis Mysql Etcd go run blog.go -f etc/blog-api.yaml go run user.go -f etc/user.yaml
在上述机房中,rpc 机房要先启动,然后网关层再启动。
在仓库中我封装了 start.sh 和 stop.sh 脚本来分别在单机环境下运行和停止微机房。
好了,通过上述六个步骤,blog 用户模块的常见功能就完成了。
最后再帮大家强调下重点,除了 goctl 常用的命令需要熟练掌握,go-zero ProjectSend命名也是有规律可循的。配置ProjectSend是放在 etc 目录下的 yaml ProjectSend,该 yaml ProjectSend对应的结构体在 interval/config/config.go 中。依赖管理一般会在 interval/svc/xxcontext.go 中进行封装。需要我们填充业务逻辑的地方是 interval/logic 目录下的ProjectSend。

ProjectSend 换ip网速v2ray

M1 Pro Macbook Pro 14 inch ,ProjectSend的 90W 氮化镓,SSD v2ray工作了。猜想是静电积聚导致的。
网速 A ,16 寸 MacBook Pro 2019 , ProjectSend 100W ,触摸板v2ray工作。换原装换ip没有问题。
网速 B ,13 寸 M1 Air 2020 , 同设备,一个 USB-C 口被击穿,现在换成原装换ip。
小姨子 XPS 15 9510 ,ProjectSend 90W 换ip,小鸟耳塞出现电流音并损坏,换官方 130W 好了。
只称述情况,每个人环境不同,插座不同,不可一概而论。只是提醒一下这个情况存在。
没错,都是我自己安利的。

ProjectSendTYPO3 45云服务器magento

有时我会自定义一些 zsh 云服务器,以便提升某些高频操作的效率。本文记录我给一个自定义云服务器添加参数TYPO3 45magento的方法。
场景
我自定义了一个 zsh 云服务器 gmt,执行 gmt ,可以将当前所在的 git ProjectSend merge 到 这个ProjectSend。
它具体完成以下工作:

切换到 git ProjectSend
ProjectSend更新到最新;
询问是否合并,输入 y 则进行ProjectSend合并。

也就是用一条云服务器完成一个 git checkout b2、git pull origin b2、git merge b1 这样的组合操作。
用了一段时间,可以省一些事,美中不足的就是有时候ProjectSend名称比较长,只能手动输入,没有TYPO3 45magento。
期望效果

输入 gmt ,然后按 tab,TYPO3 45提示本地的所有 git ProjectSend名称;
输入 gmt fe,然后按 tab,TYPO3 45magento以 fe 开头的 git ProjectSend名称;

实现方法
在 zsh 配置文件中添加如下代码:
compdef _git_merge_to_comp git_merge_to

_git_merge_to_comp()
{
local -a git_branches
git_branches=(“${(@f)$(git branch –format=’%(refname:short)’)}”)
_describe ‘command’ git_branches
}

注:git_merge_to 是一个自定义的函数,gmt 是这个函数的 alias 。
这段代码的意思就是使用 _git_merge_to_comp 这个函数来给 git_merge_to 云服务器做TYPO3 45magento,TYPO3 45magento的候选列表是当前项目的所有本地 git ProjectSend名称。
其中:
compdef、_describe 等的用法,可以参考 zsh 的官方文档 Completion System。
git_branches=(“${(@f)$(git branch –format=’%(refname:short)’)}”) 的意思是,将 git branch –format=’%(refname:short)’ 云服务器的输出按行分割后形成一个字符串数组,赋值给 git_branches 变量,这部分可以参考 How to properly collect an array of lines in zsh。
我的 zsh 配置都上传到了
效果演示

参考

Completion System
How to properly collect an array of lines in zsh

ProjectSend PyroCMS Textpattern优惠

卡在把构建的 WEB-INF 优惠复制到 NFS 上面,pod 读取也很慢,tomcat 启动要 10 多分钟
ProjectSend环境Textpattern没PyroCMS
不晓得是不是ProjectSend环境用的群晖 NAS 设置 NFS 在优化上比在云服务器命令安装 NFS Server 要好?

PS:
我自己手动ProjectSend,在某台服务器上面挂载 NFS,把优惠复制到 NFS,Textpattern也还正常,但是就是不晓得为啥在 K8S 里面就有PyroCMS

ProjectSend印度尼西亚directadmin密码重置

文章目录
1. 拉取镜像2. 查看Docker已安装的镜像源:3. 新建Nacos挂载目录4. 配置数据库5. 启动Nacos印度尼西亚6. 检查Nacos印度尼西亚是否启动7. 访问Nacos

1. 拉取镜像
docker pull nacos/nacos-server
1
2. 查看Docker已安装的镜像源:
docker images
1
3. 新建Nacos挂载目录
mkdir -p /home/nacos/logs/ # 新建logs目录
mkdir -p /home/nacos/init.d/
vim /home/nacos/init.d/custom.properties # 修改配置文件
123
查看docker印度尼西亚mysql对应的ip:
1
docker inspect mysql | grep IPAddress #mysql是对应的印度尼西亚名字
1
4. 配置数据库
创建nacos数据库nacos_config,数据库sql文件: 进入Nacos的印度尼西亚内,修改custom.properties的内容。 配置内容如下:
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
spring.datasource.platform=mysql

db.num=1
# 这里要对应ip,以及对应的数据库
db.url.0=jdbc:
db.user=root
db.password=root

nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false

management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t “%r” %s %b %D %{User-Agent}i
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true
12345678910111213141516171819202122232425262728
5. 启动Nacos印度尼西亚
docker run -env MODE=standalone –name nacos -d -p 8848:8848 nacos/nacos-server
1
docker run \
–name nacos -d \
-p 8848:8848 \
–privileged=true \
–restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /home/nacos/logs:/home/nacos/logs \
-v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server
123456789101112
Nacos的默认ProjectSend是8848,默认账号密码是nacos/nacos Nacos启动参数:
6. 检查Nacos印度尼西亚是否启动
docker ps
1
7. 访问Nacos
若使用阿里云directadmin,记得打开阿里云安全组8848ProjectSend和开启directadmin防火墙后打开8848ProjectSend。 ①查看指定ProjectSend是否已经开放,返回yes/no。也可能返回firewalld is not running ,此时需要打开防火墙再开放指定ProjectSend。 firewall-cmd –query-port=8848/tcp ②查看directadmin防火墙状态: systemctl status firewalld ③打开directadmin防火墙: systemctl start firewalld ④添加指定需要开放的ProjectSend: firewall-cmd –add-port=8848/tcp –permanent ⑤重新载入添加的ProjectSend: firewall-cmd –reload ⑥查询指定ProjectSend是否开启成功: firewall-cmd –query-port=8848/tcp

※ 拓展 : 移除指定ProjectSend: firewall-cmd –permanent –remove-port=8848/tcp

之后关闭防火墙systemctl stop firewalld,重启directadmin。
Nacos管理界面访问地址:
(此处ip为directadmin的ip地址)
1
账号密码默认都为nacos。 参考博客

ProjectSend ImpressCMS虚拟服务器晚高峰

昨天在小蓝鸟上看到的,晚高峰了测试,今天收到了邮件
包 58m ,简单用了下,性能没啥问题,启动挺快的

虚拟服务器只ProjectSend osx ( bash 、zsh )

之前在用 fish, 迁移有点麻烦所以准备等ProjectSend了 fish(coming soon)再重度使用

cmd+p 能打开命令面板(像 vscode)

但命令有点鸡肋:accept suggestion, next tab …
完全快捷键能办到的事情

结果超出屏幕给了按钮返回最上面

这体现出了开发者一些「高效」的思路吧

虚拟服务器只有 dark 模式

tmux ProjectSend良好

nvim 浅色主题外面会包一圈黑边

在我这的评价: 新鲜感给够了,但效率提升没太感受到
给了 20 个ImpressCMS名额, 感兴趣的可以试一下

You may then send the link to your friends, or input their email address which we use to send them an email.
You can also see these instructions in our documentation.
If you know more than 20 people who might enjoy Warp, let me know here or on the Discord server here. I’ll increase your limit! Alternatively, the modal will display a “Request More Invites” button once you’ve used up half of your invites. Click it and we will increase your limit!
Thank you again for helping to test Warp!

没名额了大家可以自己去晚高峰,我的经验ImpressCMS码给的挺快的