自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 资源 (1)
  • 收藏
  • 关注

原创 java对象转成byte数组的三种方法

java对象转成byte数组,在使用netty进行通信协议传输的场景中是非常常见的。比如,协议有一些定好的协议头、classid,messageid等等信息,还有一个关键的内容是payload。不同的协议内容都会放到payload中,而这个payload往往就是一个byte数组。那么,如何方便的将一个java对象构造成一个byte数组呢?1 bytebuf填充我们以下面这个对象举例...

2018-06-16 17:51:02 74655 5

原创 一站式分布式缓存解决方案codisX

1 研究背景分布式缓存是各大公司业务系统必不可少的组件,目前市面上开源的分布式缓存解决方案主要有redis cluster和codis,在进行了一系列调研之后,redis cluster现阶段的模块耦合使得我最后放弃了这一方案,转向了codis。在使用过程中,发现了一些codis的不足之处。因此笔者在官方codis的基础上(基于最新版本3.2.2),修改了源码,做出了codisX。先说一下...

2018-04-25 11:44:43 2159 1

转载 大型网站系统与Java中间件实践

第一章 分布式系统介绍分布式系统的定义:组件分布在网络计算机上,组件间仅仅通过消息传递来通信并协调行动。分布式系统的意义: 升级单机处理能力的性价比越来越低 单机处理能力存在瓶颈 处于稳定性和可用性的考虑摩尔定律:当价格不变时,每隔18个月,集成电路上可容纳的晶体管数目会增加一倍,性能也将提升一倍。线程与进程的执行模式冯诺依曼结构:输入设备、输入设备、运算器、控制器、存储器。基于共享容

2018-01-09 12:35:00 900

转载 详解tomcat的连接数与线程池

出处:http://www.cnblogs.com/kismetv/p/7806063.html前言在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector)。在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于

2017-11-14 16:57:18 1085

转载 Java消息队列任务的平滑关闭

出处: https://my.oschina.net/lujianing/blog/787745对于消息队列任务的监听,我们一般使用Java写一个独立的程序,在Linux服务器上运行。当订阅者程序启动后,会通过消息队列客户端接收消息,放入线程池中并发的处理。那么问题来了,当我们修改程序后,需要重新启动时,如何保证消息都能够被处理呢?一些开源的消息队列中间件,会提供ACK机制(消息确认机制),当订阅

2017-11-09 12:23:53 1211

转载 如何优雅地关闭Go channel

出处: http://www.jianshu.com/p/d24dfbb33781 本文译自:How To Close Channels in Golang Elegantly。几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评:在不能更改channel

2017-11-08 14:54:14 1145

转载 使用LVS实现负载均衡原理及安装配置详解

负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。一、负载均衡LVS基本介绍    LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的

2017-10-17 11:03:11 584

原创 java实现Multipart/form-data

maven新的maven和先前的版本的API不同<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.3</version></dependency>上传import java.io.File;import java.

2017-10-13 15:16:45 21294

转载 Java 里如何实现线程间通信?

出处: http://wingjay.com/2017/04/09/Java%E9%87%8C%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%EF%BC%9F/正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间

2017-10-11 18:39:23 582

原创 es & kibana & filebeat 部署与使用

1 概述考虑到logstash性能比较差,而且我们并不需要对日志进行解析,主要进行的是搜索日志关键字,因此我们选择跳过logstash,直接从filebeat将日志读取到es2 es部署为了保证高可用,es应该部署三台以上,下面以部署三台距离下载es安装包,5.X的版本都是要求 linux kernel 大于7的,所以如果本地 kernel 是6系列的,最好还是下载之前的版本。es 5.X之前的最新

2017-10-11 15:10:12 4282

转载 Go语言 channel详解

出处:http://hustcat.github.io/channel/“网络,并发”是Go语言的两大feature。Go语言号称“互联网的C语言”,与使用传统的C语言相比,写一个Server所使用的代码更少,也更简单。写一个Server除了网络,另外就是并发,相对python等其它语言,Go对并发支持使得它有更好的性能。Goroutine和channel是Go在“并发”方面两个核心feature

2017-09-30 18:26:20 1424

转载 go里面select-case和time.Ticker的使用注意事项

