实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例
发布日期:2021-07-01 01:15:58 浏览次数:2 分类:技术文章

本文共 3019 字,大约阅读时间需要 10 分钟。

转载自  

Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一。通过Eureka可以提供服务注册、发现、负载均衡、降级、熔断等功能。本篇主要介绍Eureka作为服务注册中心,以及实现一个基本的负载均衡服务。

1. 为什么需要Eureka

对于一个大型系统来说,不可避免的会存在各种子系统之间的调用关系,比如一个子系统A请求子系统B的服务:

与此同时随着用户量的增加,或者服务本身的迭代,会加入更多的调用关系:

如上图所示,子系统间的调用关系会随着项目迭代变得异常复杂,任何一个项目的改动,都会牵连好几个项目跟着重启。如果服务提供方(B、D)的IP变动,调用方就要重启以应对这种变化。

Eureka提供了一种服务注册及发现的服务,当引入服务注册后,你的项目架构可变为:

通过服务注册中心,任何子系统就不再需要关注服务提供方的IP地址等信息,直接向服务中心请求调用即可。另外,Eureka也提供了负载均衡、监控节点、熔断机制去除故障节点等功能。因此,对于分布式应用来说,Eureka可以发挥很大的作用。

2. 关于Eureka

根据第一小节的分析,我们可以把基于Eureka的架构归纳为如下图:

可以看到包含Eureka框架中主要包括三个实体:Eureka Server、Client、Producer。

  • Eureka Server,服务注册和发现,统一管理各种服务。

  • Client,消费者,面向客户,服务的调用方。

  • Producer,服务生产者,服务的被调用方。

3. 关于Ribbon

Spring Cloud Ribbon也是Netflix公司开源的组件之一,主要提供了客户端的负载均衡服务,可配合Eureka一起使用。Ribbon客户端提供了一系列完善的配置选项,包括服务链接超时、重试机制等。Ribbon内置可插拔、可定制的负载均衡策略,包括:

  • 简单轮询策略

  • 加权响应时间

  • 区域感知

  • 随机负载

4. 关于Feign

Feign是Netflix公司出品的声明式Web服务调用端,我们只要创建接口并用它来调用已存在的接口即可。同时它还整合了Ribbon和Rureka来提供负载均衡的REST请求实现。以本文为例,客户端CLient编写一个Feign请求:

import org.springframework.cloud.netflix.feign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * Created by zhaoyh on 2018/1/03 * @author zhaoyh */@FeignClient(name = "PRODUCER")public interface FeignService {    @RequestMapping(value = "/api/calculate")    String calculate(@RequestParam(value = "num") int num);}

如果想要使用该接口,可以以如下的方式:

@Autowiredprivate FeignService feignService;@RequestMapping(value = "/requestByFeign/{num}", method = RequestMethod.GET)public String requestByFeign(@PathVariable(value = "num") int num) {    String result = feignService.calculate(num);    return result;}

关于Ribbon和Feign,我个人是这样理解的:Ribbon是一个客户端的负载均衡器;Feign更像是一个Http客户端,用来请求Web接口服务。

5. 负载均衡案例实现

本案例就基于Eureka注册中心,做一个简单的具备服务注册发现和负载均衡的应用。

案例需要你的主机配置如下环境:

软件 版本
JDK 1.8
Maven 2.0+

对于在第二节中介绍的三个实体,我们基于Spring Boot建立了三个对应的项目,都已push到github上了,可以直接点击对应的项目clone下来。

github-Eureka Server

github-Client

github-Producer

5.1 案例说明

实现一个简单的远程调用,计算斐波那契数列的值并返回。

  • Client端:面向用户,用户查询斐波那契的结果。

  • Producer端:提供计算结果。

  • Eureka Server:提供服务注册。

5.2 启动Eureka Server

cd springboot-eureka-server./mvnw.sh clean installjava -jar target/springboot-eureka-server-0.0.1.jar

然后打开浏览器,输入 http://localhost:1111 ,此时没有任何服务注册进来,初始界面如下:

5.3 启动Producer

为了达到负载均衡的效果,接下来我们就要启动多个Producer的实例,首先:

cd springboot-loadbalance-server

修改applications.properties中port的值,每设置一个端口号,则打包一次:

./mvnw.sh clean install保存 target/springboot-loadbalance-server-0.0.1.jar 到任意位置并执行。

我启动了三个实例,分别是9092、9093、9094端口。重启后,在http://localhost:1111中查看Eureka Server已收到我注册的三个服务:

5.4 启动Client

cd springboot-loadbalance-client./mvnw.sh clean installjava -jar target/springboot-loadbalance-client-0.0.1.jar

此时再打开注册中心就会发现该客户端也已经注册成功了:

接下来就是要验证请求服务啦,Client的端口号是9090。在客户端的controller里,我实现了两种请求方式,第一种是RestTemplate,这是Spring提供的一种请求restful接口的便捷模版;第二种是Neitflix公司的Feign。

使用RestTemplate模版的访问链接 http://localhost:9090/requestByRestTemplate/10 ;使用Feign的访问链接 http://localhost:9090/requestByFeign/10 。

由于我们默认采用轮询的负载均衡策略,多刷新几次,会看到不同的实例依次返回计算结果:

至此我们的服务注册和简单轮询负载均衡就实现完了,有兴趣的小伙伴可以直接从上文所述的github上把代码star并clone下来体验。

转载地址:https://maokun.blog.csdn.net/article/details/105341846 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:基于消息中间件RabbitMQ实现简单的RPC服务
下一篇:Redis RDB文件格式全解析

发表评论

最新留言

不错!
[***.144.177.141]2024年04月09日 20时48分52秒