软件开发定制定制【微服务】(九)—— Feign

目录



一、简介  

Feign软件开发定制定制是一个声明式 WebService 客户端,软件开发定制定制使用能够让编写Web Service 软件开发定制定制客户端更加简单,软件开发定制定制它的使用方法是定义一个接口,软件开发定制定制然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可插拔式的编码器和解码器。

  Spring Cloud 对 Fiegn 进行了封装,使其支持了Spring MVC 标准注解和、HttpMessageConverts。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

开源项目地址:

二、Feign简单应用

1)pom.xml引入Feign的依赖

  1. <!--feign客户端依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

2)代码改造

1、启动类添加注解 @EnableFeignClients

2、 添加调用Feign接口 

  1. package com.cloud.order.clients;
  2. import com.cloud.order.pojo.User;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. /**
  7. * @author :jizhibing
  8. * @date :Created in 2022/4/20
  9. * @description
  10. */
  11. @FeignClient("userservice")
  12. public interface UserClient {
  13. @GetMapping("/user/{id}")
  14. User queryById(@PathVariable("id") Long id) ;
  15. }

3、 调用Service修改

  1. package com.cloud.order.service;
  2. import com.cloud.order.clients.UserClient;
  3. import com.cloud.order.mapper.OrderMapper;
  4. import com.cloud.order.pojo.Order;
  5. import com.cloud.order.pojo.User;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.web.client.RestTemplate;
  10. @Service
  11. public class OrderService {
  12. @Autowired
  13. private OrderMapper orderMapper;
  14. @Autowired
  15. private UserClient userClient ;
  16. public Order queryOrderById(Long orderId) {
  17. // 1.查询订单
  18. Order order = orderMapper.findById(orderId);
  19. //2.用Feign远程调用
  20. User user = userClient.queryById(order.getId());
  21. //3.封装User到Order
  22. order.setUser(user);
  23. // 4.返回
  24. return order;
  25. // } public Order queryOrderById(Long orderId) {
  26. // // 1.查询订单
  27. // Order order = orderMapper.findById(orderId);
  28. // //2.利用restTemplate 发起http请求,查询用户
  29. String url = "http://localhost:8881/user/"+order.getId();
  30. // String url = "http://userserver/user/"+order.getId();
  31. // User user = restTemplate.getForObject(url,User.class);
  32. // //3.设置用户信息
  33. // order.setUser(user);
  34. // // 4.返回
  35. // return order;
  36. }
  37. }

三、Feign的自定义配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

类型

作用

说明

feign.Logger.Level

修改日志级别

包含四种不同的级别:NONE,BASIC,HEADERS,FULL

feign.code.Decoder

响应结果的解析器

http远程调用的结果做解析,例如解析json字符串为java对象

Feign.code.Encoder

请求参数编码

将请求参数编码,便于通过http请求发送

Feign.Contract

支持的注解格式

默认是SpringMVC的注解

Feign.Retryer

失败重试机制

请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

 一般我们需要配置的就是日志级别。

Feign日志配置有2种方式:

1)方式一:基于配置

1、全局生效:

  1. feign:
  2. client:
  3. config:
  4. default: #这里的default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
  5. loggerLevel: FULL #日志级别

2、局部生效:

  1. feign:
  2. client:
  3. config:
  4. userservice: #这里的default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
  5. loggerLevel: FULL #日志级别

日志:

 2)方式二:java代码方式

  • 1、先声明一个Bean
  1. public class FeignClientConfiguration {
  2. @Bean
  3. public Logger.Level feignLogLevel(){
  4. return Logger.Level.BASIC ;
  5. }
  6. }
  • 2、如果是全局配置,则把它放到 @EnableFeignClients 这个注解里

@(defaultConfiguration = FeignClientConfiguration.class)

  • 3、如果是局部变量,则把它放到 @FeignClient 这个注解里

@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)

 四、Feign 的

Feign底层的客户端实现:

  • URLConnection: 默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OkHttp:支持连接池

因此优化Feign的性能包括:

  • 1、使用连接池替代默认的URLConnection
  • 2、日志级别,最好用BASIC或者NONE

1)连接池配置

1、依赖引入:

  1. <!--httpClient的依赖-->
  2. <dependency>
  3. <groupId>io.github.openfeign</groupId>
  4. <artifactId>feign-httpclient</artifactId>
  5. </dependency>

2、配置连接池:

  1. feign:
  2. client:
  3. config:
  4. default: #这里的default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
  5. loggerLevel: FULL #日志级别
  6. httpclient:
  7. enabled: true #开启feign对httpClient对支持
  8. max-connections: 200 #最大对连接数
  9. max-connections-per-route: 50 #每个路径对最大连接数

2)日志级别

      日志级别尽量BASIC

  1. feign:
  2. client:
  3. config:
  4. default: #这里的default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
  5. loggerLevel: BASIC #日志级别

五、Feign的最佳实践

方式一(继承):

给消费者的FeignClient和提供者的Controller定义统一的父接口作为标准。 

方式二(抽取):

将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有的消费者使用

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发