文章目录
基本概念
Eureka
Eureka出现原因
如果后端之间想要调用服务,其中一种方式就是通过 HTTP 调用,而一般情况下,url 会以硬编码的方式出现在代码中的,但如果开发环境发生了变化,导致地址改变,或者对应的服务可能是以集群的方式出现,即 url 可能有多个,那么此时代码是无法满足需求的。因此出现了以下几个问题:
① 服务消费者该如何获取服务提供者的地址信息?
② 如果有多个服务提供者,消费者该如何选择?
③ 消费者如何得知服务提供者的健康状态?
因此,出现了注册中心这一中间件,其中就包括 Eureka
Eureka原理
在Eureka架构中,微服务角色有两类:
1.EurekaServer:服务端,注册中心。可以记录服务信息以及实现心跳监控
2.EurekaClient:客户端。其中又分为以下两类:
(1)Provider:服务提供者。每一个服务提供者会注册自己的信息到 EurekaServer,并且每隔 30s 向 EurekaServer 发送心跳
(2)Consumer:服务消费者。每一个服务消费者会根据服务名称从 EurekaServer 拉取服务列表,并基于服务列表做负载均衡,选中一个微服务后发起远程调用
因此对于以上三个问题的回答:
1.服务消费者该如何获取服务提供者的地址信息:
服务提供者启动时向 Eureka 注册自己的信息,Eureka 保存这些信息,消费者根据服务名称向 Eureka 拉取提供者信息
2.如果有多个服务提供者,消费者该如何选择:
服务消费者利用负载均衡算法,从服务列表中挑选一个
3.消费者如何感知服务提供者健康状态:
服务提供者会每隔 30s 向 EurekaServer 发送心跳请求,报告健康状态,Eureka 会更新记录服务列表信息,心跳不正常会被剔除。这样消费者就可以拉取到最新的信息
Feign
介绍
在传统的调用 http 方法中,我们即使使用了注册中心,也需要手动编写 URL、请求参数、请求头等代码,例如:
String url = "http://userservice/user/" + order.getUserId();
存在下面的问题:
① 代码可读性差,编程体验不统一
② 参数复杂,URL 难以维护
Feign 是一个声明式(类似于Spring的声明式事务,只需要在配置文件中告诉Spring对谁加事务,把规则定义好,就可以让Spring完成事务的开启与关闭等操作,而不用去手动处理)的 http 客户端,官方地址:https://github.com/OpenFeign/feign,其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题
一般我们会使用 Feign 来配合注册中心的使用,以更方便地进行服务发现、负载均衡和熔断处理等
使用案例
1.引入依赖(注意,需要先指定 Spring Cloud 版本)
SpringCloud 的版本需要与 SpringBoot 版本对应,可以查看官网https://spring.io/projects/spring-cloud
<dependencyManagement>
<!--指定Spring Cloud版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--Feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2.在启动类中添加注解 EnableFeignClients
,开启 Feign 的功能
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3.编写 Feign 的客户端