如何用Eureka + Feign搭建分布式微服务

目录
  • Eureka
  • Feign
  • 创建父项目
  • 注册中心
    • 主要依赖
    • 配置文件
    • 主类
  • 服务提供者
    • 主要依赖
    • 配置文件
    • 主类及Controller
  • 客户端
    • 主要依赖
    • 配置文件
    • 主类、Controller及Feign映射

Eureka

Eureka主要解决了消费者对服务的记忆问题。如果没有Eureka,那么消费者必须记忆每个服务的地址,且一旦服务提供者宕机或地址发生变更,很可能不会收到通知,导致地址失效。加入Eureka后,只需记住Eureka注册中心的地址就能够找到其它所有服务。

此外,Eureka能够接受多个服务的注册,还能够通过其它组件的加持直接替代消费者进行负载均衡,使消费者无需手动选择服务。

Feign

Feign是一个模板化的HTTP客户端。通过Feign,可以做到像调用一个本地方法一样请求远程服务,无需编写繁杂的代码来创建HTTP请求。

创建父项目

项目主要分为三个微服务:服务提供者、服务消费者、Eureka注册中心。为了方便演示,三个项目都在同一个主机上运行,且都放在一个父项目里。

首先在IDEA中创建一个空项目,然后分别在项目中新建对应的三个Spring模块:

  • EurekaServer: 注册中心,依赖为Eureka Server。
  • ServiceProvider: 服务提供者,依赖为Eureka Discovery Client, Spring Web。
  • ServiceConsumer: 服务消费者,依赖为OpenFeign, Eureka Discovery Client, Spring Web。

注册中心

服务提供者通过向注册中心注册,提供它们的地址供调用;服务消费者向注册中心请求来获取可用的服务。

主要依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

配置文件

# 端口
server.port=1000
# 指定应用名称
spring.application.name=server
# 是否拉取其它服务器的注册信息
eureka.client.fetch-registry=false
# 是否向其它服务器注册
eureka.client.register-with-eureka=false
# 指定服务url
eureka.client.service-url.defaultZone=http://localhost:1000/eureka

默认情况下,Eureka服务器假定自己是集群的一部分,会定期向其它Eureka服务器注册自己,并获取其它服务器的注册信息。由于本项目仅部署一个Eureka服务器提供注册服务,所以不需要这两个动作,通过配置文件的eureka.client.fetch-registry和eureka.client.register-with-eureka两个属性禁用。

eureka.client.service-url包含了每个zone的名称和地址。defaultZone是一个特殊的key,如果客户端没有指定所需的zone,就会使用这个默认的zone。一般情况下defaultZone的地址就是Eureka服务器本身。

主类

@SpringBootApplication
@EnableEurekaServer
public class MyEurekaServerApplication {

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

要启动Eureka注册服务,在原生的Spring Boot启动类上注解@EnableEurekaServer即可。

项目启动后,访问localhost:1000就能看到Eureka提供的界面了。如果在界面上看到警告

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

是正常现象。Eureka服务器默认开启了自我保护模式。由于没有收到集群中大部分服务器的心跳(本项目中就一个Eureka服务器,所以该服务器不会收到任何心跳,自我保护模式也没有多少影响),Eureka假定出现了网络问题,开启自我保护模式。在自我保护模式下,已经注册的服务不会因为没有收到心跳而被注销。

如果要关闭自我保护,可以在配置中设置如下属性。

eureka.server.enable-self-preservation=false

服务提供者

服务提供者将自己注册到注册中心。

主要依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

spring-cloud-starter-netflix-eureka-client依赖包含了Eureka客户端(即服务提供者)的实现;spring-boot-starter-web用于将服务暴露为HTTP端点。

配置文件

# 应用端口
server.port=2000
# 应用名称
spring.application.name=service
# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:1000/eureka

eureka.client.service-url.defaultZone属性告诉Eureka客户端从哪里找到注册中心。

主类及Controller

@SpringBootApplication
public class MyEurekaServiceApplication {

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

}

@RestController
@RequestMapping("/test")
@Slf4j
class MyController {
    @Value("${server.port}")
    private int serverPort;

    @GetMapping
    public String getHandler() {
        log.info("##############received call, port: " + this.serverPort);
        return "test msg";
    }
}

为了展示方便,这些类都写在同一个文件中,下同。

这里的Controller提供了一个简单的服务:只要访问/test路径,就返回一个字符串test msg。如果有需要,可以同时启动多个服务实例,模拟服务器集群提供服务的情况。

@Slf4j是lombok提供的辅助注解,用于在类中方便地声明一个Logger实例log。

@Value是Spring提供的注解,用于获取配置文件中的信息。本例中就获取了之前配置的属性server.port=2000的值2000,注入到域serverPort中。

启动服务提供者后,会自动向配置文件中指定的Eureka服务器进行注册。此时访问之前的Eureka服务器界面,能够看到已经注册的服务信息。这里我分别修改端口号启动了3个实例。

此时访问服务提供者所在端口的/test路径就能够收到服务提供的字符串。

客户端

Feign是一个模板化的HTTP客户端。通过Feign,可以做到像调用一个本地方法一样请求远程服务,无需编写繁杂的代码来创建HTTP请求。

客户端通过Feign的加持,可以方便地发出请求,也可以加入Hystrix的负载均衡、熔断降级等功能。

主要依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

配置文件

# 应用端口
server.port=3000
# 应用名称
spring.application.name=feignClient
# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:1000/eureka

同上,eureka.client.service-url.defaultZone属性指定了客户端应该到哪个地址寻找注册中心。

主类、Controller及Feign映射

@FeignClient(value = "service")
interface FeignController {
    @GetMapping("/test")
    public String getHandler();
}

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class MyFeignClientApplication {

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

}

@RestController
@RequestMapping("/test")
class MyRestController {
    @Autowired
    FeignController feignController;

