搬砖小弟
2019-11-04

是由Netflix开源的基于REST的服务治理组件,包含了eureka server 和eureka client。从2012年9月在GitHub上发布1.1.2版本以来,至今已经发布了231次,最新版本为2018年8月份发布的1.9.4版本。期间有进行2.x版本的开发,不过由于各种原因内部已经冻结开发,目前还是以1.x版本为主。Spring Cloud Netflix Eureka是Pivotal公司为了将Netflix Eureka整合于Spring Cloud生态系统提供的版本。

Eureka快速入门

Eureka Server

  1. 引入依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
  2. 主应用类上添加**@EnableEurekaServer**

  3. 配置eureka

    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          defaultZone: ${EUREKA_SERVER_ADDRESS:http://localhost:8761/eureka/}
      server:
        peer-node-read-timeout-ms: 5000
    
  4. 启动

    ![image-20191024165113212](Spring Cloud - 服务注册中心eureka/image-20191024165113212.png)

Eureka Client

  1. 引入客户端依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
  2. 主应用类添加**@EnableDiscoveryClient**

  3. 配置

    eureka:
      instance:
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: ${EUREKA_SERVER_ADDRESS:http://localhost:8761/eureka/}
    
  4. 启动客户端

2019-08-30

author: caijunhui
date: 2019-08-29


本文介绍如何在k8s环境下部署rabbitmq

镜像使用rabbitmq:3.7-management-alpine,从3.7.0开始rabbitmq使用了peer discovery, 不使用autoscale。

2019-08-28

想要k8s中使用nfs来动态提供PersistentVolume,so查下怎么搭建nfs server.
环境:
centos 7

2019-08-06

Maven 参数设置

  • 使用参数-Dmaven.test.skip=true
  • 在pom.xml中定义参数
    <properties> <maven.test.skip>true</maven.test.skip> </properties>
2019-08-06

Pod

Pod是一个或多个若干相关容器的组合,Pod包含的容器运行在同一台宿主机上,这些容器使用相同的网络命名空间、IP地址和端口,相互之间能通过localhost来发现和通信。另外,这些容器还可共享一块存储卷空间。在Kubernetes中创建、调度和管理的最小单位是Pod,而不是容器,Pod通过提供更高层次的抽象,提供了更加灵活的部署和管理模式。

Pod是Kubernetes的基本操作单元,也是应用运行的载体。

Pod是容器的集合,容器是真正的执行体。相比原生的容器接口,Pod提供了更高层次的抽象,但是Pod的设计并不是为了运行同一个应用的多个实例,而是运行一个应用多个紧密联系的程序。而每个程序运行在单独的容器中,以Pod的形式组合成一个应用。

Replication Controller

Replication Controller用来控制管理Pod副本(Replica,或者称为实例),Replication Controller确保任何时候Kubernetes集群中有指定数量的Pod副本在运行。如果少于指定数量的Pod副本,Replication Controller会启动新的Pod副本,反之会杀死多余的副本以保证数量不变。另外,Replication Controller是弹性伸缩、滚动升级的实现核心。

注:官方建议使用Deployment代替

Service

Service是真实应用服务的抽象,定义了Pod的逻辑集合和访问这个Pod集合的策略。Service将代理Pod对外表现为一个单一访问接口,外部不需要了解后端Pod如何运行,这给扩展和维护带来很多好处,提供了一套简化的服务代理和发现机制。

Label

Label是用于区分Pod、Service、Replication Controller的Key/Value对,实际上,Kubernetes中的任意API对象都可以通过Label进行标识。每个API对象可以有多个Label,但是每个Label的Key只能对应一个Value。Label是Service和Replication Controller运行的基础,它们都通过Label来关联Pod.

Master

Kubernetes里的Master指的是集群控制节点,每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都是发给它,它来负责具体的执行过程.

在Master运行的组件有:

  • kube-apiserver, 提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程.
  • etcd, 强一致性高可用的key-value存储系统,kubernetes用来存储集群的数据。
  • Kube-scheduler,负责资源调度(Pod调度)的进程,为新建的Pod分配Node。
  • Kube-controller-manager,Kubernetes里所有资源对象的自动化控制中心,负责执行各种控制器。

Node

Kubernetes属于主从分布式集群架构,Kubernetes Node(简称为Node,早期版本叫作Minion)运行并管理容器。Node作为Kubernetes的操作单元,用来分配给Pod(或者说容器)进行绑定,Pod最终运行在Node上,Node可以认为是Pod的宿主机。

Node节点上运行的组件有:

  • kubelet, 负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
  • Kube-proxy, 实现Kubernetes Service的通信与负载均衡机制的重要组件。
  • container runtime, 负责运行容器。
2019-07-20

SpringBoot应用启动类一般如下:

@SpringBootApplication
public class SampleRabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleRabbitmqApplication.class, args);
    }

}

@SpringBootApplication

@SpringBootApplication这个组合注解包含了三个注解 :

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration实际上应用@Configuration, 任何注解了Configuration了java类都是一个JavaConfig配置类。
@ComponentScan的功能是自动扫描并加载符合条件的组件(如@Component和@Repository),最终将这些bean加载IoC容器中。
@EnableAutoConfiguration借助@Import收集和注册特定场景相关的bean定义。

2019-07-18

按redis官网编译的redis, 可执行文件会与源码在一起, 如果想编译纯净版可按下边的步骤。

2019-07-18

