Spring Cloud 之Feign

前言

Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。在Java程序中,只需要在方法前加上@FeignClient注解,Feign就会自动创建一个HTTP客户端,向指定的URL发送请求。

核心概念

1、注解:在服务接口方法上使用注解来描述HTTP请求和参数信息。比如@GetMapping、@PostMapping等。

2、配置:在服务接口或方法上使用配置来描述HTTP请求的配置信息。比如@RequestParam来描述请求参数、@RequestHeader来描述请求头信息等。

3、拦截器:在服务接口或方法上使用拦截器来处理HTTP请求和响应。比如Feign的ErrorDecoder用于处理请求异常、Logger用于记录请求和响应日志等。

底层原理

1、动态代理:Feign使用了动态代理技术,在运行时根据注解和配置生成代理对象,从而实现对HTTP请求的封装和处理。

2、负载均衡:Feign支持多种负载均衡策略,比如随机、轮询、最少活跃调用等。通过在服务接口或方法上添加@LoadBalanced注解,即可开启负载均衡功能。

3、连接管理:Feign使用了连接池技术来管理HTTP连接,以提高请求性能。通过在配置文件中设置connection-pooling参数,可以启用连接池功能。

4、自定义拦截器:Feign支持自定义拦截器,通过实现Feign.Builder中的Interceptor接口,可以实现对HTTP请求和响应的处理。

Feign实战项目代码

1、首先,你需要定义一个 Feign 接口,声明了所有需要调用的方法和参数。

public  interface  UserService  {

     @GetMapping("/user/{id}")   
     User  getUserById(@PathVariable  Long  id);

     @PostMapping("/user")   
     User  addUser(@Valid  @RequestBody  User  user);

     @PutMapping("/user/{id}")   
     User  updateUser(@PathVariable  Long  id,  @Valid  @RequestBody  User  user);

     @DeleteMapping("/user/{id}")   
     void  deleteUser(@PathVariable  Long  id);   
}

在上面的代码中,我们定义了一个 UserService 接口,它包含了四个方法:getUserById、addUser、updateUser 和 deleteUser。

2、接下来,你需要定义一个 Feign 配置类,用于配置 Feign 的实例。这个类需要指定 Feign 的实例地址和端口号。

@Configuration   
public  class  FeignConfig  {

     @Value("${api.url}")   
     private  String  apiUrl;

     @Bean   
     public  RestTemplate  restTemplate()  {   
         RestTemplate  restTemplate  =  new  RestTemplate();   
         restTemplate.setConnectionFactory(new  NioRestTemplate());   
         return  restTemplate;   
     }

     @Bean   
     public  FeignClientFactory  userServiceFactory()  {   
         FeignClientFactory  clientFactory  =  new  FeignClientFactory<>();   
         clientFactory.setRestTemplate(restTemplate());   
         return  clientFactory;   
     }   
}

在上面的代码中,我们定义了一个名为 apiUrl 的配置属性,用于指定 Feign 的实例地址。然后,我们定义了一个名为 restTemplate 的 Bean,用于创建 Feign 的实例。

3、最后,你需要在 Spring Cloud 项目中创建一个 Feign 客户端,用于调用远程服务。

@RestController   
@RequestMapping("/api")  {

     @Autowired   
     private  FeignClientFactory  userServiceFactory;

     @GetMapping   
     public  User  getUserById(@PathVariable  Long  id)  {   
         User  user  =  userServiceFactory.getClient().getUserById(id);   
         return  user;   
     }

     @PostMapping("/user")   
     public  User  addUser(@Valid  @RequestBody  User  user)  {   
         User  addedUser  =  userServiceFactory.getClient().addUser(user);   
         return  addedUser;   
     }

     @PutMapping("/user/{id}")   
     public  User  updateUser(@PathVariable  Long  id,  @Valid  @RequestBody  User  user)  {   
         User  updatedUser  =  userServiceFactory.getClient().updateUser(id,  user);   
         return  updatedUser;   
     }

     @DeleteMapping("/user/{id}")   
     public  void  deleteUser(@PathVariable  Long  id)  {   
         userServiceFactory.getClient().deleteUser(id);   
     }   
}

在上面的代码中,我们定义了一个名为 api 的 RestController,它包含了五个接口,分别是 getUserById、addUser、updateUser、deleteUser 和 deleteUser。

通过以上步骤,你就可以在 Spring Cloud 项目中使用 Feign 实现服务间调用了。

你可能感兴趣的:(spring,cloud,spring,后端)