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 主要框架


 服务注册——Netflix Eureka

 服务调用——Netflix Feign

 熔断器——Netflix Hystrix

 服务网关——Netflix Zuul

 分布式配置——Spring Cloud Config

 消息总线 —— 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 版本

   

       

            org.springframework.cloud

            spring-cloud-dependencies

            Finchley.M9

            pom

            import

       

   

ktc_eureka 模块 pom.xml 引入 eureka-server

    org.springframework.cloud

    spring-cloud-starter-netflix-eureka-server

(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)将其他微服务模块添加依赖

    org.springframework.cloud

    spring-cloud-starter-netflix-eureka-client

(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 模块添加依赖

    org.springframework.cloud

    spring-cloud-starter-openfeign

(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看是否轮流启动 。

你可能感兴趣的:(SpringCloud、Eureka、Feign)