ZHE知识库 ZHE知识库
首页
JAVA
中间件
易学
小说漫画
其他
Source (opens new window)
首页
JAVA
中间件
易学
小说漫画
其他
Source (opens new window)
  • JUC入门笔记
  • JVM入门笔记
  • Java微服务

    • 服务发现
    • 远程调用
      • OpenFeign
        • 配置类
        • 服务降级
        • 日志级别
    • 负载均衡
    • 服务保护
    • 网关组件
    • 分布式事务
  • Netty笔记
  • Java
  • Java微服务
张涵哲
2024-09-03
目录

远程调用

最基本的远程调用,可以向 IOC 容器中添加RestTemplate并配合@LoadBalanced注解,使其可以用服务名发起请求,底层通过LoadBalancerInterceptor请求拦截器,取出服务名后获取到服务地址列表

# OpenFeign

OpenFeign 优化了 RestTemplate 在代码中拼接 URL 的使用体验,可以使用 MVC 注解实现远程调用

Maven依赖

<!-- OpenFeign,如果请求报错可能需要单独引入loadBalancer组件 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- 其他依赖 可选项 -->

<!-- okhttp的feign连接池 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

<!-- httpclient的feign连接池 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

配置文件

feign:
  client:
    config:
      default:       # default代表全局配置
        loggerLevel: NONE     # NONE不打印日志(默认值)
        connectTimeout: 5000  # 连接超时时间
        readTimeout: 5000     # 读取超时时间
			practice-sys:  # 仅对系统服务生效
        loggerLevel: BASIC  # 打印基础日志
  httpclient:    # 让OpenFeign使用ApacheHttpClient连接池,需自己引入maven依赖
    enable: true    # 启用httpClient开关
    max-connections: 2000   # 最大连接数
    max-connections-per-route: 50    # 单个路径最大连接数
  okhttp:        # 让OpenFeign使用okhttp连接池,需自己引入maven依赖,与httpclient选一即可
    enable: true    # 启用okhttp开关
  compression:   # 数据压缩配置
    request:
      enabled: true    # 启用请求压缩
    response:
      enabled: true    # 启用响应解压缩
  sentinel:
    enabled: true      # OpenFiegn启用Sentinel服务保护组件
  hystrix:
    enabled: false     # OpenFiegn关闭Sentinel服务保护组件

启动类代码

@EnableDiscoveryClient
@MapperScan("site.hanzhe.practice.sys.mapper")
@EnableFeignClients(basePackages = "site.hanzhe.practice.api")     // 启用OpenFeign并扫描包
@SpringBootApplication(scanBasePackages = "site.hanzhe.practice")
public class PracticeSysApp {

    public static void main(String[] args) {
        SpringApplication.run(PracticeSysApp.class, args);
    }

}

Feign代码

@FeignClient(value = "practice-shop", path = "/order")
public interface ShopOrderFeign {

    @GetMapping("/listByUser/{userId}")
    R<List<ShopOrder>> listByUser(@PathVariable Integer userId);

}

# 配置类

@Configuration
public class FeignConfig {

    @Bean
    public RequestInterceptor requestInterceptor() {
        // OpenFeign 请求发起之前执行的操作
        return requestTemplate -> {
            System.out.println("发起请求:" + requestTemplate.url());
            requestTemplate.header("token", "xxxx.xxxx.xxxx");
        };
    }

}

# 服务降级

服务降级是指当系统资源不足时临时取消一些不重要的功能,返回最简单的结果,优先将资源分配给主要功能,可以通过fallback或者fallbackFactory属性来实现降级功能

需要注意的是,使用降级必须要整合 Sentinel 或者 hystrix 并在配置文件中设置enable: true才能生效

fallback

使用@FeignClient注解的fallback属性指向降级类并编写降级方法即可实现降级功能

@FeignClient(name = "practice-shop", path = "/order", fallback = ShopOrderFeignFallback.class)
public interface ShopOrderFeign {
    @GetMapping("/listByUser/{userId}")
    R<List<ShopOrder>> listByUser(@PathVariable Integer userId);
}

@Component
public class ShopOrderFeignFallback implements ShopOrderFeign {
    @Override
    public R<List<ShopOrder>> listByUser(Integer userId) {
        return new R.Ok(ListUtil.empty());
    }
}

fallbackFactory

或者使用fallbackFactory属性实现FallbackFactory降级工厂类,可以获取到 OpenFeign 的异常信息让我们知道为什么会走到降级

@FeignCLient(value = "practice-shop", path = "/order", fallbackFactory = ShopOrderFeignFallbackFactory.class)
public interface ShopOrderFeign {
    @GetMapping("/listByUser/{userId}")
    R<List<ShopOrder>> listByUser(@PathVariable Integer userId);
}

@Component
public class ShopOrderFeignFallbackFactory implements FallbackFactory<ShopOrderFeign> {
    @Override
    public ShopOrderFeign create(Throwable cause) {
        return new ShopOrderFeign() {
            @Override
            public R<List<ShopOrder>> listByUser(Integer userId) {
                return new R.Ok(ListUtil.empty());
            }
        };
    }
}

# 日志级别

级别 效果
NONE 默认值,表示不打印任何日志
BASIC 记录请求时间,响应时间,请求耗时
HEADERS 在 BASIC 基础上,记录请求头,响应头信息
FULL 在 HEADERS 基础上,记录请求体信息,响应体信息
  1. 配置文件:通过feign.client.config.xxx.loggerLevel配置,xxx 写为 default 时为全局生效,写服务名时对该服务生效
  2. 注解:创建一个配置类,不需要加入 IOC 容器,类中使用 @Bean 返回Logger.level对象
    1. @EnableFeignClients(defaultConfiguration = xxx.class)为全局生效
    2. @FeignClient(configuration = xxx.class)为指定服务生效
上次更新: 2024-12-06, 17:32:54
服务发现
负载均衡

← 服务发现 负载均衡→

Theme by Vdoing | Copyright © 2023-2025 Zhe | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式