目录
3. 创建⼀个service, 并使⽤Fegin实现微服务调⽤
一、Feign远程调⽤
先来看我们以前利⽤RestTemplate发起远程调⽤的代码:
存在下⾯的问题:
- 代码可读性差,编程体验不统⼀
- 参数复杂URL难以维护
二、Feign简介
Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它使得调⽤远程服务就像调⽤本地服务⼀样简单, 只需要创建⼀个接⼝并添加⼀个注解即可。 Nacos很好的兼容了Feign, Feign 默认集了Ribbon, 所以在Nacos下使⽤Fegin默认就实现了负载均衡的效果官⽅地址: https://github.com/OpenFeign/feign![]()
三、基本使⽤
基于之前ribbon代码的基础上
1. 加⼊Fegin的依赖
<!-- fegin组件 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2. 在主类上添加Fegin的注解
@EnableFeignClients//开启Fegin
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients//开启Fegin public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class); } // // 记得删除 // @Bean // public RestTemplate restTemplate() { // return new RestTemplate(); // } }
3. 创建⼀个service, 并使⽤Fegin实现微服务调⽤
/** * @author zkt * @Version 1.0 * @since 2024/7/26 */ @FeignClient("service-product")//声明调用的提供者的name public interface IProductService { //指定调用提供者的哪个方法 // @FeignClient+@GetMapping 就是一个完整的请求路径 http://service-product/product/{pid} @GetMapping(value = "/product/{pid}") Product findByPid(@PathVariable("pid") Integer pid); }
4. 修改controller代码,并启动验证
@RestController public class OrderController { @Autowired private IProductService productService; @Autowired private IOrderService orderService; //Ribbon下单 @RequestMapping("/order/prod/{pid}") public Order order(@PathVariable("pid") Integer pid) { //通过fegin调用商品微服务 Product product = productService.findByPid(pid); //下单(创建订单) Order order = new Order(); order.setUid(1); order.setUsername("测试用户"); order.setPid(pid); order.setPname(product.getPname()); order.setPprice(product.getPprice()); order.setNumber(1); orderService.createOrder(order); return order; } }
5. 重启order微服务,查看效果
已经集成Ribbon
四、⾃定义配置
Feign可以⽀持很多的⾃定义配置,如下表所示:
类型 作用 说明 feign.Logger.Level 修改日志级别 包含四种不同的级别:NONE、BASIC、HEADERS、FULL feign.codec.Decoder 响应结果的解析器 http远程调用的结果做解析,例如解析json字符串为java对象 feign.codec.Encoder 请求参数编码 将请求参数编码,便于通过http请求发送 feign.Contract 支持的注解格式 默认是SpringMVC的注解 feign.Retryer 失败重试机制 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 ⼀般情况下,默认值就能满⾜我们使⽤,如果要⾃定义时,只需要创建⾃定义的@Bean覆盖默认Bean 即可。
配置⽂件⽅式
基于配置⽂件修改feign的⽇志级别可以针对单个服务:feign: client: config: service-product: # 针对名为 service-product 的微服务 loggerLevel: FULL # 设置日志级别为 FULL
也可以针对所有服务:feign: client: config: default: # 这里使用 default 表示这是全局配置 loggerLevel: FULL # 设置日志级别为 FULL
注意:需要把⽇志级别设置
logging: level: com.zkt: debug
⽽⽇志的级别分为四种:
- NONE:不记录任何⽇志信息,这是默认值。
- BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
五、Feign使⽤优化
Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
- URLConnection:默认实现,不⽀持连接池
- Apache HttpClient :⽀持连接池
- OKHttp:⽀持连接池
因此提⾼Feign的性能主要⼿段就是使⽤连接池代替默认的URLConnection这⾥我们⽤Apache的HttpClient来演示1)引⼊依赖<!--httpClient的依赖 --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
2)配置连接池server: port: 8091 spring: application: name: service-order datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: 123456 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 logging: level: com.zkt: debug feign: client: config: default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL # 日志级别 httpclient: enabled: true # 开启feign对HttpClient的支持 max-connections: 200 # 最大的连接数 max-connections-per-route: 50 # 每个路径的最大连接数
启动测试
总结:
- 1.⽇志级别尽量⽤basic
- 2.使⽤HttpClient或OKHttp代替URLConnection
- 引⼊feign-httpClient依赖
- 配置⽂件开启httpClient功能,设置连接池参数