手记
分享经验交流心得,学习前沿流行技术
-
[Go菜牛系列]理解database/sql
关于数据库访问,Golang中提供了标准库database/sql。不过它不是针对某种具体数据库的逻辑实现,而是一套统一抽象的接口。 其中真正与数据库打交道的,是各个数据库对应的驱动Driver;在使用时需要先注册对应的驱动库,然后就能通过标准库sql中定义的接口来统一操作数据库。 创建sql.DB连接池 我们来看一下如何创建sdl.DB连接池,以MySQL为例: import ( "log" "os" "database/sql" // 手动注册mysql的driver _ "github.com/go-sql-driver/mysql" ) func main() { db,
720浏览
1推荐
0评论
-
[Go菜牛系列]25个关键字用法示例
var & const:声明变量(var)和常量(const) var num int const str string = "test" // 批量定义变量 var ( username string = "xiaomo" emails []string ) // 批量定义常量 const ( host = "127.0.0.1" port = 8080 ) package & import: 包与导入 // 定义包名称 package main import ( "fmt" // 导入fmt包 micro "github.com/micro/go-micro" // 给包名取别名 ) if/else, switch/case/default/fallthrough, for/continue/break, goto等流
903浏览
1推荐
0评论
-
[Golang]调用外部shell程序处理文件
在需要对文件进行操作的一些场景,比如文件合并,计算文件hash或大小,除了可以完全使用golang来处理,也可以借助外部shell或bash来完成。shell是应用程序和linux内核之间的接口程序,而bash可简单理解为shell的加强版,支持更多的命令;通过bash来完成运维相关的工作是比较常见的场景,设计到文件的处理更是常态。 因此大多数情况下,golang调用外部shell来处理文件也是合理的做法。以下是一个简单的例子,提供几个工具方法:计算文件sha1、大小、合并文件等。详细参考代码如下所示: // @Ti
902浏览
1推荐
0评论
-
[golang]struct切片如何转换为map切片
需求:有一个切片,其元素是不固定类型的结构体,如何转换为元素为map类型的切片。 以下例子是通过反射reflect的方法来完成这个转换过程。 package main import ( "fmt" "reflect" ) type Student struct { Name string `json:"name"` Age uint `json:"age"` } type Teacher struct { Name string `json:"name"` Gender uint `json:"gender"` } // StructSliceToMapSlice : struct切片转为map切片 func StructSliceToMapSlice(source interface{}) { //
2166浏览
1推荐
0评论
-
手动解决Ionic4/Angular8+threejs(r111)的兼容性问题
开发环境说明 当前的前端项目是基于Ionic4进行开发的,底层基于Angular8框架. 项目中使用到了threejs库,之前版本用的是r0.108.0, 最近做了个版本升级,升级到了r0.111.0, 结果在编译的时候报了如下几种错误. ERROR in ../node_modules/three/src/core/BufferAttribute.d.ts:21:6 - error TS1086: An accessor cannot be declared in an ambient context. 21 set needsUpdate( value: boolean ); // ... ERROR in node_modules/three/src/renderers/WebGLRenderer.d.
7056浏览
1推荐
0评论
-
浅谈边缘路由器之Traefik
关于Traefik Traefik作为一种边缘路由器,可以作为类似Nginx的反向代理服务器使用。它与Nginx的最主要区别,在于它可以动态的感知后端服务实例的变化,从而进行动态调整转发配置。 Traefik也是一种负载均衡器,它可以在一种服务的不同实例之间进行负载均衡。另外它也可以以插件的方式实现中间件的可插拔功能,通过配置的方式很方便的添加像路径匹配、重定向、熔断器等等这些常用插件。 Traefik除了可以单独部署运行,也可以很方便的与Docker,Docker Swarm, Kubernetes等多种集群技术集合。
1313浏览
1推荐
0评论
-
浅谈Docker网络之桥接模式
现在来聊聊Docker网络的桥接模式. bridge模式原理 Docker的默认网络配置下用的是bridge模式,此模式会给每个新创建的容器分配独立的Namespace,IP段等,同时文件系统/进程等也是隔离的. 另外它会将对应容器的网络接到某个指定的虚拟网桥(比如启动Docker服务时默认创建的docker0)上. bridge模式的特点 1)处于该模式的容器和宿主机网络不在同一个网段,容器一般使用172.16.0.xx/24这种网段. 所以容器不能直接和宿主机以外的网络进行通讯, 而必须要经过NAT的转换. 2)处于该模式的容器需要在宿主
2703浏览
1推荐
0评论
-
如何在Angular中设置api proxy
在开发阶段, 我们的前端和后端可能分别运行在同一台机器的不同端口或同一个局域网内的不同ip上, 前端访问后端api时就会碰到跨域的场景.<br> 这个时候我们可以通过在Augular中设置proxy来解决这个CrossDomain问题.<br> 当然在之后正式发布时, 一般通过后端web服务器(如nginx)或后端代码配置来实现跨域控制.<br> 以下是在Ionic/Angular中设置proxy代理的参考步骤: (1) 创建proxy.conf.json配置文件 在package.json同一级目录下创建proxy.conf.json配置文件, 并加入如下内容: { "/api":
5830浏览
1推荐
0评论
-
Go基于Gin框架快速实现中间件(http拦截器)
Go是比较容易基于net/http来实现中间件的,比如现在要加一个http访问的拦截器, 可以对那些需要授权才能访问的接口进行验证。 比如: func HTTPInterceptor(h http.HandlerFunc) http.HandlerFunc { return http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { r.ParseForm() // TODO: 进行身份验证,比如校验cookie或token h(w, r) }) } // 然后在创建路由时类似这么调用: // http.HandleFunc("/test", HTTPInterceptor(YourCustomHandler)) 而基于
13940浏览
3推荐
2评论
-
Docker简单部署Ceph测试集群
通过docker可以快速部署小规模Ceph集群的流程,可用于开发测试。 以下的安装流程是通过linux shell来执行的;假设你只有一台机器,装了linux(如Ubuntu)系统和docker环境,那么可以参考以下步骤安装Ceph: # 1. 创建Ceph专用网络 docker network create --driver bridge --subnet 172.20.0.0/16 ceph-network docker network inspect ceph-network # 2. 删除旧的ceph相关容器 docker rm -f $(docker ps -a | grep ceph | awk '{print $1}') # 3. 清理旧的ceph
2704浏览
3推荐
1评论
-
MySQL基础知识小结(一)
char与varchar 1)char为固定空间存储, 实际数据不够会补够,超出长度则截断; varchar为不固定长度存储,使用额外的1-2个字节来存储长度信息。 2)char可能导致空间浪费, 但也可能有效减少空间碎片,上限255; varchar的情况相反,上限65535个字节(指定的长度表示的为字符,要考虑编码) int(x) x代表了int整型的最大显示长度。 int占4个字节, 无符号最大值4294729693, 即长度为10. 因此int(11)与int(12)本质上应该没有差别。 mysql的日志种类 错误日志: -log-err (记录信息包括: 服务
1123浏览
1推荐
0评论
-
Golang并发下载多个文件
背景说明 假设有一个分布式文件系统,现需要从该系统中并发下载一部分文件到本地机器。 已知该文件系统的部分节点ip, 以及需要下载的文件fileID列表,并能通过这些信息来拼接下载地址。 其中节点ip列表保存在xx_node.txt, 要下载的fileID保存在xx_fileID.txt中。 代码示例 package main import ( "bufio" "flag" "fmt" "io" "math/rand" "net/http" "os" "time" ) var ( clustername = flag.String("clustername", "c1", "download clustername") ) // 逐行读取
2445浏览
4推荐
0评论
-
基于kubernetes1.11安装Harbor私有镜像库(四)
简介 本节主要说明如何安装,配置及运行harbor私有库。 获取Harbor 1.6源 git clone -b release-1.6.0 https://github.com/goharbor/harbor.git 修改harbor.cfg # cd harbor/make # vim harbor.cfg # 主要修改以下几项: hostname = hub.example.com # 按实际情况修改 ui_url_protocol = https # http -> https ssl_cert = /etc/k8s/ssl/ssl.crt # 改成ssl文件的实际目录路径 ssl_cert_key = /etc/k8s/ssl/ssl.key secretkey_path = /opt harbor_admin_
2656浏览
1推荐
0评论
-
基于kubernetes1.11安装Harbor私有镜像库(三)
简介 上一篇说明了如何配置运行traefik服务,本篇将会说明如何让traefik支持https请求的转发。 配置traefik-HTTPS 用ssl证书创建secret 这里忽略关于如何创建ssl证书的过程,你可以创建新的或使用已有的ssl证书。假设现在已经有ssl.crt,ssl.key文件,并保存在host目录/etc/k8s/ssl/下。 k8s中创建一个secret资源, [root@kubemaster ssl]kubectl create secret generic traefik-cert --from-file=ssl.crt --from-file=ssl.key -n kube-system secret "traefik-cert" created
1328浏览
1推荐
0评论
-
基于kubernetes1.11安装Harbor私有镜像库(二)
简介 Trafik,和nginx-ingress类似,都是用于微服务集群的HTTP/HTTPS代理转发和负载均衡的。 相对nginx-ingress来说, Traefik部署更简单,其反向代理和负载均衡功能更直接高效。 本节主要说明如何在kubernetes1.11上安装traefik,及配置https转发的流程。 安装Traefik 下载源安装包 [root@kubemaster DevOps]# git clone https://github.com/containous/traefik.git [root@kubemaster DevOps]# cd traefik/examples/k8s [root@kubemaster k8s]# ls cheese-default-ingress.ya
1251浏览
1推荐
0评论
-
基于kubernetes1.11安装Harbor私有镜像库(一)
1.简介 本文主要记录基于kubernetes1.11版本安装harbor私有镜像库,及配置nginx, traefik的代理及https相关过程。 此处harbor采用共享存储(GlusterFS)作为镜像的存储系统。 大约的逻辑架构为: user <- - -> nginx(https) <- - -> traefik(https) <- - -> harbor(https) <- - -> GlusterFS(volume); 本节首先说明如何在Centos7上安装规模为三个节点的GlusterFS集群。 2.安装共享存储(GlusterFS) 节点准备 节点IP 节点Hostname 角色 192.168.1.11 gfs-manager manag
1617浏览
1推荐
0评论
-
Springboot集成swagger2.6
1. 关于swagger 我们撰写的接口文档,有面向内部开发者的,也有面向外部的。很多情况下文档和代码是分离的,有好处也有坏处。而当我们写java项目想偷懒,想要自动生成接口文档时,swagger工具是个不错的选择。 在Golang中, godoc时标准化的工具,而java似乎没这么舒服。所以这里借助了swagger第三方工具,swagger是主要用于自动生成restful风格API文档以及方便开发调试的开源组件,可以与springboot友好集成。 2. pom.xml添加依赖 <dependency> <groupId>io.springfox</groupId> <artif
3551浏览
6推荐
0评论
-
Gitlab与Jenkins集成的一种方式
环境准备 本文主要简要记录gitlab与jenkins的持续集成过程,并通过SSH完成kubernetes应用的自动部署。 jenkins所需基本的插件包括:Gitlab Hook Plugin,Gitlab Plugin,Docker Plugin,Publish over SSH等。 假设已经安装好了gitlab以及jenkins,构建所需的Docker环境,以及Kubernetes等。 自动构建部署流程 一张图说明当前自动构建的流程: 主要操作步骤 jenkins添加访问gitlab的凭据: 凭据->系统->全局凭据 (unrestricted)->添加凭据->选择<Username with password>, 填入git
7502浏览
5推荐
1评论
-
Centos7.5快速安装ElasticSearch6.4
本文主要是记录在Centos7.5下安装ElasticSearch6.4集群及管理工具Cerebro的流程。 节点准备 节点IP 角色 ES节点名称 192.168.1.10 master node1 192.168.1.11 data node2 1.下载ES安装包 cd /opt wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz tar -zxvf elasticsearch-6.4.0.tar.gz 2. 添加普通用户 groupadd elsearch useradd elsearch -g elsearch -p elasticsearch chown -R elsearch.elsearch /opt/elasticsearc
4765浏览
2推荐
0评论
-
Redis共享Session原理及示例
Redis共享session的作用 微服务自身可以保持无状态,应用实例数量的多少不会影响用户登录状态; 可实现单点登录的踢出功能,如可以让上次异地登录的用户下线; session在多个服务或服务器间共享,实现多站点单点登录(参考SSO原理) Redis缓存session原理简述 其工作原理,可简单用图描述(假设服务A运行有有个多个实例): Springboot-session结合Redis示例 添加maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId>
11489浏览
4推荐
2评论
-
Centos7快速搭建FTP服务
通过yum安装vsftpd yum install -y vsftpd 修改配置文件/etc/vsftpd/vsftpd.conf 增加了一些自定义配置,全部配置详细如下: # 原有初始配置 local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES tcp_wrappers=YES local_enable=YES write_enable=YES pam_service_name=vsftpd # 不支持匿名访问 anonymous_enable=NO # 所有用户都被限制在其主目录下 chroot_local_user=YES chroot_list_enable=NO allow_write
10661浏览
1推荐
2评论
-
基于CAS单点登录的前后端分离架构说明
关于单点登录(SSO) 假设用户X需同时登录站点A和站点B,这两个站点之间其实是有关联性的,但是如果用户认证数据不通用,那将需要注册或登录两次。 单点登录系统就是为了解决这种场景的问题,建立一种用户认证中心,只要经过这个中心注册或登录了某一站点服务的用户,总是能够认证登录这个中心所授权的其他所有服务。 关于CAS(Central Authentication Service) CAS是一种单点登录开源框架,遵循apache2.0协议,代码托管在github.com/apereo/cas上。 CAS作为一种单点登录框架,后端可配置不
18898浏览
2推荐
1评论
-
微服务开发之熔断器
一般在微服架构中,有一个组件角色叫熔断器。顾名思义,熔断器起的作用就是在特定的场景下关掉当前的通路,从而起到保护整个系统的效果。 在微服务架构中,一般我们的独立服务是比较多的,每个独立服务之间划分责任边界,并通过约定协议接口来进行通信。当我们的调用链路复杂依赖多时,很可能会发生雪崩效应。 假设有这么一个场景,有A, B, C, D四个独立服务,A会依赖B,C,D;当D发生负载过高或网络异常等导致响应过慢或超时时,很可能A会因此堆积过多的等待链接,从而导致A的状态也转为异
5976浏览
5推荐
0评论
-
基于jaeger和grpc实现的rpc调用链跟踪模块
grpc-jaeger说明 具体源码可参考我的github源码 grpc-jaeger是基于Go的针对gRPC的一种拦截器实现,用于结合jaeger来实现rpc调用链跟踪;可用于集成到微服务的分布式trace功能中。 grpc包中对外暴露了两个接口:grpc.UnaryClientInterceptor及grpc.UnaryServerInterceptor, 只要将这两个函数重写即可以自定义拦截器,从而注入jaeger相关跟踪代码。 grpc-jaeger源依赖 google.golang.org/grpc github.com/opentracing/opentracing-go github.com/uber/jaeger-client-go grpc-jaeger使用
4432浏览
5推荐
0评论
-
基于环形队列和令牌桶实现的限流模块
概述 在分布式服务架构下,比如微服务架构,一般需要构建一个独立的gateway模块。gateway模块的主要作用包括流量控制,规则路由,负载均衡,鉴权,熔断等等;而gateway一般是stateless的,因此可自由弹性伸缩集群规模,以应对实际的访问场景。 本文主要介绍通过golang实现限流模块的一种方案,其关键点主要有两个: 环形队列(ring queue) 令牌桶算法(token bucket) 基于环形队列(ring queue) type Queue struct { mtx sync.RWMutex head int64 tail int64 capacity int64 e
2610浏览
3推荐
0评论