目录
客户端负载均衡_负载均衡策略
服务接口调用_OpenFeign概述
服务接口调用OpenFeign_入门案列
服务接口调用OpenFeign_日志增强
服务接口调用OpenFeign_超时机制
客户端负载均衡_负载均衡策略
以前的Ribbon有多种负载均衡策略
RandomRule - 随性而为
解释:随机
RoundRobinRule - 按部就班
解释: 轮询
RetryRule - 卷土重来
解释: 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试。
WeightedResponseTimeRule - 能者多劳
这个Rule继承自RoundRibbonRule,他会根据服务节点的响应时间计算权重,响应时间越长权重就越低,响应越快则权重越高,权重的高低决定了机器被选中概率的高低。也就是说,响应时间越小的机器,被选中的概率越大。
解释: 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
BestAvailableRule - 让最闲的人来
解释: 应该说这个Rule有点智能的味道了,在过滤掉故障服务以后, 它会基于过去30分钟的统计结果选取当前并发量最小的服务节点,也就是最“闲”的节点作为目标地址。如果统计结果尚未生成,则采用轮询的方式选定节点。
AvailabilityFilteringRule - 我是有底线的
这个规则底层依赖RandomRobinRule来选取节点,但并非来者不拒,它也是有一些底线的,必须要满足它的最低要求的节点才会被选中。如果节点满足了要求,无论其响应时间或者当前并发量是什么,都会被选中。
解释: 每次AvailabilityFilteringRule(简称AFR)都会请求RobinRule 挑选一个节点,然后对这个节点做以下两步检查:是否处于不可用,节点当前的active请求连接数超过阈值,超过了则表示节点目前太忙,不适合接客如果被选中的server不幸挂掉了检 查,那么AFR会自动重试(次数最多10次),让RobinRule重新选择一个服务节点。
ZoneAvoidanceRule - 我的地盘我做主
解释: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
但LoadBalancer只提供了两种负载均衡器
1、RandomLoadBalancer 随机
2、RoundRobinLoadBalancer 轮询
注意: 不指定的时候默认用的是轮询
实时效果反馈
1.下列是轮询负载均衡策略的是____。
A RandomLoadBalancer
B RoundRobinLoadBalancer
C ZoneAvoidanceRule
D AvailabilityFilteringRule
2.下列是随机负载均衡策略的是_____。
A RandomLoadBalancer
B RoundRobinLoadBalancer
C ZoneAvoidanceRule
D AvailabilityFilteringRule
服务接口调用_OpenFeign概述
OpenFeign是什么
Spring Cloud OpenFeign用于Spring Boot应用程序的声明式REST 客户端。
OpenFeign能干嘛
Feign旨在使编写Java Http客户端变得更容易。前面在使用 RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。
OpenFeign和Feign两者区别
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和 HttpMessageConverters。
注意: 接口+注解。
实时效果反馈
1.Spring Cloud OpenFeign主要作用是____。
A 负载均衡
B 解决单点故障
C 服务调用
D 注册中心
2. Spring Cloud OpenFeign支持了_____标准注解。
A Spring MVC
B Spring Data
C Spring Batch
D 以上都错误
服务接口调用OpenFeign_入门案列
构建cloud-consumer-feign-order80工程
修改POM文件
<!-- 引入OpenFeign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
编写YML文件
eureka:
client:
# 表示是否将自己注册到Eureka Server
register-with-eureka: true
# 示是否从Eureka Server获取注册的服务信息
fetch-registry: true
# Eureka Server地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: cloud-openfeign-order-consumer
prefer-ip-address: true
spring:
application:
# 设置应用名词
name: cloud-openfeign-order-consumer
server:
port: 80
编写主启动类
/**
* 主启动类
*/
@Slf4j
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class,args);
log.info("**************OrderFeignMain80 服务启动成功 **********");
}
}
编写业务逻辑接口PaymentFeignService
/**
* 支付远程调用Feign接口
*/
@Component
@FeignClient(value = "cloud-payment-provider")
public interface PaymentFeignService {
@GetMapping("/payment/index")
String index();
}
编写控制层Controller
/**
* 订单控制层
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private PaymentFeignService paymentFeignService;
/**
* 测试OpenFeign接口调用
* @return
*/
@GetMapping("/index")
public String get(){
return paymentFeignService.index();
}
}
测试
1 先启动2个Eureka集群7001/7002
2 在启动服务提供者payment8001
3 在启动服务消费者cloud-consumer-feign-order
4 浏览器访问http://localhost/order/index
服务接口调用OpenFeign_日志增强
OpenFeign虽然提供了日志增强功能,但是默认是不显示任何日志的,不过开发者在调试阶段可以自己配置日志的级别。
OpenFeign的日志级别如下:
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置类中配置日志级别
@Configuration
public class OpenFeignConfig{
/**
* 日志级别定义
*/
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
注意: 这里的logger是feign包里的。
yaml文件中设置接口日志级别
logging:
level:
com.itbaizhan.service: debug
注意: 这里的 com.tong.service 是openFeign接口所在的包名,当然你也可以配置一个特定的openFeign接口。
测试
请求http://localhost/order/index
服务接口调用OpenFeign_超时机制
超时机制
问题:
1、服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一 直等待下去。
2、在某个峰值时刻,大呈的请求都在同时请求服务消费者,会造成线程的大呈堆积,势必会造成雪崩。
3、利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问, 则自动断开连接。
配置超时时间
# 默认超时时间feign: client: config:
default: # 连接超时时间
connectTimeout: 2000 # 读取超时时间
readTimeout: 2000
/** * 测试超时机制 * @return */
@GetMapping("timeout")
public String paymentFeignTimeOut()
{
try {
TimeUnit.SECONDS.sleep(5);
} catch(InterruptedException e)
{
e.printStackTrace();
}
return "payment success";
}
服务消费方80添加超时方法PaymentFeignService
@FeignClient("CLOUD-PAYMENT-PROVIDER")
public interface PaymentFeignService
{
@GetMapping("/payment/index")
String index();
@GetMapping("/payment/timeout")
String timeout();
}
服务消费方80添加超时方法OrderController
/** * 测试超时机制 * @return */
@GetMapping("timeout")
public String timeout()
{
return paymentFeignService.timeout();
}
实时效果反馈
1. OpenFeign技术中给服务设置超时时间解决___问题。
A 安全性
B 速度
C 响应慢
D 服务雪崩
2. OpenFeign技术中如何设置服务的读取超时时间_____。
A feign.client.config.default.readTimeout
B feign.client.config.connectTimeout
C feign.client.config.default.read
D feign.client.config.default.Timeout