    @GetMapping
    public String getHandler() {
        return feignController.getHandler();
    }
}

类中的接口FeignController将发往该端口的HTTP请求映射为向服务的请求。本例中,@FeignClient(value = "service")指定了将调用映射为向service服务的请求。而用@GetMapping("/test")则代表每当调用该方法,就向/test路径请求。综上,每当调用该方法,该服务就会向名为service的服务的/test路径发送HTTP GET请求。这就是Feign的方便之处。

在启动类上需要注解@EnableFeignClients和@EnableDiscoveryClient,启动对Feign接口的扫描和对Eureka服务器的发现。

类中还写了一个MyRestController,用于将对该服务的请求映射到方法调用。调用链为:

  • 浏览器向Controller发送HTTP请求
  • Controller收到请求后调用Feign接口中的方法
  • Feign将对方法的调用映射为对注册中心中服务的请求并返回

这样一来,用户体验到的过程就是:通过Feign发送了一个请求,然后收到了远程服务器上的信息。

启动客户端,访问客户端所在端口的/test路径,正确收到了服务提供的字符串。

(0)

相关推荐

  • Spring-cloud-eureka使用feign调用服务接口

    Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下 基于spring-boot 2.0以上版本完成的微服务架构 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE<

  • springcloud微服务之Eureka配置详解

    Eureka注册中心/服务发现框架 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能. Eureka包含两个组件:Eureka Server和Eureka Client. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Serve

  • Spring Cloud 系列之注册中心 Eureka详解

    1.1 简介 1.1.1 概述   Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client.2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主.Eureka 提供基于 REST 的服务,在集群中主要用于服务管理.Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群

  • 5分钟搭建SpringCloud Eureka服务注册中心的实现

    创建父级项目 只需保留pom.xml文件 这里只需搭建一个微服务 其他操作并无 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&qu

  • springboot cloud使用eureka整合分布式事务组件Seata 的方法

    前言 近期一直在忙项目,我也是打工仔.不多说,我们开始玩一玩seata. 正文 什么都不说,我们按照惯例,先上一个图(图里不规范的使用请忽略): 简单一眼就看出来, 比我们平时用的东西,多了 Seata Server 微服务 . 同样这个 Seata Server 微服务 ,也是需要注册到eureka上面去的. 那么我们首先就搞一搞这个 seata server ,那么剩下的就是一些原本的业务服务整合配置了. 该篇用的 seata server 版本,用的是1.4.1 , 可以去git下载下.当

  • SpringCloud服务注册和发现组件Eureka

    本篇文章,我们来讲解springcloud的服务注册和发现组件,上一章节我们讲解了如何搭建springcloud的多模块项目,已经新建了springcloud-eureka-server,springcloud-eureka-client两个模块,本章节就在这基础上直接使用. 想要了解的请参考:一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目 一.Eureka简介: 1.1 什么是eureka Eureka是一个基于REST的服务,主要用于AWS云中

  • Springcloud eureka搭建高可用集群过程图解

    一 前言 eureka作为注册中心,其充当着服务注册与发现功能,加载负载均衡:若在项目运行中eureka挂了,那么整个服务整体都会暂停,所以为服务运行的安全性,有必要搭建eureka集群:当其中一个eureka节点挂了,我们还有另外的节点可用:本篇文章的核心是如何在idea上运行eureka集群,和项目部署:需注意的jdk版本是1.8,高于jdk1.8打包部署会出问题,需要引入其他依赖: 二 eureka-server配置文件改造 之前的配置文件如下,这是单个eureka-server的配置,并

  • SpringCloud实现Eureka服务注册与发现

    GitHub地址:https://github.com/yudiandemingzi/spring-cloud-study 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务注册与发现,在微服务中,以后了这两者,只需要使用服务的标识符(==就是那个在每个服务的yml文件中取得服务名称==), 就可以访问到服务,不需要修改服务调用的配置文件. (3) Eureka遵循AP原则(

  • SpringCloud搭建netflix-eureka微服务集群的过程详解

    1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等 https://spring.io/projects/spring-cloud https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/ 2.新建项目 打开网址:https://start.spring.io/ 选择需要引入的组件,然后下载下来即可 3.更改项目结构 为了测试的方便,需将项目结构更改为多模块的项目. 步骤

  • SpringCloud如何使用Eureka实现服务之间的传递数据

    相信大家最关心的肯定不是什么一大堆的破理论,然后还似懂非懂的,最关心得莫过于服务之间的参数传递,数据获取. Ok,今天就告诉大家三种微服务之间传输数据的方式,分别是: 1.最基本的利用Ip端口进行请求访问接口实现数据的传输 2.使用Eureka取代Ip(硬编码)的方式实现数据的传输 3.使用Feign更加快捷"分服务"的方式实现微服务之间的数据传输(对Feign一点不了解的暂时不用理解,就是SpringCloud的组成的一部分后期会进行详细讲解,在此处讲解只是为自己mark一下) 前提

  • Spring Cloud Eureka 注册与发现操作步骤详解

    在搭建Spring Cloud Eureka环境前先要了解整个架构的组成,常用的基础模式如下图: 服务提供者:将springboot服务编写好以后,通过配置注册中心地址方式注册,提供给消费者使用. 注册中心:服务的中间桥梁,服务提供者将服务注册.服务消费者可以通过注册信息调用需要使用的服务. 服务消费者:通过规定的调用方式,读取注册中心的注册信息,调用相应的服务. 根据后续的服务复杂度进化以后,可以看到服务提供者也可以是服务消费者,服务消费者也可以是服务提供者.根据不同的业务情况是可以互相调用的

随机推荐