
** Feign是一个声明式的http客户端,官方地址: https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决.上面提到的问题。**

<!-- feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>

@EnableFeignClients

//请求服务的昵称
@FeignClient("userservice")
public interface UserClient {
// 定义一个方法,方法的返回值就是你要的结果
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.用Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
同时Feign还集成了负载均衡的功能。

它调用了Spring Cloud Netflix-Ribbon方法Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松的将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Ribbon内置了7种负载均衡算法,并且保留了扩展,用户可通过实现 IRule接口,实现自定义负载均衡算法,具体内容可以参考我之前的文章,
`BestAviableRule
跳过熔断的Server,在剩下的Server中选择并发请求最低的Server。
ZoneAvoidanceRule
随机选择一个server。
AvailabilityFilteringRule
剔除因为连续链接、读失败或链接超过最大限制导致熔断的Server,在剩下读Server中进行轮询。
RoundRobinRule
roundRobin方式轮询选择server,默认。
RandomRule
随机选择一个server。
RetryRule
可重试的策略,可以对其他策略进行重试。
ResponseTimeWeightedRule
根据响应时间加权,响应时间越短权重越大,被选中的可能性越高。


全局生效方式
feign:
client:
config:
default:
loggerlevel: FULL
设置FULL会把所有的请求记录输出包括请求体

通过bean的方式来使用

单独创建一个bean类,在类上添加当前服务的注解也就对当前服务生效。
package cn.itcast.feign.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
@FeignClient("userservice")
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
全局生效设置要在启动类上配置注解。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

Feign的日志配置:
1.方式- 是配置文件, feign.client.config.xxx.loggerLevel
①如果xxx是default则代表全局
②如果xxx是服务名称,例如userservice则代表某服务
2.方式二是java代码配置Logger.Level这个Bean
①如果在@EnableFeignClients注解声明则代表全局
②如果在@FeignClient注解中声明则代表某服务

<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数


缺点就是得在重新写一次方法。

优点耦合低。全部封装到一个独立模块中,后面直接调用即可,缺点是会把不必要的方法也封装进来。

新建一个module

导入Feign依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>

直接把Feign接口还有实体类和bean都抽取过来
抽取完成后还要引入我们这个类,不然会找不到方法。
<!--引入feign的统一api-->
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
@EnapLeFeignClients(basePackages = “cn. itcast . feign. clients”)
方式二:指定FeignClient字节码.
@EnabLeFeignClients(clients = {UserClient . class})

如果不指定会导致扫不到包注入失败
