目录
Feign注册使用
Feign日志配置
Feign性能优化
Feign最佳实践
怎样优化FeignClient与消费者服务之间的调用?
因为FeignClient不在订单服务中了,所以是扫描不到它的,问怎样扫描?
Feign注册使用
Feign作用:用来代替RestTemplate,来调用远程服务的;
Fegin内部集成了负载均衡ribbon
使用步骤
1.先在主启动类中加@EnableFeignClients,声明开启Feign,可以调用其他服务
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)//声明feign自动装配开关:开
2.pom.xml+openFeign依赖,因为自己使用Feign调用远程服务
org.springframework.cloud
spring-cloud-starter-openfeign
3.创建声明一个Feign客户端,里面是调用远程服务的方法(需要声明被调用的服务是哪一个)
@FeignClient(name="userservice")//声明式Feign客户端,需要声明服务名
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
Feign日志配置
第一种:在yaml中进行日志配置
feign: # 配置日志
client:
config:
default:
loggerLevel: FULL # 日志级别,basic:就是基本的请求以及想要信息
第二种:使用java代码进行日志配置:
创建一个类,@Bean定义,并给@EnableFeignClients注解声明或者是给@FeignClient注解声明,前者是声明全局,后者是某个服务
package cn.itcast.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
在主启动类中的@EnableFeignClients()声明默认的Configuration
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//声明feign自动装配开关:开
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
// @Bean
// public IRule randomRule(){
// return new RandomRule();
// }
//
}
*:可以发现在yaml中配置日志配置,优先级大于java代码配置
Feign性能优化
Feign客户端实现默认是URLConnection,是不支持连接池的,我们可以在yaml配置文件中修改Feign客户端实现——>HttpClient:
feign: # 配置日志
httpclient:
enabled: true #支持HttpClient开关
max-connections: 200 #最大连接数
max-connections-per-route: 50 #单个路径的对哒连接数
如果要配置Feign日志(针对某个服务,还是全局看你自己咯),这边建议自定义一个bean返回日志,然后再在@EnableFeignClient还是@EnableClient中配置默认配置类即可;
Feign最佳实践
第一种:
紧耦合,因为都继承为一个父接口,它一改,他的子类都得动;
第二种:
将FeignClient抽取出来,并把这个接口有关的pojo和Feign配置都放在一个单独的模块中,提供给消费者使用:(之前我们是一个消费者调用一个FeignClient,如果是多个消费者调用同一个提供者服务,那么FeignClient就要被重复启动多次)
作用:放在单独一个模块有利于减少代码冗余,任务减轻;
总结区别:
一个是服务者的controller和被调用的FeignClient用同一个接口,另外一个是Feign有关的全部放在一个模块中给服务者调用->方便其他的服务调用;
怎样优化FeignClient与消费者服务之间的调用?
我们演示第二种,将FeignClient与Pojo和Feign的配置全部放在一个全新的Feign服务中,有利于其他服务的调用;
1.这是调用Feign-API模块前,订单服务的样子
2.创建Feign模块
将服务者需要调用的Feign客户端放在Feign模块中,还有Feign配置及其pojo
@FeignClient(name="userservice")//声明式Feign客户端,需要声明服务名
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
package cn.itcast.feign.pojo;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String address;
}
3.不要忘记加入Feign客户端依赖
org.springframework.cloud
spring-cloud-starter-openfeign
4.最后再在订单服务(消费者服务中)import即可,并且在pom.xml中导入Feign-api模块jar包
cn.itcast.demo
feign-api
1.0
因为FeignClient不在订单服务中了,所以是扫描不到它的,问怎样扫描?



