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

相关推荐
此木|西贝2 小时前
【设计模式】享元模式
java·设计模式·享元模式
李少兄2 小时前
解决Spring Boot多模块自动配置失效问题
java·spring boot·后端
bxlj_jcj3 小时前
JVM性能优化之年轻代参数设置
java·性能优化
八股文领域大手子3 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
不当菜虚困3 小时前
JAVA设计模式——(八)单例模式
java·单例模式·设计模式
m0_740154673 小时前
Maven概述
java·maven
吗喽对你问好4 小时前
Java位运算符大全
java·开发语言·位运算
Java致死4 小时前
工厂设计模式
java·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式
程序员JerrySUN4 小时前
驱动开发硬核特训 · Day 21(上篇) 抽象理解 Linux 子系统:内核工程师的视角
java·linux·驱动开发