002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡

前文地址:
001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控

文章目录

8.Feign远程调用、loadbalancer负载均衡整合

1.OpenFeign整合

1.引入依赖

注意:由于openfeign高版本使用loadbalancer负载均衡而不是ribbon,所以需要引入loadbalancer依赖排除ribbon,否则会报错

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
xml 复制代码
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
2.启动类添加@EnableFeignClients注解
3.yml配置
yaml 复制代码
#由于feign高版本使用loadbalancer负载均衡,排除了ribbon,所以超时时间不能使用ribbon配置
feign:
  #开启feign对sentinel支持
  sentinel:
    enabled: true
  #feign gzip压缩配置
  compression:
    request:
      enabled: true
      # 配置压缩的类型
      mime-types: text/xml,application/xml,application/json
      # 最小压缩值
      min-request-size: 2048
    response:
      enabled: true
  client:
    config:
      #服务名称
      cloud-production:
        # 连接超时时间
        connectTimeout: 90000
        # 请求处理超时时间
        readTimeout: 90000
      # default 全局配置,可以用服务名配置单个服务
      default:
        #日志级别,BASIC就是最基本的请求和响应信息
        loggerLevel: BASIC

springboot全局压缩配置

yaml 复制代码
server:
  # gzip压缩配置
  compression:
    min-response-size: 512
    mime-types: application/json,application/xml,text/html,text/xml,text/plain
    excluded-user-agents: gozilla,traviata
    enabled: true
4.日志配置

方式一

yaml 复制代码
#日志收集
logging:
  #feign日志配置
  level:
    com.moshangshang.cloud.clean.feign.ProductionFeign: debug  #扫描的是你那个service的类全类名,也可扫包

方式二

yaml 复制代码
feign:
  client:
    config:
      default:
        #日志级别,BASIC就是最基本的请求和响应信息
        loggerLevel: BASIC

方式三

java 复制代码
@Configuration
public class FeignConfig {

    /**
     * feign日志配置
     */
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }

}

单个远程调用使用

java 复制代码
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)

全局使用

java 复制代码
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
5.远程调用测试

1.fegin调用接口

java 复制代码
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)
public interface ProductionFeign {

    @GetMapping("/cloud-production/test1")
    String test1();

}

2.调用方法

java 复制代码
@RestController
@RequestMapping("/cloud-clean")
public class CleanController {

    @Autowired
    private ProductionFeign productionFeign;

    @GetMapping("/test1")
    public void test1(){
        String s = productionFeign.test1();
        System.out.println("远程调用接收到的数据"+s);
    }

}

3.被调用服务方法

java 复制代码
@RestController
@RequestMapping("/cloud-production")
public class ProductionController {

    @GetMapping("/test1")
    public String test1(){
        System.out.println("test1 被调用了");
        return "111";
    }

}

4.测试结果

6.服务降级

1.编写降级工厂类

java 复制代码
/**
 * 服务降级
 */
@Slf4j
@Component
public class ProductionFallbackFactory implements FallbackFactory<ProductionFeign> {
    @Override
    public ProductionFeign create(Throwable cause) {
        log.error("服务异常。。。。。。。。。。。。。。。。。。。" + cause);
        return new ProductionFeign() {
            @Override
            public String test1() {
                return "Fallback回滚";
            }

        };
    }
}

2.使用

java 复制代码
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class)
7.重试配置,服务端异常捕获
java 复制代码
@Slf4j
@Configuration
public class FeignConfiguration {

    /**
     * 自定义重试机制
     */
    @Bean
    public Retryer feignRetryer() {
        //最大请求次数为5,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为1s,
        return new Retryer.Default();
    }

    /**
     * 客户端捕获服务端异常
     */
    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() == 400) {
                log.error("请求xxx服务400参数错误,返回:{}", response.body());
            }

            if (response.status() == 409) {
                log.error("请求xxx服务409异常,返回:{}", response.body());
            }

            if (response.status() == 404) {
                log.error("请求xxx服务404异常,返回:{}", response.body());
            }

            // 其他异常交给Default去解码处理
            // 这里使用单例即可,Default不用每次都去new
            return new ErrorDecoder.Default().decode(key, response);
        };
    }

}
java 复制代码
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class,configuration = MyConfiguration.class)
8.连接池配置
xml 复制代码
      <!--使用连接池-->
      <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
yaml 复制代码
feign:
  httpclient:
    # 支持httpClient的开关
    enabled: true
    #最大连接数
    max-connections: 200
    # 单个路径的最大连接数
    max-connections-per-route: 50

2.Loadbalancer负载均衡测试

1.复制客户端
2.修改端口启动
3.测试

默认 轮询方式调用

4.修改负载均衡算法

1.创建核心配置类

java 复制代码
@Configuration
public class RestTemplateConfig {
 
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
 
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        // 获取负载均衡器的名称
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 创建并返回一个随机负载均衡器实例
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

}

2.使用

java 复制代码
@LoadBalancerClient(value = "cloud-production", configuration = RestTemplateConfig.class)

自带三个算法,轮询,随机和nacos

相关推荐
杨DaB16 分钟前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
YA33317 分钟前
java基础(九)sql基础及索引
java·开发语言·sql
桦说编程37 分钟前
方法一定要有返回值 \ o /
java·后端·函数式编程
小李是个程序1 小时前
登录与登录校验:Web安全核心解析
java·spring·web安全·jwt·cookie
David爱编程1 小时前
Java 创建线程的4种姿势,哪种才是企业级项目的最佳实践?
java·后端
hrrrrb2 小时前
【Java Web 快速入门】十一、Spring Boot 原理
java·前端·spring boot
Java微观世界2 小时前
Object核心类深度剖析
java·后端
MrSYJ2 小时前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
hinotoyk2 小时前
TimeUnit源码分享
java
AAA修煤气灶刘哥3 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端