java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Feign

Java远程调用组件Feign技术使用详解

作者:一一哥Sun

Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似

一. 概要

我们知道,现在最火且最有技术含量的技术莫过于SpringCloud微服务了,所以今天壹哥就带大家来学习一下微服务的核心的组件之一,Feign的基本使用及其工作机制。

二. Feign简介

1. 概念

在学习Feign的使用之前,我们先来了解一下什么是Feign。

Feign是Netflix开发的声明式(目前由Spring在维护)、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP Api。

简单地来说,Feign就是一个用于远程调用服务的框架/工具,让开发者可以更少耦合、更少代码、更加快,也更兼容的方法进行远程服务调用。

2. 功能

了解了这些基本概念之后,接下来壹哥就带大家看看Feign组件是如何实现远程接口调用的。废话少说,我们直接上代码。

三. 服务提供者

1. 添加依赖

首先我们在父POM文件中添加核心依赖如下:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring-cloud-alibaba-dependencies.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

然后在子POM文件添加依赖如下:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置文件

application.yml文件中添加如下配置:

server:
  port: 8090
spring:
  application:
    name: nacos-feign-example
  cloud:
    nacos:
      discovery:
        server-addr: 112.74.42.138:8848

3. 启动类

项目的启动类代码如下:

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

4. 控制层

我们可以编写一个Controller控制器,将Web接口定义如下。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    /**
     * 模拟主键自增
     */
    private AtomicInteger pk = new AtomicInteger();
    @PostMappingpublic User save(@RequestBody User user) {
        user.setUid(pk.incrementAndGet());
        return user;
    }
    /**
     * @param uid
     * @return
     */@GetMapping("/{uid}")
    public User user(@PathVariable("uid") int uid) {
        return User.builder()
                .uid(uid)
                .username("admin")
                .password("123456")
                .build();
    }
    @GetMapping("/users")
    public List<User> users(@RequestHeader("token") String token) {
        // 模拟从数据中获取数据
        ArrayList<User> users = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            users.add(User.builder()
                    .uid(i)
                    .username(token + i)
                    .password("123456")
                    .build());
        }
        return users;
    }
    @DeleteMapping()
    public int delete(int uid) {
        log.info("删除用户: {} 成功", uid);
        return 1;
    }
}

5. POJO

这里再定义一个pojo实体类。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
    private Integer uid;
    private String username;
    private String password;
}

四. 服务消费者

1. 添加依赖

消费者服务的核心依赖如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置文件

消费者服务的application.yml配置文件如下:

server:
  port: 8091
spring:
  cloud:
    nacos:
      discovery: 
        server-addr: 你的注册中心IP:8848
      application:
        name: feign-example-01

3. 启动类

消费者服务的启动类代码。

@SpringBootApplication
// 开启Feign
@EnableFeignClients
public class NetflixFeignClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(NetflixFeignClientApplication.class, args);
    }
}

这里也需要定义一个POJO类,代码同上,此处略过。

4. Feign服务

此处我们需要定义一个Feign接口类。

@FeignClient(value = "test-feign-provider", path = "/user")
public interface UserFeignService {
    @PostMapping("/")
    User save(@RequestBody User user);
    @GetMapping("/{uid}")
    User detail(@PathVariable("uid") int uid);
    @DeleteMappingUser delete(@RequestParam int uid);
    @GetMapping("/users")
    List<User> users(@RequestHeader("token") String token);
}

5. 控制层

然后我们也需要在消费者服务中定义一个Controller接口。

@RestController
@RequestMapping("/feign")
public class FeignController {
    @Resource
    UserFeignService userFeignService;
    /**
     *  传递复杂的对象 json格式
     * 127.0.0.1:8091/feign/register
     */@PostMapping("/register")
    public User register(@RequestBody User user) {
        return userFeignService.save(user);
    }
    /**
     * 127.0.0.1:8091/feign/1
     */@GetMapping("/{uid}")
    public User detail(@PathVariable int uid) {
        return userFeignService.detail(uid);
    }
    /**
     * 127.0.0.1:8091/feign/users
     * 
     */@GetMapping("/users")
    public List<User> users(@RequestHeader String token) {
        return userFeignService.users(token);
    }
}

代码编写完毕后,我们需要将服务提供者和服务消费者两个项目都启动起来,然后进行测试。

五. 测试

1. 测试get请求

2. 测试post请求json数据格式

3. 测试头部中包含信息

通过测试我们就可以发现,测试我们已经实现了在服务消费者中原创调用服务提供者里的接口,从而实现了接口的远程调用。

到此这篇关于Java远程调用组件Feign技术使用详解的文章就介绍到这了,更多相关Java Feign内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文