Feign&Gateway

Feign

RestTemplate调用服务出现的问题
在这里插入图片描述

  1. 掺杂非业务代码
  2. url难以维护

Feign是一个声明式的http请求客户端,可以帮助我们优雅的实现http请求发送

搭建

  1. 在服务中添加pom依赖
<!--feign客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 启动类添加注解@EnableFeignClients
  2. 添加调用客户端的接口
/**
 * 调用userservice客户端的接口
 *
 * @author Deevan
 */
@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  1. 在业务中注入userClient,并实现远程调用userservice服务
    @Autowired
    private UserClient userClient;

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        //根据id查询订单
        Order order = orderService.queryOrderById(orderId);
        //利用feign远程调用
        User user = userClient.findById(order.getUserId());
        //将user加入order并返回
        order.setUser(user);
        return order;
    }

相关配置

在这里插入图片描述

优化

使用连接池,减少开销
在这里插入图片描述
连接池配置

  1. 引入依赖
<!--feign连接池HttpClient-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
  1. 配置连接池
feign:
  client:
    config:
      default: #defult全局配置
        loggerLevel: BASIC #基本的请求和响应
  httpclient:
    enabled: true #开启Feign对HttpClient的支持
    max-connections: 200 #最大连接数
    max-connections-per-route: 50 #每个路径的最大连接数

Feign的最佳实现

在这里插入图片描述
在这里插入图片描述
引入依赖会引入不需要的client接口
在这里插入图片描述
项目的启动类只会扫描到自己项目类路径下的类,但是要扫描feign-api下的包。方式一将所有包扫描,方式二指定扫描
在这里插入图片描述

@MapperScan("com.xn2001.order.mapper")
@SpringBootApplication
//扫描feign-api中包和开启feign的自动化功能
@EnableFeignClients(clients = UserClient.class, defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {

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

    /**
     * 将RestTemplate注入spring容器
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Gateway

网关

在这里插入图片描述

  • zuul:基于Servlet,阻塞式编程
  • springCloudGateway:基于spring提供的WebFlux,响应式编程,性能好

搭建网关

创建一个module gateway并加入依赖,创建启动类

<!--Nacos服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

编写配置:创建application.yml

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: user-service #路由标识
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言:判断请求是否符合规范
            - Path=/user/** #判断路径是否以user开头
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

在这里插入图片描述

路由断言工厂

在这里插入图片描述
使用
在这里插入图片描述

网关过滤器

路由过滤器

在这里插入图片描述

默认过滤器

在这里插入图片描述

全局过滤器

在这里插入图片描述

/**
 * 登录过滤器
 *
 * @author Deevan
 */
//过滤器优先级,越小越高
@Order(-1)
@Component
public class LoginFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        //获取参数中author参数
        String auth = params.getFirst("author");
        if ("admin".equals(auth)) {
            //方行
            return chain.filter(exchange);
        }
        //拦截,返回状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

过滤器执行顺序

在这里插入图片描述
先看order值,值相等比较过滤器类型
在这里插入图片描述

跨域

在这里插入图片描述
在这里插入图片描述

Feign原理

  1. 在使用Openfeign时首先会在springboot的启动类上添加@EnableFeignClients注解,该注解会导入FeignClientsRegistrar类,会去扫描所有的带有@FeignClient
  2. 解析到 @FeignClient 修饰类后,会最终注册一个 FeignClientFacotoryBean 进入 Spring 容器
  3. Spring 容器在初始化其他用到@FeignClient 接口的类时, 获得的是 FeignClientFacotryBean 产生的一个代理对象 Proxy
  4. 这个代理对象的调用, 都会被统一转发给 Feign 框架所定义的一个 InvocationHandler, 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Gateway中使用Feign进行调用,需要执行以下步骤: 1. 添加Feign的依赖 在Gateway的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 创建Feign Client 创建一个Feign Client接口,该接口定义了调用远程服务的方法。例如: ```java @FeignClient(name = "service-hello") public interface HelloFeignClient { @GetMapping("/hello") String sayHello(); } ``` 其中,@FeignClient注解指定了服务名称,GetMapping注解指定了调用的接口路径。 3. 在Gateway中配置Feign Client 在Gateway的配置文件中,添加以下配置: ```yaml spring: cloud: gateway: routes: - id: hello-service uri: lb://service-hello predicates: - Path=/hello/** filters: - RewritePath=/hello/(?<segment>.*), /$\{segment} - name: RequestRateLimiter args: key-resolver: "#{@userKeyResolver}" redis-rate-limiter.replenishRate: 1 redis-rate-limiter.burstCapacity: 2 metadata: remote_ip: 127.0.0.1 uri: http://localhost:8080 feign: name: service-hello context-path: /hello ``` 其中,feign.name的值与HelloFeignClient接口中的@FeignClient的name值相同。 4. 注入Feign Client实例 在Gateway的控制器中注入HelloFeignClient实例,然后就可以像调用本地服务一样调用远程服务了。例如: ```java @RestController public class HelloController { @Autowired private HelloFeignClient helloFeignClient; @GetMapping("/hello") public String hello() { return helloFeignClient.sayHello(); } } ``` 以上就是在Gateway中使用Feign进行调用的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnndmeRedis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值