众如周知,Redis中keys pattern命令可以返回大量数据。
非生产环境可以结合linux的管道删除相同pattern的key.

redis-cli keys "*" | xargs redis-cli del

但是生产环境一般keys会被重命名禁止在生产使用。
这时可以使用scan命令删除。

2019-07-18

缓存穿透

什么是缓存穿透?
缓存穿透是指查询一个一定不在缓存中存在的key. 由于key不存在,每次都会去查询数据库,如果对于这个key的请求很多的话,可能会把数据库搞垮。

解决方案:

  1. 布隆过滤器
  2. 将查询数据库的空结果也缓存起来,设置一个较短的过期时间。

缓存雪崩

什么是缓存雪崩?
对于多个key的查询,全部请求都走数据库了。有两种情况:一种是redis挂掉,别一个情况是一段时间内那些key都失效了。
对于第一种情况要保证redis的的高可性,对于第二种情况可以为key设置不同的随随机过期时间。

缓存数据一致性

  1. 写数据库也写缓存,保证了数据一致性;但是难保证数据库与redis的事务
  2. 写数据库,直接删缓存;读缓存发现没有,从数据库读取并保存缓存;带来问题是并发问题。
  3. 应该根据不同的业务,来处理缓存的生成。
2019-07-18
  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据,返回错误
2019-07-17

Vagrant是用来管理虚拟机的,如VirtualBox、VMware、AWS等,主要好处是可以提供一个可配置、可移植和复用的软件环境,可以使用shell、chef、puppet等工具部署。所以vagrant不能单独使用,如果你用它来管理自己的开发环境的话,必须在自己的电脑里安装了虚拟机软件,我使用的是virtualbox。

Vagrant提供一个命令行工具vagrant,通过这个命令行工具可以直接启动一个虚拟机,当然你需要提前定义一个Vagrantfile文件,这有点类似Dockerfile之于docker了。

跟docker类比这来看vagrant就比较好理解了,vagrant也是用来提供一致性环境的,vagrant本身也提供一个镜像源,使用vagrant init hashicorp/precise64就可以初始化一个Ubuntu 12.04的镜像。

2019-07-14

AbstractQueuedSynchronizer, 简称AQS, 是Java 并发包的基础类,并发包中的很多api都是基于AQS来实现加锁与释放锁等功能。

例如ReentrantLock内部拥有一个继承于AbstractQueuedSynchronizer的Sync类实现加锁与释放锁。
AQS内部有一个state状态记录当前线程的加锁次数,还有一个exclusiveOwnerThread变量记录了独占的线程。

2019-07-13

造成该问题的原因?
Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(由于Ribbon是懒加载的,在首次请求时,才会开始初始化相关类),这个响应时间可能就大于1秒了。

2019-07-08

ThreadPoolExecutor的重要参数

  • corePoolSize:核心线程数
    核心线程会一直存活,及时没有任务需要执行
    当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理
    设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
  • queueCapacity:任务队列容量(阻塞队列)
    当核心线程数达到最大时,新任务会放在队列中排队等待执行
  • maxPoolSize:最大线程数
    当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务
    当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
  • keepAliveTime:线程空闲时间
    当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
    如果allowCoreThreadTimeout=true,则会直到线程数量=0
  • allowCoreThreadTimeout:允许核心线程超时
  • rejectedExecutionHandler:任务拒绝处理器
    两种情况会拒绝处理任务:
    当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
    当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务
    线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常
    ThreadPoolExecutor类有几个内部实现类来处理这类情况:
    AbortPolicy 丢弃任务,抛运行时异常
    CallerRunsPolicy 执行任务
    DiscardPolicy 忽视,什么都不会发生
    DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务
    实现RejectedExecutionHandler接口,可自定义处理器
2019-07-06

kafka中用topic表示同类的消息,topic可以有1个或多个partition.
kafka集群中一个broker负责一部分partition,在kafka集群中,每个Partition都有多个副本,其中一个副本叫做leader,其他的副本叫做follower。

2019-07-03

搬砖自 https://mp.weixin.qq.com/s/DTzd3jdtnnveffL-zcpmyg

前言
Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。

本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。

2019-07-01

原文链接:https://blog.csdn.net/fenglibing/article/details/91565912

HashMap的类图

HashMap是Java开发当中使用得非常多的一种数据结构,因为其可以快速的定位到需要查找到数据,其最快的速度可以达到O(1),最差的时候也可以达到O(n)。本文以Java8中的HashMap做为分析原型,因为不同的JDK版本中的HashMap,可能存在着底层实现上的不一样。

2019-06-30

定义

Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦,使得两者可以独立地变化。)

UML

2019-06-30

定义

Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。)

UML

2019-06-30

定义

Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。)

UML

2019-06-30

定义

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。)

UML

2019-06-30

定义

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. (封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。)

UML

2019-06-30

定义

Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)

UML

2019-06-30

定义

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。)

UML图

2019-06-30

定义

Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

UML

2019-06-30

定义

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)

UML

2019-06-30

定义

Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)

UML图

2019-06-30

定义

Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

UML

2019-06-30

定义

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

UML

2019-06-30

定义

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)

UML

2019-06-30

定义

命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

UML

2019-06-24

定义

中介者模式的定义为:Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。)

UML

2019-06-24

定义

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

UML

2019-06-24

定义

Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。)

UML

2019-06-24

定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

UML

2019-06-24

定义

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)

UML

2019-06-24

定义

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)

UML类图

2019-06-24

定义

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

UML

IMAGE
2019-06-24

Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

类图