服务治理中间件之版本策略

在部署服务并向不同的客户端提供服务时,我们会涉及到一个版本的策略问题。

其核心内容是在多版本的情况下如何协调和制约不同版本的服务器和客户端: 如何规范版本之间的选择问题,当实现和接口发生变化时版本应该如何演进。

在本文中,我们将介绍业界常见的几种版本策略,我们面对的需求,以及我们最终在dolphin项目中选择的策略。然后会详尽的介绍该版本策略的实现细节和使用方式。

查看更多

基础架构及中间件体系概述

摘要: 本文主要是记录自己对基础架构职责和中间件技术体系理解的,渐进式理解记录。

一.基础架构职责

  • 设计和开发新一代的基础组件,为重构项目提供技术平台
  • 设计和构建统一的应用开发框架,提高应用开发效率和质量
  • 建立统一的应用构建标准,为实现对应用的管理,监控和治理的自动化建立基础
  • 评估和引进各种国外先进技术,提高公司平台的技术水准
  • 建立公司的开源项目,对内部开发的含金量高的项目实现开源,以提高公司的知名度

查看更多

使用Java Signal将应用程序从LVS中摘除

摘要:本文主要介绍了,如何使用Java Signal和SignalHandler实现,通过Linux 命令实现kill -s BUS pid和kill -s USR2 pid实现不kill应用进程,把应用程序从LVS中摘除。而不是通过Reset 请求调用。由于只允许本机操作,所以可选方案三种:1.reset 调用更改Status,2.Linux 信号量传递给Java程序 3.配置中心或者XX管理系统后台权限管理,调用reset服务。从安全性和快速解决需求的角度考虑使用Linux 信号量传递给Java程序方案。

Java Signal 概述

信号简介

信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。通俗来讲,信号就是进程间的一种异步通信机制。
典型的例子:kill -s SIGKILL pid (即kill -9 pid) 立即杀死指定pid的进程。
在上面这个例子中,SIGKILL就是往pid进程发送的信号。

查看更多

Spring Cloud Eureka服务注册源码分析

摘要:在上一篇中,介绍了Eureka的相关的知识,解释了Eureka为什么适合做服务发现和注册。接下来,在本篇文章将通过源码分析的方式,看一下Eureka是怎么work的。本章主要介绍Eureka的服务注册。那eureka client如何将本地服务的注册信息发送到远端的注册服务器eureka server上。通过下面的源码分析,看出Eureka Client的定时任务调用Eureka Server的REST接口,而Eureka接收到调用请求后会处理服务的注册以及Eureka Server中的数据同步的问题。

服务注册

服务注册,想必大家并不陌生,就是服务提供者启动的时候,把自己提供的服务信息,例如 服务名,IP,端口号,版本号等信息注册到注册中心,比如注册到ZK中。那eureka client如何将本地服务的注册信息发送到远端的注册服务器eureka server上。通过下面的源码分析,看出服务注册可以认为是Eureka client自己完成,不需要服务本身来关心。

Eureka Client的定时任务调用Eureka Server的提供接口

实现思路其实也挺简单,在com.netflix.discovery.DiscoveryClient启动的时候,会初始化一个定时任务,定时的把本地的服务配置信息,即需要注册到远端的服务信息自动刷新到注册服务器上。
首先看一下Eureka的代码,在spring-cloud-netflix-eureka-server工程中可以找到这个依赖eureka-client-1.4.11.jar查看代码可以看到,
com.netflix.discovery.DiscoveryClient.java中的1240行可以看到Initializes all scheduled tasks,在1277行,可以看到InstanceInfoReplicator定时任务。

查看更多

Spring Cloud Netflix之Eureka下篇原理

摘要:本文主要介绍Eureka的工作原理,Eureka 组件分为两部分:Eureka serverEureka client。而客户端又分为 Application Service 客户端Application Client 客户端两种。Eureka 的工作机制每个 region 都有自己的 Eureka 服务器集群,每个 zone 至少要有一个 Eureka 服务器以应对 zone 瘫痪。

查看更多

Spring Cloud Netflix之Eureka上篇

