springCloud Finchley 实战入门(基于springBoot 2.0.3)【四 Ribbon 服务容错保护】

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: spring Cloud RibbonRibbon是一个基于HTTP和TCP协议的客户端负载均衡工具,他也是基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们很容易的将面向服务的REST模板请求自动转换成客户端负载均衡的调用。

spring Cloud Ribbon

Ribbon是一个基于HTTP和TCP协议的客户端负载均衡工具,他也是基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们很容易的将面向服务的REST模板请求自动转换成客户端负载均衡的调用。虽然Ribbon只是一个工具类框架,不像服务注册中心、配置中心、API网关那样需要独立部署,但是他几乎存在于每一个Srping Cloud构建的微服务和基础设施中。

客户端负载均衡

负载均衡在系统架构中是一个非常重要的,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力的扩容的一个重要的手段之一。我们通常说的负载均衡都是指服务端的负载均衡,其中服务端的负载均衡分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过服务器节点之间安装专门的负载均衡设备,而软件负载均衡则是通过在服务器安装一些具有负载均衡的软件来实现,比如:Nginx;
而客户端的负载均衡和服务端的负载均衡最大的不同点在于服务清单所存储的位置。在客户端负载均衡中,所有的客户端节点都维护着自己要访问的服务端清单。而这些服务清单均来自服务注册中心。

入门案例

我们接着上一篇的创建的service-user项目。我们在该项目中写一个业务接口实现。


img_be6bec5d8a4fd194e1f3a78c383780b6.png
15324818571.jpg

创建一个UserManagementController类。并且暴露一个get请求的服务接口;模拟返回用户数据。代码如下

@RestController
@Log
public class UserManagementController {

    @Value("${server.port}")
    String serverPort;
    
    @GetMapping("/listUsers")
    public String ListUsers() throws InterruptedException {
        /**
         * 模拟从数据库查询
         */
        List<Map<String, Object>> users = new ArrayList<Map<String, Object>>();
        for (int i = 1; i < 5; i++) {
            Map<String, Object> user = new HashMap<String, Object>();
            user.put("id", i);
            user.put("name", "小明" + i);
            users.add(user);
        }
        log.info("/listUsers, host:"+serverPort);
        return "服务器端口号:   " + serverPort + "   |   用户信息:   " + users.toString();
    }
}

这里说一个日志输出,我比较喜欢使用lombok,所以项目中的日志输出我都会使用这种方式来输出日志。
使用的方式很简单;
在pom.xml添加lombok的依赖

 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
 </dependency>

然后我们在类名添加@Log注解就可以了,关于其他更多的用户,大家可以网上了解一下。

重启项目,访问http://localhost:8802/listUsers,如果有数据返回,则说明服务接口正常了。

img_17fb0e42a4ee41cdc2f70862153f5b12.png
1532482987004.png

到这里service-user的服务接口已经写好了。接下来我们就创建一个新的springBoot 类型的module,命名为"eureka-bussniss-service-user-client-ribbon"做为服务消费者。
创建的过程中我们选中Eureka-server和Ribbon两个依赖即可:


img_975f36544e0b8fab9406f5f3425a4dcc.png
1532483177335.png

创建项目成功后,修改application.yml

spring:
  application:
    name: service-user-ribbon
server:
  port: 8901
eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/

项目主类名添加@EnableEurekaClient注解,并且注入RestTemplate类。主类的代码如下:

@SpringBootApplication
@EnableEurekaClient
public class EurekaBussnissServiceUserClientRibbonApplication {

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

    @Bean
    @LoadBalanced //开启客户端负载均衡
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

上面的@LoadBalanced 注解表示开启客户端的负载均衡。
接下来,我们新建一个UserManagementRibbonClient请求类,实现负载均衡请求service-user服务,代码如下:

@RestController
@Log
public class UserManagementRibbonClient {

    @Value("${server.port}")
    private String port;

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/listUsersByRibbon")
    public String ListUsersByRibbon() {

        long start = System.currentTimeMillis();
        String result = this.restTemplate.getForObject("http://service-user/listUsers", String.class);
        long end = System.currentTimeMillis();
        log.info("Spend Time :"+(end-start));
        return result;
    }
}

说明:service-user 为服务名称, 一个服务名称对应多个主机IP和端口号,这样根据服务名调用就实现了负载均衡的功能。
这样服务消费者就已经创建好了,接下来我们来验证测试Ribbon负载均衡的请求。

我们先把服务提供者service-user开启两个分别对应端口8802和8803。启动的方式可以向之前服务注册中心的方式,也可以直接在Idea里面启动,这里我们选择在Idea启动。启动的方式:


img_dbf00934181faca12a19e95b4880c015.png
1532484083723.png

修改这里,把single instance only的勾去掉。


img_89854328ddae37d737f6e750b8bb4ad2.png
1532484159323.png

启动完8802端口后,我们修改一个application.yml的port为8803,即可启动8803对应的服务了。
接着把"eureka-bussniss-service-user-client-ribbon"服务也启动了。
这个时候我们访问注册中心的面板信息,可以看到相关的服务实例已经注册到了注册中心了。


img_97f083dd9aa083c82a3ca64acd0f09ed.png
1532484522884.png

这个时候我们访问service-user-ribbon的接口地址:http://localhost:8901/listUsersByRibbon
这里可以看到接口响应信息轮询的返回8802和8803的信息。

img_65f23350764fcdf53350200fc412d51a.png
1532484661718.png

img_236f8b69de178c1868ad4a018038f663.png
1532484671894.png

到这里说明Ribbon已经实现负载均衡请求了。
项目的源码

接口的负载均衡已经实现了,当时这里就会有一个问题了,如果服务提供者service-user其中一个服务挂了,ribbon还是会负载均衡到这个挂掉的服务的。例如:8把002端口停掉,然后继续访问http://localhost:8901/listUsersByRibbon。我们会看到当接口负载到8802的时候就报错了。

img_7ee439ea7c81a262fabc51445afc576d.png
1532485030017.png

只有负载到8803才正常,这里如果是生产环境是可能不能出现这张情况的。

如果我们使用过Nginx,就会知道Nginx有一种容灾的功能,就是如果nginx反向代理的其中一个服务节点挂了不能访问了,nginx会自动踢掉这个节点,不会代理到这个节点的。在spring cloud中的Hystrix组件的主要作用就是服务容错保护来实现这个功能的。

所以我们下一篇会使用Hystrix组件来实现客户端负载均衡的服务容错保护。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
14天前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
40 15
|
14天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
35 5
|
29天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
109 6
|
2月前
|
缓存 NoSQL Java
Springboot实战——黑马点评之秒杀优化
【9月更文挑战第27天】在黑马点评项目中,秒杀功能的优化对提升系统性能和用户体验至关重要。本文提出了多项Spring Boot项目的秒杀优化策略,包括数据库优化(如索引和分库分表)、缓存优化(如Redis缓存和缓存预热)、并发控制(如乐观锁、悲观锁和分布式锁)以及异步处理(如消息队列和异步任务执行)。这些策略能有效提高秒杀功能的性能和稳定性,为用户提供更佳体验。
157 6
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
160 0
|
3月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
187 0
|
3月前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
52 0
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
64 13
|
5月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。

热门文章

最新文章