代码改变世界

完整教程:SpringCloud-Ribbon负载均衡&Feign声明式服务调用

2026-01-22 12:42  tlnshuju  阅读(0)  评论(0)    收藏  举报

----------------------------------------负载均衡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的介绍

Feign?就是1、什么

springcloud提供的声明式模板化(接口)的http客户端(工作在consumer端口)就是feign
feign支持springmvc注解
feign集成了ribbon也支持负载均衡
feign = RestTemplate + ribbon

2、feign的启动器

spring-cloud-starter-openfeign

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

二、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 # 请求处理的超时时间