前言:Spring Cloud NetFlix这个项目对NetFlix中一些久经考验靠谱的服务发现,熔断,网关,智能路由,以及负载均衡等做了封装,并通过注解的或简单配置的方式提供给Spring Cloud用户用。本文主要介绍 Spring Cloud中的Eureka组件。由于Spring Cloud做技术选型时中立的,因此Spring Cloud也提供了Spring Cloud Zookeeper,Spring Cloud Consul用于服务治理或服务发现供大家选择使用,另外我还发现Spring Cloud etcd这个项目,也可以用于服务注册和发现

查看更多

Spring Cloud Sleuth-全链路监控调研

前言:做过软件开发的都知道,对系统进行全链路的监控是非常有必要的。在单体应用中,传统的方式是软件开发者,通过自定义日志的level,日志文件的方式记录单体应用的运行日志。从而排查线上系统出现运行过慢,出现故障,异常等问题,但是在微服务架构或分布式系统中,一个系统被拆分成了A、B、C、D、E等多个服务,而每个服务可能又有多个实例组成集群,采用上诉定位问题的方式就行不通了,你充其量就知道某个服务是应用的瓶颈,但中间发生了什么你完全不知道。而且问题的查询,因为有海量各种各样的日志等文件,导致追溯定位问题等极其不方便。因此需要全链路监控系统的收集,上报,对海量日志实时计算生成,监控告警,视图报表,帮助开发人员快速定位问题

服务追踪分析

一个由微服务构成的应用系统由N个服务实例组成,通过REST请求或者RPC协议等来通讯完成一个业务流程的调用。对于入口的一个调用可能需要有多个后台服务协同完成,链路上任何一个调用超时出错都可能造成前端请求的失败。服务的调用链也会越来越长,并形成一个树形的调用链。如下图所示:
调用链

查看更多

什么是Spring Cloud Config?

前言:在单体应用中,我们一般的做法是把Property和Code放在一起,没有什么问题。但是在分布式系统中,由于存在多个服务实例,需要分别管理到每个具体的服务工程中的配置,上线需要准备check list 并逐个检查每个上线的服务是否正确。在系统上线之后修改某个配置,需要重启服务。这样开发就相当麻烦。因此我们急需需要把分布式系统中的配置信息抽取出来统一管理,服务获取系统信息时有一个覆盖顺序:property–> Evn—->配置中心。这样修改环境变量或者修改配置中心的配置就能取到最新的配置信息。在唯品会 Venus Framework中我们专门设计了这个功能。Spring cloud出现之后,避免了大家重复造轮子。

什么是 Spring Cloud Config ?

其官方文档中对自己的定义是如下,官网连接:Spring Cloud Config

Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system.
With the Config Server you have a central place to manage external properties for applications across all environments.

简单来说,Spring Cloud Config就是我们通常意义上的配置中心 - 把应用原本放在本地文件的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。

查看更多

Spring Cloud微服务框架主要子项目和RPC框架的对比

 摘要:Spring Cloud是一个相对比较新的微服务框架,今年(2016)推出1.0的release版本,目前Github上更新速度很快. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。spring cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用.它们将在任何分布式环境中工作,包括开发人员自己的笔记本电脑,裸物理机的数据中心,和像Cloud Foundry云管理平台。在未来引领这微服务架构的发展,提供业界标准的一套微服务架构解决方案。

查看更多

Jdk的万能配置

 java是通过java虚拟机来解释运行的,也就是通过java命令; javac编译生成的.class文件就是虚拟机要执行的代码, 称之为字节码(bytecode),虚拟机通过classloader来装载这些字节码,也就是通常意义上的类.这里就有一个问题,classloader从哪里知道java本身的类库及用户自己的类在什么地方呢?或者有着缺省值(当前路径).或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath),或者在运行的时候传参数给虚拟机.
通过这段文字,你就知道,为什么javac编译通过了,但是java命令却出错(类定义没找到)的原因了。
就是环境变量classpath(类路径)没有设置正确,使得JAVA虚拟机的classloader无法找到类来执行目标程序

查看更多