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

相关推荐
Ken_11152 分钟前
SpringCloud系列(49)--SpringCloud Stream消息驱动之实现生产者
spring cloud
rebel29 分钟前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温2 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2742 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
DavidSoCool2 小时前
RabbitMQ使用topic Exchange实现微服务分组订阅
分布式·微服务·rabbitmq
paishishaba2 小时前
Maven
java·maven
张人玉2 小时前
C# 常量与变量
java·算法·c#
Java技术小馆3 小时前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试
Codebee3 小时前
“自举开发“范式:OneCode如何用低代码重构自身工具链
java·人工智能·架构
掘金-我是哪吒3 小时前
分布式微服务系统架构第158集:JavaPlus技术文档平台日更-JVM基础知识
jvm·分布式·微服务·架构·系统架构