文章目录
一、Ribbon
1.什么是负载均衡?
2.负载均衡的演示
总结:Ribbon其实就是一个软负载均衡的客户端组件,
他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
你之前使用的Eureka,在导入Eureka时就已经引入了Ribbon(所以不用引库也能实现Ribbon)
3.怎么用?
Ribbon是用在客户端 的 负载均衡的工具——我们写的案例里面服务器就是8001和8002那些服务的provider,客户端就是80那个客户端消费者。Ribbon是用在客户端的,所以就是修改80的代码即可。具体使用就是:负载均衡+RestTemplate调用。
1.getForObject方法 和 getForEntity方法 的区别
2. postForObject 和 postForEntity
3.实例演示
基于Eureka的集群配置
二、Ribbon面试常考的知识
1.Ribbon自带的负载规则
2.Ribbon负载规则的替换
Ribbon是用在客户端 的 负载均衡的工具——我们写的案例里面服务器就是8001和8002那些服务的provider,客户端就是80那个客户端消费者。Ribbon是用在客户端的,所以就是修改80的代码即可。所以对cloud-consumer-order80做出如下的修改:
1.新加MySelfRule.java
@Configuration
public class MySelfRule
{
@Bean
public IRule myRule()
{
return new RandomRule();//定义为随机
}
}
2.修改主启动类
主启动类添加@RibbonClient
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class) //意思就是让CLOUD-PAYMENT-SERVICE使用我自定义的那个负载均衡方法
public class OrderMain80
{
public static void main(String[] args)
{
SpringApplication.run(OrderMain80.class,args);
}
}
3.测试
3.轮询算法的原理
负载规则默认使用的就是轮询算法,它的原理是什么呢?
4.轮询算法源码分析
5.Ribbon之手写轮询算法
面试中问的肯定就是你有没有手写过一个Ribbon的负载算法。
三、OpenFeign
1.OpenFeign的简介
Feign在消费端使用,使用方式就是在Consumer的微服务接口上添加@FeignClient注解
2.OpenFeign的具体使用
1.建Module
2.改pom
<dependencies>
<!--openfeign,openFeign里面自带ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般基础通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.写yml
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
4.主启动类
@SpringBootApplication
@EnableFeignClients //由EnableFeignClients开启业务类的@FeignClient注解
public class OrderFeignMain80
{
public static void main(String[] args)
{
SpringApplication.run(OrderFeignMain80.class,args);
}
}
5.业务类
service接口:
/**
* 业务逻辑接口上添加@FeignClient配置调用provider服务
* FeignClient(value = "CLOUD-PAYMENT-SERVICE") 意思就是找"CLOUD-PAYMENT-SERVICE"里面的8001和8002
*/
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService
{
@GetMapping(value = "/payment/get/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
控制层Controller
@RestController
public class OrderFeignController
{
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
{
return paymentFeignService.getPaymentById(id);
}
}
6.测试
先启动2个eureka集群7001/7002;
再启动2个微服务8001/8002;
最后启动OpenFeign的80端
项目自带负载配置功能
7.执行流程
3.OpenFeign超时控制
我们上面看到了,消费者的接口 调用 服务端的Controller 那就一定会存在超时问题,
1.服务方8001的Controller新写一个方法
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeOut()
{
//故意暂停3秒钟
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return serverPort;
}
2.消费方80的接口里添加超时方法
3.消费方80的Controller添加超时方法
4.测试
默认Feign客户端只等待一秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端不想等待了,直接返回报错。
为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。
5.修改80的yml
4.OpenFeign的日志打印
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。
说白了就是对Feign接口的调用情况进行监控和输出
4种日志级别:
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
- FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
1.写配置类
2.yml开启日志
3.测试