SpringCloud-Ribbon负载均衡&Feign声明式服务调用

----------------------------------------负载均衡Ribbon----------------------------------------

一、ribbon的介绍

1、什么是ribbon?

ribbon是基于netflix ribbon实现的一个工作在consumer端的负载均衡工具,提供了很多负载均衡策略:轮询、随机

2、ribbon的启动器

nacos已经集成了ribbon,故无启动器

二、ribbon的入门案例

1、开启ribbon

@Bean

/**

* 原理:

* ①拦截器---------"ribbon-provider"----------->List<Service> serviceList

* ②使用ribbon的负载均衡算法-------------serviceList-------------->Service.

* ③把url中的map的key替换为ip、port

*/

@LoadBalanced

public RestTemplate restTemplate(){

return new RestTemplate();

}

2、调用provider

//把ip和port换成map的key

String url = "http://ribbon-provider/provider/getUserById/"+id;

3、指定负载均衡策略

@Bean

public IRule iRule(){

return new RandomRule();

}

三、ribbon的问题

手动拼接url和参数显得好傻

----------------------------------------声明式服务调用Feign----------------------------------------

一、Feign的介绍

1、什么是Feign?

feign是springcloud提供的声明式模板化(接口)的http客户端(工作在consumer端口)

feign支持springmvc注解

feign集成了ribbon也支持负载均衡

feign = RestTemplate + ribbon

2、feign的启动器

spring-cloud-starter-openfeign

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

二、Feign的入门案例

1、创建feign_provider

拷贝ribbon_provider_1

.......

2、创建feign_interface

1)pom.xml

spring-cloud-starter-openfeign

springcloud_common

2)feign接口

package com.hg.feign;

@FeignClient("map的key")

@RequestMapping("/provider")

public interface UserFeign{

@RequestMapping("/getUserById/{id}")

public User getUserById(@PathVariable("id") Integer id);

}

3、创建feign_consumer

1)拷贝ribbon_consumer

2)pom.xml

feign_interface

3)controller

@Autowired

private UserFeign userFeign;

4)app

@EnableFeignClients//开启feign注解扫描

三、feign的工作原理

1、扫描feign接口

@EnableFeignClients开启feign注解的支持:FeignClientsRegistrar.registerFeignClients()扫描添加了@FeignClient注解的接口,并生成代理类交给spring的ioc容器去管理

2、代理类做的事

SynchronousMethodHandler.invoke():创建RequestTemplate(HttpMethod、UriTemplate、Body)

四、feign的传参方式

1、restful参数

@PathVariable("id") //例如:/getUserById/520

2、?传参

@RequestParam("id") //例如:/updateUserById?id=520

3、pojo

@RequestBody //例如:{id:250, name:"刘亦菲", age:18}

五、feign优化

1、开启feign的日志

logging:

level:

com.hg.feign: debug #log4j的日志级别,"com.hg.feign"feign的包名

feign:

client:

config:

default:

#feign-provider:

loggerLevel: full #开启feign的日志

2、GZIP压缩

①开启浏览器和consumer之间的压缩

server:

compression:

enabled: true #开启浏览器--->consumer的gzip压缩

②开启consumer和provider之间的压缩

feign:

compression:

request:

enabled: true #开启consumer--->provider的gzip压缩

response:

enabled: true

3、http连接池

<dependency>

<groupId>io.github.openfeign</groupId>

<artifactId>feign-httpclient</artifactId>

</dependency>

4、负载均衡

@Configuration

public class FeignConfig {

@Bean

public IRule iRule(){

return new WeightedResponseTimeRule();

}

}

5、feign超时

方式一:

ribbon:

ReadTimeout: 5000 # 请求连接的超时时间

ConnectionTimeout: 5000 # 请求处理的超时时间

方式二:

feign:

client:

config:

#default:

feign-provider:

ConnectTimeout: 5000 # 请求连接的超时时间

ReadTimeout: 5000 # 请求处理的超时时间

相关推荐
楠枬14 小时前
负载均衡 -LoadBalance
后端·spring·spring cloud·负载均衡
今天你TLE了吗14 小时前
Java:基于注解实现去重表消息防止重复消费
java·spring boot·分布式·spring cloud·幂等
卓码软件测评1 天前
第三方软件验收评测机构【Gatling安装指南:Java环境配置和IDE插件安装】
java·开发语言·ide·测试工具·负载均衡
A Mr Yang1 天前
JAVA 对比老、新两个列表,找出新增、修改、删除的数据
java·开发语言·spring boot·后端·spring cloud·mybatis
梵得儿SHI1 天前
SpringCloud - 核心组件精讲:Nacos 深度解析(服务注册 + 配置中心一站式实现)
java·spring boot·spring cloud·nacos·微服务架构的核心组件·服务注册发现与配置管理·nacos的核心原理与实战应用
中国胖子风清扬1 天前
Spring AI 深度实践:在 Java 项目中统一 Chat、RAG、Tools 与 MCP 能力
java·人工智能·spring boot·后端·spring·spring cloud·ai
Li_7695322 天前
Spring Cloud —— SkyWalking(五)
java·后端·spring·spring cloud·skywalking
小坏讲微服务2 天前
Spring Cloud Alibaba 微服务整合自定义日志注解完整教程
java·spring cloud·微服务·云原生·架构
小坏讲微服务2 天前
Spring Boot 4.0 新特性整合 MyBatis-Plus 完整教程
java·spring boot·后端·spring cloud·微服务·mybatis·mybatis plus