服务调用

微服务基本组成

Ribbon

简介

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,主要是提供客户端的软件负载均衡算法和服务调用,一句话就是负载均衡+RedisTemplate调用

Ribbon本地负载均衡和Nginx服务端负载均衡区别

  • Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求,负载均衡由服务端调用
  • Ribbon本地负载均衡,在调用服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术

新版的Eureka-Client已经自带了Ribbon了,不用再引入

RedisTemplate

getForObject/postForObject方法:返回对象为响应体中数据转化成的对象,基本上可以说是Json

getForEntity/postForEntity方法:返回对象为ResponseEntity对象,包含响应头,响应码等相关信息

1
2
3
4
5
6
7
8
9
10
@Configuration
public class ApplicationContextConfig{
@Bean
//当有多个服务时不写会报错
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}

IRule

Ribbon自带负载均衡算法接口

Rule接口实现

名称 负载均衡方式
RoundRobinRule 轮询
RandomRule 随机
RetryRule 先按照RoundRobinRule的策略获取服务
如果获取服务失败则在指定时间内会进行重试
WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
BestAvailableRule 先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

基本使用

修改Ribbon默认的负载均衡方式配置,不能和主启动类在一个包下,即不能被@ComponentScan扫描到

自定义规则

1
2
3
4
5
6
7
8
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
//定义为随机
return new RandomRule();
}
}

主启动类上配置注解

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaClient
// name代表访问的微服务是这个,configuration指定不使用默认配置
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}

负载均衡

负载均衡轮询算法

OpenFeign

简介

Feign是一个声明式WebService客户端,使用Feign能让编写WebService客户端更简单

它的使用用方法是定义一个服务接口然后在上面添加注解,Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,使其支持了SpringMVC标准注释和HTTPMessageConverters,Feign可以与Eureka和Ribbon组合使用来负载均衡

Feign概述
Feign和OpenFeign区别

使用

导入pom

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

启动类开启

1
2
3
4
5
6
7
@SpringBootApplication
@EnableFeignClients // 开启Feign
public class FeignOrderMain80 {
public static void main(String[] args) {
SpringApplication.run(FeignOrderMain80.class, args);
}
}

配置接口类

1
2
3
4
5
6
7
8
9
@Component
@FeignClient("CLOUD-PAYMENT-SERVICE") // 指定要调用的微服务名称
public interface PaymentFeignService {
/**
* 和服务端调用的方法一样
*/
@GetMapping("/payment/select/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") long id);
}

Feign使用解析

超时配置

OpenFeign默认等待的时间是1秒钟,超时就报错,因为OpenFeign默认集成了Ribbon,有负载均衡的功能,所以可以在yml文件中设置超时等待时间

1
2
3
4
5
ribbon:
# 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端所用的时间
ReadTimeout: 5000
# 指的是建立连接从服务器读取到可用资源所用的时间
ConnectTimeout: 5000

日志增强

级别 解释
NONE 默认,不显示日志
BASIC 仅记录请求方法、URL、响应状态码及执行时间
HEADERS 除了BASIC中定义的信息外,还有请求和响应的头信息
FULL 除了HEADERS中的信息外,还有请求和响应的正文及元数据

设置配置类

1
2
3
4
5
6
7
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}

添加yml

1
2
3
4
logging:
level:
# Feign日志以什么级别监控那个接口
top.jtxyh.feign.service.PaymentFeignService: debug

相关文章

SpringCloud

服务注册与发现

SpringCloud-GateWay工具类

SpringCloud-OpenFeign问题

SpringQuartz动态定时任务

DockerCompose常用软件配置

Redis集群搭建

redis分布式锁

服务链路追踪

K8S