Spring cloud无缝集成Feign的使用示例详解

 更新时间:2023年12月21日 14:25:28   作者:福  
这篇文章主要为大家介绍了Spring cloud无缝集成Feign的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Feign的作用

Feign是Netflix公司开发的声明式web客户端组件,Spring对Feign做了无缝集成:

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Eureka, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign.

可以通过Feign注解或JAX-RS注解使用,Feign也支持拔插式的编解码。Spring Cloud增加了对Spring MVC注解的支持,并且在SpringMVC项目中默认使用HttpMessageConverters 转换器。同时,Spring Cloud集成了Eureka、Spring Cloud LoadBalancer等组件,以提供在使用Feign组件时的负载均衡。

为什么要使用Feign

由于Spring6.0之后有了自己的Web客户端组件,所以在Spring Cloud2022之后,Spring官方其实是在逐步的移除Feign、而使用自己的Web客户端组件作为替代。

但是不管是谁,我们项目中都需要一个比RestTemplate更加灵活的Web客户端组件。因为RestTemplate使用起来确实非常不方便:

public User getUserByRestTemplate(){
        String url="http://userservice/user/getUser";
        System.out.println("url"+url);
//        int c = 1/0;
        return restTemplate.getForObject(url,User.class);

    }

应用中会有很多地方需要调用微服务userservice的接口,每一个调用的地方都需要写url,代码会显得非常凌乱、不优雅、不易维护。

Feign可以完美解决以上RestTemplate的问题,尤其是Spring Cloud整合Eureka和Spring LoadBalancer之后,还可以轻松实现负载均衡。

Feign的使用

pom文件引入openfeign

我们以前面几篇文章的案例为基础,在Eureka、Spring LoadBalancer、Hystrix框架基础上搭建Feign。

首先在orderservice模块下,pom文件引入openFeign:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>orderservice</artifactId>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>userService</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

orderService启动类启用FeignClients

在orderService的启动类中通过@EnableFeignClients注解启用FeignClient:

package com;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

RestTemplate就可有可无了,无需理会。

编写FeignClient接口

创建一个接口文件UserService

@FeignClient(name="userservice",path="/user")
public interface IUserService {
    @GetMapping("/getUser")
    public User getUser();
}

通过@FeignClient注解,指定当前接口是一个FeignClient的接口文件,其中name属性指定其对应的微服务名称,path指定对该服务的访问路径。

接口方法支持SpringMVC的注解,比如@GetMapping、@PostMapping等等,相当于是在访问当前服务下的Controller方法一样。这为程序员在微服务环境下的服务调用提供了极大的方便,使得微服务调用变的轻而易举。

尤其,这个接口是不需要我们去实现的,由Feign在Spring Cloud服务启动过程中通过代理实现并自动注入到Spring Ioc容器中。所以我们在应用中可以直接通过自动装配引用。

回想一下MyBatis,和Mapper接口是否很类似?

对接口方法的调用

找到我们以前通过RestTemplate调用userservice服务的应用,通过@AutoWired注解自动装配IUserService ,直接调用接口方法getUser():

@Service
@Slf4j
public class OrderService {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private IUserService userService;
    public String getOrder(){
        //通过userService获取user信息
//        User user = getUserByRestTemplate();
        User user = getUserByFeign();
//        System.out.println(user);
        return user.getName();
    }
    public User getUserByRestTemplate(){
        String url="http://userservice/user/getUser";
        System.out.println("url"+url);
//        int c = 1/0;
        return restTemplate.getForObject(url,User.class);
    }
    public User getUserByFeign(){
        return userService.getUser();
    }
}

测试

分别启动Eureka模块、orderservice模块、userservice模块:

浏览器访问测试:

说明Feign已经正常工作。

反复刷新访问:

说明Spring LoadBalancer已经正常工作。

在使用RestTemplate作为WEB客户端的时候,我们需要通过@LoadBalanced注解来启用Spring LoadBalancer负载均衡,但是FeignClient并不需要做什么,自动集成了负载均衡。

集成Hystrix

