03-08、SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign

news/2024/11/28 21:53:46/

SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign

一、Ribbon

1、概述

SpringCloud Ribbon是给予NetFlex Ribbon 实现的一套客户端负载均衡工具。简单的说,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系列配置项如:连接超时、重试等。简单地说,就是在配置文件中列出Load Balance后面所有的机器,Ribbon会自动的帮助你基于某种规则去连接这些机器(简单轮询、随机等)。目前Ribbon官网上也显示处于维护状态,以后SpringCloud可能会使用LoadBalancer替代

2、负载均衡

1、什么是负载均衡?
LoadBanlance简单说就是将用户请求平均分配到多个服务器上。从而达到系统的高可用。
常用的如在均衡有Nginx和LVS等。2、Nginx和Ribbon有何区别?
Nginx是服务器负载均衡,客户端的所有请求都会交给Nginx,然后由Nginx实现请求的转发,即负载均衡是由服务端实现的。
Ribbon是本地负载均衡,在调用微服务接口时,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用。

在这里插入图片描述

3、演示

之前我们已经演示了cloud-consumer-order-80项目通过RestTemplate分别调用cloud-provider-payment-8001和cloud-provider-payment-8002的过程。

虽然我们没有引用Ribbon,但是Eureka-client其实已经在内部整合了Ribbon。

Ribbon具体使用,以及IRule自定义负载规则可以看 《SpringCloud第三章,负载均衡Ribbon和Feign》

<!--正常引用-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

在这里插入图片描述

MyRule

@Configuration
public class MyRule {@Beanpublic IRule getRule(){return new RandomRule();}
}

主启动类

package com.lee.springcloud;import com.lee.rules.MyRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;/*** consumer主启动类*/
//表示自己是Eureka的客户端
@EnableEurekaClient
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MyRule.class)
@SpringBootApplication
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);}
}

二、OpenFeign

1、概述

原来我们使用Dubbo实现远程RPC调用时都是Service之间互调。但是Ribbon是在Controller层和RestTemplate结合使用,不太符合我们的使用习惯。因此引出了OpenFeign.Feign是一个声明式webservice客户端。使用feign能让编写webservice客户端更简单。
它的使用方法是定义一个服务接口,然后在上面添加注解。SpringCloud对Feign进行了封装,使其支持了springmvc标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon组合使用以支持负载均衡

openFeign也在内部整合了Ribbon。

在这里插入图片描述

2、Feign和OpenFeign两者区别

Feign
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。feign的使用方式是:使用Feign注解定义一个接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign
OpenFeign是springcloud在feign的基础上支持了springmvc注解,如@RequestMapping等等。openFeign的@FeignClient注解可以解析springmvc的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

3、cloud-consumer-order-80构建

pom新增

<!--openFeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

主启动类新增:

@EnableFeignClients

PaymenService

package com.lee.springcloud.feign.service;import com.lee.springcloud.entities.CommonResult;
import com.lee.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@Service
@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface PaymentService {@PostMapping("/payment/create")CommonResult create(@RequestBody Payment payment);@GetMapping("/payment/get/{id}")CommonResult getPaymentById(@PathVariable("id") Long id);}

Controller

@Resource
private PaymentService paymentService;@PostMapping("/openFeign/payment/create")
public CommonResult<Payment> create2(@RequestBody Payment payment) {return paymentService.create(payment);
}@GetMapping("/openFeign/payment/get/{id}")
public CommonResult<Payment> getPaymentById2(@PathVariable("id") Long id) {return paymentService.getPaymentById(id);
}

测试:

启动eureka7001  eureka7002  payment-8001  payment-8002   order-80调用:http://localhost/consumer/openFeign/payment/get/1结果:
{"code":200,"message":"查询数据成功 serverPort:8002Payment(id=1, serial=001)","data":null}

4、OpenFeign超时控制

在远程调用的过程中,默认feign客户端只等待1s,但是很多时候服务端处理需要超过1s。导致feign客户端不想等待了。直接反会报错。

