2、服务的负载与调用(Ribbon,OpenFeign)
1、Ribbon的使用与原理
ibbon是基于Netflix Ribbon实现的一套客户端(消费者使用的),负载均衡的工具
Ribbon:负载均衡+RestTemplate调用
在引入eureka的时候就会自动的引入Rabbion
Ribbon的核心组件是IRule
Irule:根据特定的算法在服务列表里面选取一个要访问的服务
注意:自定义配置类不能够放在@ComponentScan扫描的当前包下以及子包下,否则这个自动配置的类就会被所有的客户端共享,达不到特殊定制的目的
自定义算法步骤:
在main类扫描不到的包下创建爱你一个类
@Configuration
public class MySelRule {
public IRule myRule(){
return new RandomRule();
//定义为随机的
}
//默认是轮询的
}
在main上设置一个使用的方法
@RibbonClient(value = "CLOUD-ORDER-SERVICE",configuration = MySelRule.class)
负载均衡算法:rest接口第几次请求服务器集群的数量=实际调用服务器的位置下标,
每次服务器重启之后rest接口数从1开始
2、OpenFeign
前面使用的是Ribbon与RestTemplate进行请求处理,但是在实际的开发中由于对服务的依赖调用可能不止一处,往往一个接口会被对出进行调用所以通常会针对每个微服务自行封装一些客户端的类来包装这些一依赖服务的调用,所以对于Fegin来说我们只需要创建一个接口使用注解的方式来进行配置即可
Feign集成了Ribbon维护类Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡,但是对于Feign来说只需要定义服务绑定接口并且以声明式的方法
现在feign已经不在维护现在使用的是OpenFeign(是作用于消费端的)
OpenFeign 的搭建与配置
<!--搭建OpenFeign 的jar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--还是以Eureka作为注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
这里还是以Eureka作为注册中心
在主启动类上面使用
@EnableFeignClients
在服务类(消费者)上面使用
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
表明想要访问的提供者的地址
整体思路:
引入配置文件之后定义一个接口这个接口能够被容器扫描并且能够开启Feign注解,表明开启Feign并且识别那个提供这的而服务,访问提供者的那个方法并且在只启动类里面开启支持Feign的注解
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService
{
@GetMapping(value = "/select/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
// @GetMapping(value = "/payment/feign/timeout")
// public String paymentFeignTimeout();
}
@RestController
@Slf4j
public class OpenFeignController {
@Autowired
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/select/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
}
注意这里的启动类之所以不需要添加EnableEurekaClient是因为后面已经支持只需要配置配置环境和配置文件就可以不需要在添加注解了
超时设置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
#ribbon:
# #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
# ReadTimeout: 5000
# #指的是建立连接后从服务器读取到可用资源所用的时间
# ConnectTimeout: 5000
日志打印功能:
日志级别:
1、NONE:默认的不显示日志
2、BASE:仅权限请求的方法,URL,响应状态码以及执行时间
3、HEADERS:除了BASIC中定义信息之外,还有请求和响应的头信息
4、Full 除了HEADDERS中定义的信息之外,还有请求和响应的正文以及元数据
创建配置文件
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
配置yml
logging:
level:
# Feign日志以什么级别监控一个接口
com.ljx.service.PaymentFeignService: debug