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

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

一、Ribbon

1、概述

XML 复制代码
SpringCloud Ribbon是给予NetFlex Ribbon 实现的一套客户端负载均衡工具。

简单的说,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系列配置项如:连接超时、重试等。简单地说,就是在配置文件中列出Load Balance后面所有的机器,Ribbon会自动的帮助你基于某种规则去连接这些机器(简单轮询、随机等)。

目前Ribbon官网上也显示处于维护状态,以后SpringCloud可能会使用LoadBalancer替代

2、负载均衡

XML 复制代码
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

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

MyRule

java 复制代码
@Configuration
public class MyRule {

    @Bean
    public IRule getRule(){
        return new RandomRule();
    }
}

主启动类

java 复制代码
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、概述

xml 复制代码
原来我们使用Dubbo实现远程RPC调用时都是Service之间互调。但是Ribbon是在Controller层和RestTemplate结合使用,不太符合我们的使用习惯。因此引出了OpenFeign.

Feign是一个声明式webservice客户端。使用feign能让编写webservice客户端更简单。
它的使用方法是定义一个服务接口,然后在上面添加注解。SpringCloud对Feign进行了封装,使其支持了springmvc标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

openFeign也在内部整合了Ribbon。

2、Feign和OpenFeign两者区别

XML 复制代码
Feign
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。feign的使用方式是:使用Feign注解定义一个接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign
OpenFeign是springcloud在feign的基础上支持了springmvc注解,如@RequestMapping等等。openFeign的@FeignClient注解可以解析springmvc的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

3、cloud-consumer-order-80构建

pom新增

XML 复制代码
<!--openFeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

主启动类新增:

java 复制代码
@EnableFeignClients

PaymenService

java 复制代码
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

java 复制代码
@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);
}

测试:

XML 复制代码
启动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新增

java 复制代码
@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

java 复制代码
@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新增

java 复制代码
@GetMapping("/openFeign/payment/getTimeOutMethos")
public CommonResult getTimeOutMethos(){
    return paymentService.getTimeOutMethos();
}

测试:

xml 复制代码
启动eureka7001 eureka7002  provider-8001  order-80
调用:
http://localhost/consumer/openFeign/payment/getTimeOutMethos

解决:

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

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

结果:

XML 复制代码
{"code":404,"message":"超时了","data":null}

ication.yml新增:

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

结果:

XML 复制代码
{"code":404,"message":"超时了","data":null}
相关推荐
uNke DEPH3 小时前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel
hINs IONN4 小时前
RabbitMQ HAProxy 负载均衡
rabbitmq·负载均衡·ruby
慕容卡卡7 小时前
你所不知道的RAG那些事
java·开发语言·人工智能·spring boot·spring cloud
dLYG DUMS7 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
Ken_111519 小时前
SpringCloud系列(61)--Nacos之服务配置中心的介绍与使用
spring cloud
Ken_111520 小时前
SpringCloud系列(62)--Nacos之命名空间、分组和DataID三者之间的关系
spring cloud
Ken_11151 天前
SpringCloud系列(63)--Nacos读取不同配置之DataID配置方案
spring cloud
llm大模型算法工程师weng1 天前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
Devin~Y1 天前
从Spring Boot到Spring AI:音视频AIGC内容社区Java大厂面试三轮连环问(含Kafka/Redis/安全/可观测性答案)
java·spring boot·redis·spring cloud·kafka·spring security·resilience4j
qqty12171 天前
springcloud springboot nacos版本对应
spring boot·spring·spring cloud