SpringCloud学习笔记(三)

112 阅读1分钟

5.openFeign

5.1. 简介

  • Feign是一个声明式的Web Service客户端,使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个接口,然后在上面添加注解.
  • 可插拔的注解支持,包括Feign注解和JAX-RS注解.
  • 支持可插拔的编码器和解码器.
  • 支持Sentinel和Fallback
  • 支持SpringCloudLoadBalancer的负载均衡
  • 支持HTTP请求和响应的压缩

5.2. 服务架构

架构图

服务消费者 -》 OpenFeign -》 服务提供者

5.3.快速上手

服务提供者:nacos-pay-provider

@RestController
public class PayAlibabaController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/pay/nacos/{id}")
    public ResultData<String> getPayInfo(@PathVariable("id") Integer id) {
        return ResultData.success("nacos registry serverPost: " + serverPort + ", id: " + id) ;
    }

}

feign api:nacos-feign-api

@FeignClient(value = "nacos-pay-provider") //微服务对应application.name
public interface PayFeignApi {

    @GetMapping("/pay/nacos/{id}")
    public ResultData<String> getPayInfo(@PathVariable("id") Integer id);

}

服务消费者:cloud-consumer-openfeign-order

@RestController
public class OrderController {
    @Resource
    private PayFeignApi payFeignApi;

    @GetMapping(value = "/feign/pay/nacos/{id}")
    public ResultData<String> getOrder(@PathVariable("id") Integer id){
        System.out.println("feign add order");
        return payFeignApi.getPayInfo(id);
    }
}

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启feign客户端
public class MainOpenFeign80 {
    public static void main(String[] args) {
        SpringApplication.run(MainOpenFeign80.class,args);
    }
}

5.4. OpenFeign超时控制

  • OpenFeign默认等待60s,超过60s就会报错,可以通过配置文件修改超时时间。
openfeign:
  client:
    config:
      default: # 设置feign客户端超时时间
        connectTimeout: 5000
        readTimeout: 5000
      nacos-pay-provider: # 为nacos-pay-provider服务单独设置超时时间
        connectTimeout: 5000
        readTimeout: 5000

5.5. OpenFeign重试机制

  • OpenFeign默认是没有重试机制的,需要手动配置。
  • 默认不开启OpenFeign重试机制

import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer(){
        return Retryer.NEVER_RETRY;
    }
}
  • 开启OpenFeign重试机制
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer(){
        return new Retryer.Default(100, 1000, 3);
    }
}

5.6. OpenFeign httpclient配置

  • OpenFeign默认使用的是HttpURLConnection,没有连接池,性能较差,可以切换为Apache HttpClient5
5.6.1. 引入依赖
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version>
</dependency>
5.6.2. 配置文件
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    openfeign:
      client:
        config:
          default: # 设置feign客户端超时时间
            connectTimeout: 5000
            readTimeout: 5000
          nacos-pay-provider: # 为nacos-pay-provider服务单独设置超时时间
            connectTimeout: 5000
            readTimeout: 5000
  httpclient:
    hc5:
      enabled: true

5.7. OpenFeign请求响应压缩

  • OpenFeign支持对请求和响应进行GZIP压缩,减少通信过程的性能损耗。
  • 细粒度设置:指定压缩的请求数据类型并设置请求压缩的大小下限,超过大小才进行压缩。
  • 配置文件
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    openfeign:
      compression:
        request:
          enabled: true
          min-request-size: 2048 # 请求压缩的最小值
          mime-types: text/xml,application/xml,application/json # 请求压缩的MIME类型
        response:
          enabled: true

5.8. OpenFeign日志

  • OpenFeign提供了日志打印功能,方便开发人员排查问题。
5.8.1. 日志级别

级别

说明

NONE

不记录任何日志

BASIC

只记录请求方法、URL、响应状态码及执行时间

HEADERS

在BASIC的基础上,记录请求和响应的头信息

FULL

在HEADERS的基础上,记录请求和响应的正文信息

5.8.2. 配置日志
  • 配置类
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}
  • 配置文件
logging:
  level:
    org:
      example:
        cloud:
          apis:
            org.example.cloud.apis.PayFeignApi: debug

6.Micrometer

6.1. 简介

  • 在微服务框架中,一个由客户端发起的请求,可能会经过多个微服务,每个微服务又可能调用多个其他微服务,形成了一个复杂的调用链路,任何一环出现高延时或错误都会引起整个请求最后的失败。
  • Micrometer分布式链路追踪,就是将一次分布式请求还原成一个调用链路,对每个环节进行日志记录和性能监控,并将一次分布式请求的调用情况集中web展示从而让我们可以直观地发现错误发生在哪个环节,以及耗时主要耗费在哪个环节,便于我们快速定位问题。

6.2.分布式链路原理

  • 基于Spring Cloud Sleuth实现分布式链路追踪,Sleuth可以记录一次分布式请求的调用链路,并生成一个全局唯一的TraceID,用于标识一次分布式请求(链路),同时还会生成多个SpanID,用于标识一次分布式请求的多个阶段(请求信息)。

6.3.Zipkin

  • Zipkin是一个分布式链路追踪系统,可以收集分布式系统的服务调用数据,并生成可视化的调用链路图,方便开发人员排查问题。
  • Zipkin由两部分组成:Collector和Storage,Collector负责接收服务调用数据,Storage负责存储服务调用数据,并提供查询接口。
  • Zipkin还提供了Web UI,用于展示服务调用链路图。
6.3.1. 安装
  • 下载Zipkin

登录官网下载jar包

  • 运行Zipkin
java -jar zipkin-server-3.4.4-exec.jar

访问http://localhost:9411/zipkin/

6.3.2. 集成
  • 引入依赖
<!--micrometer-tracing一系列包  -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bom</artifactId>
    <version>${micrometer-tracing.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing</artifactId>
    <version>${micrometer-tracing.version}</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
    <version>${micrometer-tracing.version}</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-observation</artifactId>
    <version>${micrometer-observation.version}</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-micrometer</artifactId>
    <version>${feign-micrometer.version}</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
    <version>${zipkin-reporter-brave.version}</version>
</dependency>
  • 服务配置文件
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 # 采样率默认为0.1(十次记录一次),值越大收集越及时