为了避免这种情况,我们需要为feign设置超时控制。

4.1、cloud-provider-payment-8001

controller新增

@GetMapping("/getTimeOutMethos")
public CommonResult getTimeOutMethos(){try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}return new CommonResult(404,"超时了",null);
}
4.2、cloud-consumer-order-80

service

@Service
@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface PaymentService {@PostMapping("/payment/create")CommonResult create(@RequestBody Payment payment);@GetMapping("/payment/get/{id}")CommonResult getPaymentById(@PathVariable("id") Long id);@GetMapping("/payment/getTimeOutMethos")CommonResult getTimeOutMethos();}

controller新增

@GetMapping("/openFeign/payment/getTimeOutMethos")
public CommonResult getTimeOutMethos(){return paymentService.getTimeOutMethos();
}

测试:

启动eureka7001 eureka7002  provider-8001  order-80
调用:
http://localhost/consumer/openFeign/payment/getTimeOutMethos

在这里插入图片描述

解决:

cloud-consumer-order-80的application.yml新增:

# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间ReadTimeout: 5000# 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000

结果:

{"code":404,"message":"超时了","data":null}

ication.yml新增:

# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间ReadTimeout: 5000# 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000

结果:

{"code":404,"message":"超时了","data":null}

http://www.ppmy.cn/news/1550735.html

相关文章

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

《Unity Shader 入门精要》高级纹理

立方体纹理 图形学中&#xff0c;立方体纹理&#xff08;Cubemap&#xff09;是环境映射&#xff08;Environment Mapping&#xff09;的一种实现方法。环境映射可以模拟物体周围的环境&#xff0c;而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的环境。 对立…

5.1 MySQL 锁机制

锁机制是 MySQL 用于控制并发访问的重要手段&#xff0c;通过锁定资源避免数据冲突。理解 MySQL 的锁机制&#xff0c;有助于开发者优化数据库性能并处理高并发场景。 1. 锁的概念 锁&#xff08;Lock&#xff09;是数据库系统为保证数据一致性和完整性&#xff0c;对特定资源…

Python 中的装饰器是什么?

装饰器是Python中一种非常强大的功能&#xff0c;它允许你在不修改原始函数代码的前提下&#xff0c;增加额外的功能或改变函数的行为。 装饰器本质上是一个接受函数作为参数的函数&#xff0c;并返回一个新的函数。 通过装饰器&#xff0c;我们可以轻松地实现诸如日志记录、…

Axios案例练习

使用原生的Ajax请求还是比较繁琐&#xff0c;所以说一般使用Axios&#xff0c;Axios是对于Ajax的封装&#xff0c;主要是为了简化书写。 Axios使用比较简单&#xff0c;主要分为两步&#xff1a; 1.在script标签的src中引入Axios文件 特别注意&#xff0c;这里是需要一对单独的…

java——Tomcat调优策略

Tomcat 作为一款广泛使用的 Java 应用服务器&#xff0c;其性能优化对于提高应用的响应速度和处理能力至关重要。优化方案可以从多个方面入手&#xff0c;包括但不限于内存优化、并发优化、连接器优化、JVM 调优、系统内核参数优化等。以下是这些优化方案的具体操作步骤&#x…

大模型智能客服系统是什么?

大模型智能客服系统是什么&#xff1f; 作者&#xff1a;开源大模型智能客服系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc&#xff0c;致力于成为大模型呼叫中心系统、电话机器人、智能呼叫中心系统、大模型智能客服系统&#xff1b;…

新能源整车厂车联网安全:架构、流程与融合

摘要&#xff1a; 本文从车联网安全工程师的视角出发&#xff0c;深入探讨新能源整车厂软件开发部门中车联网安全部门的角色与职责。详细阐述了关注组织架构和交付路径的重要性&#xff0c;并剖析如何将安全需求有效融入整车软件开发流程&#xff0c;涵盖基础软件、上层业务开发…