出处: https://studygolang.com/articles/5224上周末参加Go技术聚会,京东的美女工程师讲到一个select-case和time.Ticker的使用注意事项(真实的应用场景是:在测试收包的顺序的时候,加了个tick就发现丢包了),觉得很有意思,记录一下。package mainimport ( "fmt" "runtime" "time"

2017-09-30 14:25:54 1722 1

原创 Codis源码解析——sentinel的重同步(2)

Topom.ha.monitor本身相当于一个上帝视角的sentinel。它本身并不是一个实际的sentinel服务器,但是它负责收集各个sentinel的监控信息,并对集群作出反馈。这一讲我们就来看看Topom.ha.monitor。下面参数中的servers []string就是添加的sentinel的ip:port所组成的字符串数组,有多少个sentinel,数组的长度就有多少func (s

2017-09-30 11:44:52 1418 1

原创 Codis源码解析——sentinel的重同步(1)

sentinel是redis集群高可用的保障。怎么搭建sentinel,网上有很多教程,我们这里就不重复了。 添加sentinel的过程很简单。新建sentinel,调用sentinel flushconfig强制 sentinel 重写所有配置信息到配置文件,然后更新ctx.sentinel和zk上存储的信息。但是刚刚添加sentinel的OutOfSync属性默认为true,也就是说,此时与集

2017-09-27 17:39:50 2654

转载 Go语言并发模型:使用 context

出处: https://segmentfault.com/a/11900000067442131 简介在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的

2017-09-25 16:08:01 735

原创 navicat无法连接阿里云mysql

阿里云服务器上布了一个mysql,然后本地想要通过navicat连接,一直连接不上。后来索性本地telent阿里云服务器的3306端口,发现连不通,于是想到3306端口并没有对外开放。一开始以为是linux服务器的防火墙,不过查看了服务器的防火墙等等也都没有开。后来才知道,阿里云的服务器默认端口是不对外开放的,如果想要供外部访问,需要在安全组中手动添加规则。。。。这是个大坑啊首先创建安全组,然后再安

2017-09-04 11:29:37 25814 8

原创 Codis源码解析——Jodis

我们在java项目里面连接已经搭建好的Codis集群时,需要用到其java客户端——Jodis。这一篇我们就来看看Jodis是如何操作对Codis集群进行操作的。import io.codis.jodis.JedisResourcePool;import io.codis.jodis.RoundRobinJedisPool;import redis.clients.jedis.Jedi...

2017-09-01 18:17:03 6412 2

转载 Tomcat中更改网站根目录和默认页的配置方法

出处: http://blog.csdn.net/u011101881/article/details/375693151.tomcat原来的默认根目录是http://localhost:8080,如果想修改访问的根目录,可以这样: 找到tomcat的server.xml(在conf目录下),找到:<Host name="localhost" appBase="webapps" u

2017-09-01 11:37:33 991

转载 Java程序员修炼之道 之 Log

出处: http://www.blogjava.net/justfly/archive/2014/08/13/416925.html1. 一个最基本的例子使用Logging框架写Log基本上就三个步骤引入loggerg类和logger工厂类声明logger记录日志下面看一个例子//1. 引入slf4j接口的Logger和LoggerFactoryimport org.slf4j.Logger;im

2017-08-30 14:32:48 737

转载 Kafka+Spark Streaming+Redis实时计算整合实践

出处: http://shiyanjun.cn/archives/1097.html基于Spark通用计算平台,可以很好地扩展各种计算类型的应用,尤其是Spark提供了内建的计算库支持,像Spark Streaming、Spark SQL、MLlib、GraphX,这些内建库都提供了高级抽象,可以用非常简洁的代码实现复杂的计算逻辑、这也得益于Scala编程语言的简洁性。这里,我们基于1.3.0版本

2017-08-28 10:44:10 850

原创 Codis源码解析——sharedBackendConn

在Codis源码解析——proxy监听redis请求一篇中,我们介绍过,SharedBackendConn负责实际对redis请求进行处理。上一篇,在fillslot的过程中通过codis-server地址获取SharedBackendConn是这样用的slot.backend.bc = s.pool.primary.Retain(addr)为了弄清这个方法的实现,首先我们要搞清楚,基本原理是,从p

2017-08-17 16:25:18 1689

原创 Codis源码解析——处理slot操作(2)

这一篇我们把处理slot操作的机制讲完。还剩最后两个部分。一个是fillSlot,一个是每一个槽具体的处理方式。本例中有两个group,将之前auto-rebalance过的slot(0-511属于group1,512-1023属于group2)现在将slot 400到500移动到group2。我们之前走到了s.newProxyClient(p).FillSlots(ctx.toSlotSlice(

2017-08-16 20:40:05 2614

原创 Codis源码解析——处理slot操作(1)

上一篇我们讲了slot在集群中的分配方式,重点讲了auto-rebalance的原理。之前我们说过,再启动dashboard的时候,有一个goroutine专门用来处理slot的操作。这一篇我们就来看看slot的操作是如何进行的。我们这里举例也是用集群中有两个group和1024个从未分配的slot。首先复习一下,在slot还处于未分配状态的时候,上下文中的1024个SlotMapping如下所示。

2017-08-14 21:08:53 4015

原创 Codis源码解析——slot的分配

上一篇我们给codis集群中添加了codis-server,接下来就是把1024个slot分配给每个codis-server。Codis给我们提供了多种方式,可以将指定序号的slot移到某个group,也可以将一个group中的多少个slot移动到另一个group。不过最方便的方式就是通过自动rebalance。首先看一下Slot的结构,可以看到,每个Slot都分配了其所属的BackendAd...

2017-08-09 20:30:37 4658

原创 Codis源码解析——codis-server添加到集群

上一篇,我们成功在集群中添加了proxy。这一篇来讲讲codis-server添加到集群的过程中发生了什么。第一步,先别急着添加server,而应该是创建分组。创建分组的过程很简单,主要就是校验group的id在不在1~9999这个范围内,如果在的话(以group1为例),就调用zkClient创建路径/codis3/codis-wujiang/group/group-0001,初识创建好的时候,这

2017-08-02 17:42:10 1391

原创 Jodis报错- JedisException- Proxy list empty

先把代码贴上来import io.codis.jodis.JedisResourcePool;import io.codis.jodis.RoundRobinJedisPool;import redis.clients.jedis.Jedis;/** * @author wujiang * @version 1.0.0 * @date 2017/7/12 */public class

2017-08-01 10:29:01 7187 2

原创 Codis源码解析——proxy添加到集群

前面我们说过,proxy启动之后,会默认处于 waiting 状态,以一秒一次的频率刷新状态,监听proxy_addr 地址(默认配置文件中的19000端口),但是不会 accept 连接,通过fe或者命令行添加到集群并完成集群状态的同步,才能改变状态为online。那么,将proxy添加到集群的过程中发生了什么?这一篇我们就来看看。通过界面添加比较简单,直接输入fe的地址即可主要调用的方法在/pk

2017-07-29 17:06:35 3188

原创 Codis源码解析——fe的启动

虽然dashboard负责对集群的实际操作,但是用户的最直观操作,都是来自于fe的。这一节我们就来讲fe的启动,没有proxy和dashboard那么复杂。首先,启动的时候指定fe的监听端口,这个就是我们最后通过浏览器打开fe的端口--listen=0.0.0.0:18090然后根据系统参数找到assets文件夹目录,再在这个目录下寻找index.html,没错,就是浏览器中看到的html。如果在本

2017-07-25 15:11:24 1261

原创 Codis源码解析——dashboard的启动(2)

首先认识两个重要的structtype Future struct { sync.Mutex wait sync.WaitGroup vmap map[string]interface{}}type RedisStats struct { //储存了集群中Redis服务器的各种信息和统计数值,详见redis的info命令 Stats map[string]

2017-07-24 20:07:56 1928

原创 Codis源码解析——dashboard的启动(1)

dashboard是codis的集群管理工具,支持proxy和server的添加、删除、数据迁移,所有对集群的操作必须通过dashboard。dashboard的启动过程和proxy类似。dashboard的启动只是初始化一些必要的数据结构,复杂的在于对集群的操作,这个日后的文章会有详细的描述,本文先不管这些。启动的时候,首先读取配置文件,填充config信息。根据coordinator的信息,如果

2017-07-23 18:23:10 3558

原创 Codis proxy error : dial tcp : lookup cnsz22vla888.novalocal on 127.0.1.1:53 : no such host

笔者之前在云主机上启动codis,这次是在本地启动。dashboard,proxy,fe都成功启动之后,打开 fe 的页面,点击最左侧自己创建的product_name,却发现页面显示残缺不全再看fe的控制台日志,发现报错http : proxy error : dial tcp : lookup cnsz22vla888.novalocal on 127.0.1.1:5

2017-07-22 14:01:38 10449

原创 Codis源码解析——proxy监听redis请求

上一篇我们讲到,pkg/proxy/proxy.go的构造函数中,传入Config,返回Proxy。其中有一步是//s是Proxygo s.serveProxy()接到一个redis请求,就创建一个独立的session进行处理。这里的第一个参数是net.Conn,Conn是一个通用的面向流的网络连接,多个goroutines可以同时调用Conn的方法。这里的net.Conn就是我们之前Proxy的

2017-07-18 12:46:07 3094

原创 Codis源码解析——proxy的启动

proxy启动的时候,首先检查输入的命令行,一般情况下,启动proxy的命令如下:nohup ./bin/codis-proxy --ncpu=2 --config=./conf/proxy.conf --log=./logs/proxy.log --log-level=WARN &程序会解析这行命令参数,下面举个例子(实例代码是cmd/proxy/main.go),有关于go的并行,这里要特别说明

2017-07-17 21:28:27 4641

转载 Netty版本升级血泪史之线程篇

原文: http://www.infoq.com/cn/articles/netty-version-upgrade-history-thread-part/1.1. Netty 3.X系列版本现状根据对Netty社区部分用户的调查,结合Netty在其它开源项目中的使用情况,我们可以看出目前Netty商用的主流版本集中在3.X和4.X上,其中以Netty 3.X系列版本使用最为广泛。Netty社区

2017-07-16 21:58:59 755

转载 java调试技能之dubbo调试 ---telnet

原文出处: http://www.cnblogs.com/yougewe/p/6673845.html  dubbo作为一个远程调用框架,虽与同类型的框架,不知道谁优谁劣,但是就公司层面使用来说,还是很棒的。这里简单的写一下怎么使用和调试技巧,就算是作个使用总结吧,供快速使用和问题解决!  dubbo是基于spring做配置使用的,虽也提供其他方法,但是比较麻烦,所以使用spring还是有好处的吧

2017-07-10 14:35:29 2115

转载 Executor, ExecutorService 和 Executors 间的不同

出处: https://yemengying.com/2017/03/17/difference-between-executor-executorService/java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 这三者均是 Java Execut

2017-06-19 10:41:54 912

转载 Netty 超时机制及心跳程序实现

出处: http://waylau.com/netty-time-out-and-heartbeat/本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接。Netty 超时机制的介绍Netty 的超时类型 IdleState 主要分为:ALL_IDLE : 一段时间内没有数据接收或者发送READER_IDLE : 一段时间内没有数据接收WRITER_IDLE :

2017-06-11 14:52:21 1105

转载 epoll浅析以及nio中的Selector

出处: https://my.oschina.net/hosee/blog/730598首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference):首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。不管是文件,还是套接字,还是管道,我们都可以把他们看作流。之后我们来讨论I/O的操作,通过read,我

2017-06-11 14:12:20 613

转载 写给后端程序员的 HTTP 缓存原理介绍

出处: www.cnblogs.com/xinzhao/p/5099807.html通过Internet获取资源既缓慢,成本又高。为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存和重用以前获取的资源,从而优化性能,提升体验。虽然Http中关于缓存控制的部分,随着协议演进,有一些变化。但我觉着,作为后端程序员,在开发Web服务时,只需要关注请求头If-None-Match、

2017-06-05 09:03:01 550

转载 Java CompletableFuture 详解

出处: http://colobu.com/2016/02/29/Java-CompletableFuture/Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不

2017-05-21 21:40:22 2632

maven-3.5.0

apache-maven 3.5.0,通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。

2017-09-01

空空如也

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

TA关注的人

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