SpringCloud、Eureka、Feign

1.SpringCloud 简介


1.1. 什么是 SpringCloud


Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,都可以用Spring Boot 的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

Spring Cloud 项目的官方网址:http://projects.spring.io/spring-cloud/

1.2. SpringCloud 与 Spring Boot 的关系


Spring Boot 是 Spring 的一套快速配置脚手架,可以基于 Spring Boot快速开发单个微服务, Spring Cloud 是一个基于 Spring Boot实现的云应用开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,SpringCloud 很大的一部分是基于 Spring Boot 来实现,可以不基于 Spring Boot吗?不可以。Spring Boot 可以离开 Spring Cloud 独立使用开发项目,但是 Spring Cloud 离不开Spring Boot,属于依赖的关系。

1.3. SpringCloud 主要框架


\bullet  服务注册——Netflix Eureka

\bullet  服务调用——Netflix Feign

\bullet  熔断器——Netflix Hystrix

\bullet  服务网关——Netflix Zuul

\bullet  分布式配置——Spring Cloud Config

\bullet  消息总线 —— Spring Cloud Bus

1.4. Spring Cloud 与 Dubbo 对比


或许很多人会说 Spring Cloud 和 Dubbo 的对比有点不公平,Dubbo只是实现了服务治理,而

Spring Cloud 下面有 17个子项目(可能还会新增)分别覆盖了微服务架构下的方方面面,服

务治理只是其中的一个方面,一定程度来说,Dubbo 只是 Spring Cloud Netflix中的一个子集。

2.注册中心 Eureka


2.1. 注册中心


注册中心主要涉及到三大角色:

 1. 服务提供者

 2. 服务消费者

 3. 注册中心

它们之间的关系大致如下:

 1. 各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。

 2. 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

 3. 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

 4. 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。

2.2 Eureka


Eureka 是 Netflix 开发的服务注册框架,SpringCloud 将它集成在自己的子项目spring-cloud-netflix 中,实现 SpringCloud 的服务发现功能。Eureka包含两个组件: Eureka Server 和 Eureka Client。

Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client 是一个 java 客户端,用于简化与 Eureka Server的交互,客户端中有一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

在应用启动后,将会向Eureka Server 发送心跳,默认周期为 30 秒,如果 Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认 90 秒)。

Eureka Server 之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的 Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的 API。

综上,Eureka通过心跳检查、复制同步、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

2.3. Eureka 服务端开发


(1)创建 ktc_eureka 模块

(2)引入依赖父工程 pom.xml 中定义 SpringCloud 版本

<!--锁定spring-cloud版本-->

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-dependencies</artifactId>

            <version>Finchley.M9</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

ktc_eureka 模块 pom.xml 引入 eureka-server

<!--eureka服务器端依赖-->

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

</dependency>

(3)添加 application.yml

server:

  port: 10101

spring:

  application:

    name: ktc-eureka    #微服名称

eureka:

  client:

    register-with-eureka: false # 是否将该服务注册到eureka服务端

    fetch-registry: false      # 是否从eureka服务端获取其他服务实例

    service-url:                # eureka的注册地址

      defaultZone: http://127.0.0.1:${server.port}/eureka

(4)编写启动类

创建包 com.ktc.eureka ,包下建立类

package com.ktc.eureka;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer                //开启Eureka服务器端

public class EurekaApplication {

    public static void main(String[] args) {

        SpringApplication.run(EurekaApplication.class);

    }

}

(5)启动运行启动类,然后在浏览器地址栏输入 http://localhost:10101/运行效果如下:

主界面中 system status 为系统信息 General Info 为一般信息 Instances currently registered with Eureka 为注册到的所有微服务列表。

2.4. 服务注册


我们现在就将所有的微服务都注册到 Eureka中,这样所有的微服务之间都可以互相调用了。

(1)将其他微服务模块添加依赖

<!--引入eureka客户端依赖-->

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

(2)修改每个微服务的 application.yml,添加注册 eureka 服务的配置

eureka:

  client:

    service-url:

      defaultZone: http://127.0.0.1:10101/eureka

  instance:

    prefer-ip-address: true    #使用ip区分服务

(3)修改每个服务类的启动类,添加注解

@EnableEurekaClient

(4)启动测试:将每个微服务启动起来,会发现 eureka的注册列表中可以看到这些微服务了。

2.5. 保护模式

如果在 Eureka Server 的首页看到以下这段提示,则说明 Eureka已经进入了保护模式:

默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了,因为微服务本身是健康的,此时本不应该注销这个微服务。

Eureka Server通过“自我保护模式”来解决这个问题:当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。

3.Feign 实现服务间调用


3.1. Feign 简介


Feign 是简化 Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于 Retrofit、JAXRS-2.0 和 WebSocket。Feign 的初衷是降低统一绑定Denominator 到 HTTP API 的复杂度,不区分是否为 restful。

3.2. 快速体验


我们现在在问答微服务调用基础微服务的方法(根据 ID 查询标签)

(1)在 ktc_qa 模块添加依赖

<!--feign依赖-->

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

(2)修改 ktc_qa 模块的启动类,添加注解

/**

* 必须在客户端微服中添加这两个注解才能实现服务发现

*/

@EnableDiscoveryClient

@EnableFeignClients

(3)在 ktc_qa 模块创建 com.ktc.qa.client 包,包下创建接口

@FeignClient("ktc-base") //调用微服的名称

public interface LabelClient {

    @RequestMapping(value = "/label/{id}", method = RequestMethod.GET)

    public Result findById(@PathVariable("id") String id);

}

@FeignClient 注解用于指定从哪个服务中调用功能 ,注意里面的名称与被调用的服务名保持一致,并且不能包含下划线。

@RequestMapping 注解用于对被调用的微服务进行地址映射。注意 @PathVariable注解一定要指定参数名称,否则出错。

(4)修改 ktc_qa 模块的 ProblemController

@Autowired

private LabelClient labelClient;

@RequestMapping(value = "/label/{labelid}",method = RequestMethod.GET)

public Result findLabelByLabelId(@PathVariable String labelid){

    Result result = labelClient.findById(labelid);

    return result;

}


3.3 本地缓存实例


服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

开启Eureka服务端、Qa微服、Base微服

调用Qa微服务,Qa微服中调用Base微服测试

http://localhost:9003/problem/label/1144453746185527296

然后关闭Eureka服务端测试,调用是否还能成功,发现依旧调用成功

3.4. 负载均衡


测试:同时开启多个基础微服务,看是否是轮流调用。

启动基础微服务后,修改端口和输出信息,再次启动基础微服务

启动问答微服务,浏览器执行 http://localhost:9003/problem/label/1看是否轮流启动 。

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