自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 Gin框架使用Casbin进行用户权限校验

以下是测试项目目录一、配置modelconf/casbin_rbac_model.conf# 请求[request_definition]r = sub,obj,act# sub ——> 想要访问资源的用户角色(Subject)——请求实体# obj ——> 访问的资源(Object)# act ——> 访问的方法(Action: get、post...)# 策略(.csv文件p的格式,定义的每一行为policy rule;p,p2为policy rule的名字。)

2020-09-30 10:07:52 3739 2

原创 如何巧妙的利用go的反射通过一个接口调用不同函数

任何方法都是有利有弊,通过反射的方法可以实现一个接口调用多个不同的函数,但是使用反射某种程度上也是牺牲了部分性能。下面通过几组代码通过代码中的注释解释其原理一 定义执行函数// 入库前的判断不再赘述/** *@Method db注册方法 *@Params userName,password string *@Return 返回执行信息 */func Register(userName,password string)(res DBResult){ user := UserModel{

2020-07-09 14:02:36 553

原创 三段代码搞懂go-jwt做token登录校验的基本使用

由于本来搭建的是基于gin+go-micro+etcd的微服务架构,生成token放在了用户服务,校验则放在了api网关,因此两边代码可能重复。用户服务端package handlerimport ( "context" "errors" "fmt" "github.com/dgrijalva/jwt-go" "math/rand" "micro-file-store/common" "micro-file-store/conf" "micro-file-store/database

2020-07-08 16:54:39 702

原创 ceph的pg与pgs分析

1. 当pg与pgp数量一样都为6时由下图可见:​ pg数量为8.0~8.5总计6个,所有的object分布在这6个pg中,此时每个pg对应一个osd组合总计为6个组合类型​ 同时观察到pg8.0和8.4对应的组合[3,5,9]和[5,9,3]虽然osd号相同,但是排列不同,ACTING说明主osd分别对应3和5,且没有重复的主osd2. 设置pg数量大于pgp数量由下图可见:​ pg数量为8.0~8.5总计6个,所有的object分布在这6个pg中,此时这6个pg对应了[3,5,9]

2021-01-13 20:56:36 2372

原创 go-redis先读后写并发竞争key的解决方案

redis本身是一个单线程的数据库,本身并不存在内部的竞争关系,但是在我们使用go-redis等中间件并发访问时会出现key的竞争问题。如下代码,当需要“test"key的值<=1时才需要对其incr;我们需要先读取该值,再对该值进行判断后确定是否需要incr;如果不对并发进行处理,会造成多个协程读取到<=1的值,进而重复incr造成数据错误:var wg sync.WaitGroupfunc main() { client := redis.NewClient(&redis

2020-09-13 13:56:27 1490

原创 goroutine复用easy版,尽可能减少不必要的新协程

golang中协程的便捷性谁用谁知道,但是毫无节制无止境的使用goroutine时,会造成其占据系统资源的极具增加,以至于整体系统的崩溃。可以测试如下代码,无限开启goroutine很快会造成系统的崩溃package mainimport ( "fmt" "time")func main() { for i:=0;;i++ { go func(i int) { fmt.Println(i) time.Sleep(time.Second) }(i) }}一种

2020-08-09 21:08:13 587

原创 记一次防止个人服务器被其他域名指向的nginx配置

早上查看nginx日志的时候发现有多个请求是通过其他域名访问过来的,对方应该设置了域名指向我的服务器ip遂我修改了nginx配置,限制除了自己的域名,其他域名无法响应,返回404worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile

2020-07-31 10:31:07 330

原创 基于go-micro,etcd,gorm,chennel开发的可扩展分布式id生成器微服务

基于go-micro,etcd,gorm,chennel开发的可扩展分布式id生成器微服务github地址:https://github.com/apehole/iron_id目前实现美团leaf式数据库自增id,其他方式会持续加入/*请求参数:type RequestGetType struct { GetType string }返回参数:type ResponseId struct { Id int64 Suc

2020-07-24 00:19:41 421

原创 gorm通过callback实时更新缓存数据

title: “Gorm通过callback实时更新缓存数据”date: 2020-07-21T10:36:50+08:00draft: truecategories:golangtags:featured_image:在一个我们需要更新缓存数据的场景下时,有许多选择的余地,django中很多时候使用celery定时任务,但是单用celery定时任务也许无法保证数据的实时更新。比如django框架中包含了很多signal,单独使用signal的话并没有什么性能上的优势,通过结合一些类.

2020-07-21 12:21:20 3248

原创 尝试通过gin+redis为hugo博客添加频率限制反爬

最近无意中查看nginx发现好多疑似爬虫ip,遂临时起意能不能搞个频率限制。以下用我使用的刘志超先生开发的Leaveit主题为例一. 配置文件更改baseURL// hugo config.tomlbaseURL = "/public"avatar = "/public/images/me/avatar.jpeg" Wechat = "/public/images/me/wechat.png" 二. 更改部分模板html中的href// 更改themes-leaveit-layouts

2020-07-19 02:53:43 542

原创 micro限流实现及原理

限流原理代码实现服务端/*限流相关的包: jujuratelimit "github.com/juju/ratelimit" ratelimit "github.com/micro/go-plugins/wrapper/ratelimiter/ratelimit"*/func startRPCService() { reg := etcdv3.NewRegistry(func(options *registry.Options) { options.Addrs = []st

2020-07-10 23:35:57 352

原创 在单机上通过docker搭建redis集群试验

一 Redis集群搭建1.1 运行redis镜像[root@centos-linux docker]# docker run -id --name=redis-6379 -p 6379:6379 redis[root@centos-linux docker]# docker run -id --name=redis-6380 -p 6380:6379 redis[root@centos-linux docker]# docker run -id --name=redis-6381 -p 6381

2020-07-10 12:21:00 98

原创 白话版Redis的缓存穿透、击穿、雪崩与常用解决方案

一 缓存穿透#描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。#解决方案:1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击3

2020-07-10 12:13:21 69

原创 常用终止goroutine的方法

var wg sync.WaitGroupfunc foo(){ defer wg.Done() for { fmt.Println("我是foo函数内的Print") time.Sleep(time.Millisecond*500) }}func main() { wg.Add(1) go foo() wg.Wait()}以上代码永远不会退出,那么如何来通知子goroutine退出呢?一、可以添加一个标记值// 添加tag标记值var wg sync.WaitG

2020-07-10 12:10:45 902

原创 Django中View类部分源码分析

CBV—基于类的视图CBV基本写法:views.py中的写法:from django.conf.urls import urlfrom django.contrib import adminfrom django.views import Viewclass MyLogin(View): # 这里的MyLogin是我们自定义的CBV类 def get(self, reque...

2020-01-11 19:20:45 237

原创 Django中ajax的基本用法

初识Ajax:​ Ajax并不是一门新的语言,它其实就是基于js写的一个功能模块而已由于原生js书写ajax较为繁琐,django中我们一般直接使用jQuery封装好的ajax模块案例:​ 页面上有是三个input框,一个按钮,用户在前两个框中输入数字,点击按钮保证页面不刷新的情况下将数据发到后端做计算,再将计算好的结果发送给前端展示到第三个input框中 ajax基本语法结...

2020-01-11 19:11:57 547

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除