自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rickiyang的博客

欢迎关注个人博客:http://blog.rickiyang.cn

原创 Netty 中的心跳检测机制

心跳检测一般存在于建立长连接 或者 需要保活的场景。心跳的使用场景长连接的应用场景非常的广泛,比如监控系统,IM系统,即时报价系统,推送服务等等。像这些场景都是比较注重实时性,如果每次发送数据都要进行一次DNS解析,建立连接的过程肯定是极其影响体验。而长连接的维护必然需要一套机制来控制。比如 HTTP/1.0 通过在 header 头中添加 Connection:Keep-Alive参数,如果当前请求需要保活则添加该参数作为标识,否则服务端就不会保持该连接的状态,发送完数据之后就关闭连接。HTTP/1

2020-05-24 17:02:19 112

原创 Netty 中的 handler 和 Pipeline

上一节我们讲了 Netty 的启动流程,从启动流程入手分析了 Reactor 模型的第一步:channel 如何绑定 Selector。然后讲到了 EventLoop 在启动的时候发挥了什么作用。整个启动类我们从头到尾过了一遍,今天我们来解决上节遗留的问题:Selector 如何将请求交给对应的 handler处理。1. handler 的初始化还是先从启动类入手:ServerBootstrap server = new ServerBootstrap().group(bossGroup,workGr

2020-05-23 10:36:13 67

原创 Netty hello world 入门源码分析

第一节简单提了什么是网络编程,Netty 做了什么,Netty 都有哪些功能组件。这一节就具体进入 Netty 的世界,我们从用 Netty 的功能实现基本的网络通信开始分析 各个组件的使用。1. 一个简单的发送接收消息的例子话不多说,先来实现一个发送接收消息的例子。本实例基于 SpringBoot 工程搭建。项目类文件如下:客户端和服务端的主要代码分为3个部分:启动器,ChannelInitializer,eventHandler。相关代码已经上传 GitHub,请参阅:点我 (๑¯ ³ ¯๑

2020-05-20 13:25:48 61

原创 Netty 简介

很早以前其实就写过关于 Netty 的使用,最近发现在CSDN上一直有人在看很早写的 Netty 文章,个人感觉那时候写的很粗糙,怕影响同行的阅读质量,但是我也不知道为啥有这么多小伙伴关注Netty,所以决定重新写一些关于Netty的文章,补充以前的不足吧。Netty能做啥简单说就是用来处理网络编程,写一款能进行网络通信的服务端和客户端程序。如果没有 Netty,在 Java 的世界中如何处理网络编程呢?Java自带的工具有:java.net 包,用于处理网络通信,后面Java提供了 NIO 工具包

2020-05-19 23:06:56 100

原创 如何实现一个短链接系统

短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。大家经常会收到一些莫名的营销短信,里面有一个非常短的链接让你跳转。新浪微博因为限制字数,所以也会经常见到这种看着不像网址的网址。短链的兴起应该就是微博限制字数激起了大家的创造力。如果创建一个短链系统,我们应该做什么呢?将长链接变为短链;用户访问短链接,会跳转到正确的长链接上去。查找到对应的长网址,并跳...

2020-01-10 23:26:55 187

原创 微服务全流程分析

转眼已经2020,距离微服务这个词落地已经过去好多年!(我记得2017年就听过这个词)。然而今天我想想什么是微服务,其实并没有一个很好的定义。为什么这样说,按照微服务的定义:微服务架构就是将一个庞大的业务系统按照业务模块拆分成若干个独立的子系统,每个子系统都是一个独立的应用,它是一种将应用构建成一系列按业务领域划分模块的,小的自治服务的软件架构方式,倡导将复杂的单体应用拆分成若干个功能单一、松...

2020-01-05 17:32:29 310

原创 Spring Cloud Zuul 精进

接着上一篇继续讲Zuul,上一篇搭建了Zuul的环境简单说明了怎么使用,本篇查缺补漏将一些常用的配置贴出来。文末我们会一起分析一下Zuul的源码,升华一下本篇的格调!忽略所有微服务或某些微服务默认情况下,只要引入了zuul后,就会自动一个默认的路由配置,但有些时候我们可能不想要默认的路由配置规则,想自己进行定义,忽略所有微服务:(后面写 * ):zuul: ignored-servi...

2019-12-22 19:33:09 91

原创 Spring Cloud Zuul 概览

什么是API网关网关这个词其实是一个硬件概念。因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起。在家庭网络 和小型企业中,宽带路由器通常充当网络网关。它将你家中或企业的设备与 Internet 连接。网关是路由器的最重要功能,路由器是最常见的网关类型。今天我们要讲的网关并非是路由器(开个玩笑),既然做应用开发自然讨论的是调用各个服务的入口-API,所...

2019-12-17 23:49:18 61

原创 Java 中的Lambda表达式

Java 目前已经出到13的版本,但是国内大部分公司应该都停留在 Java 8 的版本(不敢承担升级带来的风险)。在Java8中给我们带来了 Lambda表达式和Stream流式操作,提供了函数式编程和简化批处理操作。可能大家日常使用很多,但是很少去关注Lambda 和 Stream实现。本篇就带着大家一起关注这两块知识,搬好小板凳我们一起看电视。什么是Lambda简单来说,编程中提到的 la...

2019-12-17 00:18:05 57

原创 VIM命令速查表

今天整理一份 VIM 常用命令速查表,当做给自己备忘。进入VIM 相关命令描述vim filename打开或者新建文件vim +n filename打开文件并将光标置于第n行行首vim + filename打开文件并将光标置于最后一行行首vim +/pattern filename打开文件并将光标置于第一个与pattern匹配的子串处vim ...

2019-12-08 10:01:58 51

原创 Spring 中的事件机制

说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作。这些listener是怎么实现的呢?说listener之前,我们先从设计模式开始讲起。观察者模式观察者模式一般包含以下几个对象:Subject:被观察的对象。它提供一系列方法来增加和删除观察者对象,同时它定义了通知方...

2019-12-07 11:23:56 41

原创 Spring Cloud 学习--Hystrix应用

上一篇介绍了Hystrix基本功能和单独使用的方式,今天继续学习如何将Hystrix融入SpringCloud组件中去。在Ribbon上使用熔断器在 pom.xml 文件中引入 hystrix 的 依赖spring-cloud-starter-hystrix:<dependency> <groupId>org.springframework.cloud</...

2019-12-02 20:48:40 49

原创 Spring Cloud 学习 -- Hystrix基本原理

本篇学习Spring Cloud家族中的重要成员:Hystrix。分布式系统中一个服务可能依赖着很多其他服务,在高并发的场景下,如何保证依赖的某些服务如果出了问题不会导致主服务宕机这个问题就会变得异常重要。针对这个问题直观想到的解决方案就是做依赖隔离。将不同的依赖分配到不同的调用链中,某一条链发生失败不会影响别的链。今天要说的Hystrix就提供了这样的功能。Hystrix的作用就是处理服务依赖...

2019-11-13 21:24:17 50

原创 Spring Cloud Feign 调用过程分析

前面已经学习了两个Spring Cloud 组件:Eureka:实现服务注册功能;Ribbon:提供基于RestTemplate的HTTP客户端并且支持服务负载均衡功能。通过这两个组件我们暂时可以完成服务注册和可配置负载均衡的服务调用。今天我们要学习的是Feign,那么Feign解决了什么问题呢?相对于Eureka,Ribbon来说,Feign的地位好像不是那么重要,Feign是一个声...

2019-11-05 09:37:33 473

原创 Spring Cloud Ribbon 源码分析---负载均衡算法

上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现。负载均衡整体是从IRule进去的:public interface IRule{ /* * choose one alive server from lb.allServers or * lb.upServers according to key *...

2019-10-19 14:07:56 51

原创 Spring Cloud Ribbon源码分析---负载均衡实现

上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用。这一篇我们来分析Ribbon实现负载均衡的过程。从 @LoadBalanced入手还记得前面配置 RestTemplate:@Bean@LoadBalancedRestTemplate restTemplate() { return new RestTemplate()...

2019-10-15 00:01:25 38

原创 Spring Cloud Ribbon---微服务调用和客户端负载均衡

前面分析了Eureka的使用,作为服务注册中心,Eureka 分为 Server 端和 Client 端,Client 端作为服务的提供者,将自己注册到 Server 端,Client端高可用的方式是使用多机部署然后注册到Server,Server端为了保证服务的高可用,也可以使用多机部署的方式。前面简单搭建了Eureka Client 和 Server,然后将Client成功注册到 Server...

2019-10-09 23:39:22 48

原创 Spring Cloud Eureka配置文件详解

本篇内容用来说明Eureka 常用配置的含义。以下配置都是以 eureka.server 开头:参数描述备注eureka.server.eviction-interval-timer-in-msserver清理无效节点的时间间隔默认60秒eureka.server.enable-self-preservation是否开启自我保护,默认truetrue fal...

2019-10-04 15:54:54 253

原创 Spring Cloud Eureka源码分析 --- client 注册流程

Eureka Client 是一个Java 客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒),如果Eureka Server在多个心跳周期没有收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Cl...

2019-10-04 13:09:43 118

原创 Spring Cloud Eureka源码分析---服务注册

本篇我们着重分析Eureka服务端的逻辑实现,主要涉及到服务的注册流程分析。在Eureka的服务治理中,会涉及到下面一些概念:服务注册:Eureka Client会通过发送REST请求的方式向Eureka Server注册自己的服务,提供自身的元数据,比如 IP 地址、端口、运行状况指标的URL、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个Conc...

2019-10-01 21:52:11 139

原创 Spring cloud-Eureka入门之旅

Spring Cloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、路由配置、分布式链路追踪、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟SpringBoot框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。1. 重要组件说明这里的说明借用网上一个很酷的分类方式来说明:润物无声类和独挑大梁类。...

2019-09-24 19:26:09 157

原创 Java SPI机制分析

SPI 全称为(Service Provider Interface),是 JDK 内置的一种服务发现机制。它可以动态的为某个接口寻找服务实现,有点类似 IOC(Inversion of Control)的思想,将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。使用 SPI 机制需要在 classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,...

2019-09-15 11:27:52 46

原创 加解密算法分析

日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全;HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输;使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术。很多时候我们对于什么时候要使用什么样的加解密方式是很懵的。因为可用的加解密方案实在是太多,大家对...

2019-09-14 21:46:10 87

原创 Java类加载器和加载机制

类加载器负责在运行时将Java类动态加载到JVM(Java虚拟机)。此外,它们是JRE(Java运行时环境)的一部分。因此,由于类加载器,JVM不需要知道底层文件或文件系统以运行Java程序。此外,这些Java类不会同时加载到内存中,而是在应用程序需要时。这就是类加载器的用武之地,他们负责将类加载到内存中。1. 类加载器的层级结构让我们首先学习如何使用各种类加载器使用,一个简单示例加载不同的...

2019-09-10 13:26:08 63

原创 javaagent使用指南

今天打算写一下 Javaagent,一开始我对它的概念也比较陌生,后来在别人口中听到 字节码插桩,bTrace,Arthas后面才逐渐了解到Java还提供了这么个工具。JVM启动前静态InstrumentJavaagent 是什么?Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:这个 jar 包的 MA...

2019-08-17 14:59:59 487

原创 javassist使用全解析

Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同时也可以去生成一个新的类对象,通过完全手动的方式。1. 使用 Javassist 创建一个 class 文件首先...

2019-08-11 19:22:36 223

原创 Java中的魔法类-Unsafe

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但是,这个类的作者不希望我们使用它,因为我们虽然我们获取到了对底层的控制权,但是也增大了风险,安全性正是Java相对于C++/C的优势。因为该类在sun.misc包下,默认是...

2019-08-11 14:12:36 64

原创 分布式任务调度-Elastic-Job

Java 定时任务框架对比quartz 和 Elastic-Job1.quartz:quartz 的常见集群方案如下,通过在数据库中配置定时器信息, 以数据库悲观锁的方式达到同一个任务始终只有一个节点在运行。优点:保证节点高可用 (HA), 如果某一个节点挂了, 其他节点可以顶上;缺点:同一个任务只能有一个节点运行,其他节点将不执行任务,性能低,资源浪费;当碰到大量短任务时...

2019-06-28 17:18:29 657

原创 Shell 语法指南

1. 简介1.1. 什么是 shellShell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图...

2019-06-20 23:30:29 496

原创 Gin框架日常使用--高频api使用示例

Go web框架目前有很多,Beego,Gin,Iris,Revel等等。目前国内使用量比较多的是前两个,鉴于Beego的源码一直被人吐槽并且Beego使用起来太过于臃肿,框架本身构造的大而全,很多功能不一定会是你想要的这些原因,我们着重关注Gin框架的使用。Gin没有像Beego那样什么都做,它只专注于web请求的封装,如果你想做缓存,想连接数据库等等还需要使用别的框架或者使用原生的API。G...

2019-06-16 23:03:02 1594

原创 Caffeine Cache-高性能Java本地缓存组件

前面刚说到Guava Cache,他的优点是封装了get,put操作;提供线程安全的缓存操作;提供过期策略;提供回收策略;缓存监控。当缓存的数据超过最大值时,使用LRU算法替换。这一篇我们将要谈到一个新的本地缓存框架:Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache,借着他的思想优化了算法发展而来。本篇博文主要介绍Caffine Cache 的使用方式,以及Caffi...

2019-06-15 19:26:17 850

原创 Guava cache使用总结

缓存分为本地缓存和远端缓存。常见的远端缓存有Redis,MongoDB;本地缓存一般使用map的方式保存在本地内存中。一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。如果访问量大,我们还得兼顾本地缓存的线程安全问题。必要的时候也要考虑缓存的回收策略。今天说的...

2019-06-13 00:33:38 972

原创 MySQL一键生成实体文件的神器-ginbro

Java转过来的同学对Mybatis的使用肯定不陌生,特别是对一堆表去生成相应的dao和entity的时候使用Mybatis generator所带来的感触,无比深刻。前面我们也讲过原生的数据库使用,讲过gorm的使用,无论是原生的还是第三方的数据库工具,都是需要我们手动的写struct和相应的CRUD的。今天说的这一款插件跟Java中的Mybatis generator一样,都是能帮我们简化表与...

2019-06-11 21:19:45 260

原创 Viper-Go一站式配置管理工具

什么是ViperViper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:设置默认值从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据可以监视配置文件的变动、重新读取配置文件从环境变量中读取配置数据从远端配置系统中读取数据,并监视它们(比如etcd、Consul)从命令参数中读物配置从buffer中读取调...

2019-06-07 00:09:09 274

原创 Go orm框架gorm学习

之前咱们学习过原生的Go连接MYSQL的方法,使用Go自带的"database/sql"数据库连接api,"github.com/go-sql-driver/mysql"MYSQL驱动,通过比较原生的写法去写sql和处理事务。目前开源界也有很多封装好的orm操作框架,帮我们简省一些重复的操作,提高代码可读性。gorm就是这样的一款作品,我们来学习一下gorm的操作流程。安装go get -u ...

2019-06-05 14:00:44 1764

原创 Storm初识(1)

在Storm集群中,有两类节点:主节点 master node 和工作节点 worker nodes。主节点运行着一个叫做Nimbus的守护进程。这个守护进程负责在集群中分发代码,为工作节点分配任务,并监控故障。Supervisor守护进程作为拓扑的一部分运行在工作节点上。一个Storm拓扑结构在不同的机器上运行着众多的工作节点。因为Storm在Zookeeper或本地磁盘上维持所有的集群状...

2019-05-27 23:12:45 52

原创 Go中的日志及第三方日志包logrus

有别的语言使用基础的同学工作中都会接触到日志的使用,Go中自然也有log相关的实现。Go log模块主要提供了3类接口,分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了三种调用方式,分别是 “Xxxx 、Xxxxln 、Xxxxf”,基本和fmt中的相关函数类似。1. Go中的log包1. 基本使用log.Print:打印日志,和fmt包没什么区别,只是加上了上面...

2019-05-26 15:36:54 1185

原创 Go中的异常处理

1. errors包Go 有一个预先定义的 error 接口类型 :type error interface { Error() string}错误值用来表示异常状态。Go也提供了一个包:errors,errors 包中有一个 errorString 结构体实现了 error 接口 。任何时候当你需要一个新的错误类型,都可以用 errors包的 errors.New...

2019-05-23 22:00:09 159

原创 新手必须掌握的Linux命令

1. 常用系统命令1.echo命令echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。[hadoop@hadoopmaster ~]$ echo $JAVA_HOME/usr/local/jdk[hadoop@hadoopmaster ~]$ echo 'aaaa'aaaa2.date命令date命令用于显示及设置系统的时间或日期,格式为...

2019-05-22 23:21:59 462

原创 Go中sync包学习

前面刚讲到goroutine和channel,通过goroutine启动一个协程,通过channel的方式在多个goroutine中传递消息来保证并发安全。今天我们来学习sync包,这个包是Go提供的基础包,提供了锁的支持。但是Go官方给的建议是:不要以共享内存的方式来通信,而是要以通信的手段来共享内存。所以他们是提倡使用channel的方式来实现并发控制。学过Java的同学对锁的概念肯定不陌生...

2019-05-20 23:51:19 77

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