orderService服务的Controller中增加@HystrixCommand配置:

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
    @Autowired
    OrderService orderService;
    @Autowired
    FallbackHandle fallbackHandle;
    @GetMapping("/getOrder")
    @HystrixCommand(fallbackMethod = "fallback",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
    })
    public String getOrder(){
        log.info("Come here to get Order....123===");
        return orderService.getOrder();
    }
    public String fallback(){
        return "orderService服务异常";
    }
}

然后userservice的getUser方法添加sleep使其超时:

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Value("${server.port}")
    private String serverPort;
    @GetMapping("/getUser")
    @HystrixCommand(fallbackMethod = "fallback",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "8000")
    })
    public User getUser(){
        log.info("userController's getuser comming......");
        User user=new User();
        user.setName("zhangsan from:"+serverPort);
        try{
            log.info("I am sleepint for 10 second");
            Thread.sleep(10*1000);
            log.info("I weekup");
        }catch (Exception e){
        }
        return user;
    }
    public User fallback(){
        User user=new User();
        user.setName("userService服务异常");
        return user;
    }
}

前端访问验证:

如果修改userService的@HystrixCommand超时时长参数为2秒,则:


说明Hystrix组件已经可以正常工作,与Feign组件进行了无缝集成。

Spring cloud feign官网:https://cloud.spring.io/spring-cloud-openfeign/reference/html...

以上就是Spring cloud无缝集成Feign的使用示例详解的详细内容,更多关于Spring cloud无缝集成Feign的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Spring Cache使用Redisson分布式锁解决缓存击穿问题

    详解Spring Cache使用Redisson分布式锁解决缓存击穿问题

    本文主要介绍了详解Spring Cache使用Redisson分布式锁解决缓存击穿问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 分享java中设置代理的两种方式

    分享java中设置代理的两种方式

    有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http、https、ftp、socks代理。比如在IE浏览器设置代理,这里简单介绍下,需要的朋友可以参考下
    2015-12-12
  • JAVA参数传递方式实例浅析【按值传递与引用传递区别】

    JAVA参数传递方式实例浅析【按值传递与引用传递区别】

    这篇文章主要介绍了JAVA参数传递方式,结合实例形式分析了java按值传递与引用传递区别及相关操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 浅谈为什么阿里巴巴要禁用Executors创建线程池

    浅谈为什么阿里巴巴要禁用Executors创建线程池

    这篇文章主要介绍了浅谈为什么阿里巴巴要禁用Executors创建线程池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 深入解读Java三大集合之map list set的用法

    深入解读Java三大集合之map list set的用法

    集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合适用于不同的场合,这篇文章带你了解Java的三大集合map、list、set用法
    2021-11-11
  • Java中的@Accessors使用详解

    Java中的@Accessors使用详解

    这篇文章主要介绍了Java中的@Accessors使用详解,@RequiredArgsConstructor是Lombok的一个注解,简化了我们对setter和getter方法操作,它可以作用在类上,也可以作用在类的单个属性上,需要的朋友可以参考下
    2024-01-01
  • Java中LinkedHashSet的源码分析

    Java中LinkedHashSet的源码分析

    这篇文章主要介绍了Java中LinkedHashSet的源码分析,LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,同时也实现了 Set 接口,与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性,需要的朋友可以参考下
    2023-09-09
  • 关于MyBatis的foreach标签常用方法

    关于MyBatis的foreach标签常用方法

    这篇文章主要介绍了关于MyBatis的foreach标签常用方法,foreach 标签可以用来遍历数组、列表和 Map 等集合参数,实现批量操作或一些简单 SQL 操作,需要的朋友可以参考下
    2023-05-05
  • JAVA自定义注解详情

    JAVA自定义注解详情

    这篇文章主要介绍了Java自定义注解,结合实例形式总结分析了java常见的自定义注解类型、功能、用法及操作注意事项,需要的朋友可以参考下
    2021-10-10
  • 带你了解10道java入门面试题

    带你了解10道java入门面试题

    面试题相信大家都不陌生,想要一个好的工作面试题必不可少的,下面和小编一起来学习与了解Java当中有有些什么面试题吧,希望能给你带来帮助
    2021-08-08

最新评论