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

相关推荐
ChinaRainbowSea6 分钟前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
lmryBC4916 分钟前
golang接口-interface
java·前端·golang
ゞ 正在缓冲99%…16 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
橘猫云计算机设计29 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢33 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
程序媛学姐42 分钟前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
向阳2561 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj1 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南1 小时前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong1 小时前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式