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

相关推荐
Lojarro13 分钟前
JavaEE基础之- Servlet相关
java·servlet·java-ee
KingDol_MIni35 分钟前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
许苑向上39 分钟前
Java八股文(下)
java·开发语言
逸Y 仙X44 分钟前
Git常见命令--助力开发
java·大数据·git·java-ee·github·idea
独孤求败Ace1 小时前
第44天:Web开发-JavaEE应用&反射机制&类加载器&利用链&成员变量&构造方法&抽象方法
java·开发语言
FLZJ_KL1 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
CL_IN1 小时前
企业数据集成:实现高效调拨出库自动化
java·前端·自动化
计算机-秋大田1 小时前
基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)
java·开发语言·spring boot·后端·spring·课程设计
计算机毕设指导61 小时前
基于SpringBoot的城乡商城协作系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
华子w9089258591 小时前
基于数据可视化+SpringBoot+安卓端的数字化施工项目计划与管理平台设计和实现
java·spring boot·后端