Spring Cloud Eureka

服务治理

服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。
在微服务架构体系中,每个服务都是相对独立的,包括其部署、扩展和升级,都不应和其他服务产生耦合。但是微服务之间是无法避免业务关系的,也就是说服务之间需要互相调用。对于Restful接口而言,服务A要调用服务B的接口,必须知道具体的url,这样服务A就必须与服务B的部署位置产生依赖关系。另一方面,为了实现服务B的高可用,不论采用服务端负载均衡还是客户端负载均衡,都需要手工维护服务B的实例列表。
为了解决微服务架构中的服务实例维护问题,产生了大量的服务治理框架和产品。服务治理的功能主要有一下几点:

  • 对开发新服务和升级现有服务的计划管理服务的生命周期;
  • 确保升级服务不会影响目前的服务消费者制定方针来限制服务行为;
  • 制定所有服务都要遵从的规则,确保服务的一致性监控服务的性能;
  • 由于服务组合,服务停机和性能低下的后果是严重的。通过监控服务的性能和可用性,当问题出现的时候能马上采取应对措施;
  • 管理由谁来调用服务、怎样调用服务

服务注册

在服务治理框架中,通常需要一个注册中心。每个服务想注册中心登记自己提供的服务,将服务的位置、调用方式等告知注册中心。注册中心会按服务名分类组织分类清单。另外服务注册中心还需定时监控清单中的服务的健康状态,及时剔除不可用的实例。

服务发现

在服务治理框架下,服务之间的调用不在依赖于服务的具体位置(如ip:port),而是通过服务名调用,从而将服务的部署从微服务的调用中解决关联。通过服务名调用,还可以方便地实现负载均衡。由于服务注册,我们有一份清单可以找到某个服务的具体实例,若是服务不止一个实例,我们可以很方便地动态选择服务的实例进行调用,从而实现负载均衡。这也有利于服务的横向扩展,实现高可用。

Spring Cloud Eureka

Netflix Eureka是Netflix开发的一套基于jvm和restful的服务治理框架。其服务端是用java语言编写,主要适用于java实现的分布式系统。但是其通信协议为基于http的restful,所以客户端理论上用什么语言实现都可以。这也是微服务的一大特点,服务可以根据自身特点选用相应的语言或平台实现,不必局限于同一的平台。

搭建服务注册中心

Spring Cloud中的微服务就是一个个Spring Boot应用程序,服务注册中心也不例外。按上篇文章的步骤,搭建一个spring boot模块。

新建一个gradle模块,artifactId设为eureka-server

完善项目目录

修改build.gradle,引入spring-cloud-starter-eureka-server

group 'com.zhuangqf.demo'
version '1.0-SNAPSHOT'

dependencies {
    compile "org.springframework.cloud:spring-cloud-starter-eureka-server"
    compile "org.springframework.boot:spring-boot-starter-web"
}

添加Application启动类,通过EnableEurekaServer注解启动一个注册服务中心。

@EnableEurekaServer
@SpringBootApplication
public class Application {

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

}

添加application.yml:

spring:
  application:
    name: eureka-server
server:
  port: 9000

eureka:
  instance:
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    hostname: ${spring.cloud.client.ipAddress}
  client:
    fetch-registry: false
    register-with-eureka: false
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

先重点关注eureka.client配置:

  • eureka.client.fetch-registry 默认为true,是否拉取注册的实例信息,注册中心不需要远程调用实例,所以不需要检索服务,设为false。
  • eureka.client.register-with-eureka 对于单注册中心,不需要向自己注册
  • eureka.client.serviceUrl.defaultZone 注册中心地址
启动后访问localhost:9000

接入客户端

注册中心已经跑起来了,那么怎么让我们的服务注册到注册中心呢?让我们对之前写过的example模块做一些改造。

在example模块的build.gradle中添加依赖

compile "org.springframework.cloud:spring-cloud-starter-eureka"

相应的,在Application类加一个注解:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {

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

}

接着,在application.yml中指定注册地址:

eureka:
  instance:
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    hostname: ${spring.cloud.client.ipAddress}
  client:
    serviceUrl.defaultZone: http://localhost:9000/eureka/

启动后访问localhhost:9000

高可用注册中心

高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。

在微服务架构系统中,故障是不可能避免的。Eureka Server的设计一开始就考虑了高可用的问题,在Eureka的服务治理设计中,所有节点既是服务提供方,又是服务消费方,服务注册中心也不例外。

Eureka Server的高可用实际上是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心。注册中心之间会共享彼此的服务清单,注册中心可以在一个zone中,也可以按业务或服务的部署位置分为多个zone。

在这里,我们先简单实现同一个zone的两个注册中心,让它们彼此注册,实现高可用。

首先,在eureka-server的application.yml中增加以下配置

-- peer1
server.port: 9001

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:9002/eureka

-- peer2
server.port: 9002

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:9001/eureka

peer1和peer2是可选的两组配置,在配置中,我们从彼此注册到对方。

peer的启动配置,增加了`--spring.profiles.active=peer`作为启动参数

分别启动peer1和peer2

peer1注册到了peer2服务器
peer2注册到了peer1服务器

启动example

修改example的注册服务器地址:


example注册到了peer1和peer2中

此时,peer1或者peer2有一个出现故障在短时间内不会对系统的业务有太大的影响,因为另一个注册中心可以临时性承接所有的流量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343