1. 回顾java
上文讲解了手动建立Feign,比默认的使用更加灵活。web
本文将讲解Feign对继承、压缩的支持以及日志和多参数请求的构造等。spring
2. Feign对继承的支持json
Feign支持继承。使用继承,可将一些公共操做分组到一些父接口中,从而简化Feign的开发。服务器
尽管Feign的继承可帮助咱们进一步简化开发,可是Spring Cloud指出——一般状况下,架构
不建议服务器端和客户端之间共享接口,由于这种方式会形成服务器端和客户端代码的紧耦合。app
而且,Feign自己并不使用Spring MVC的工做机制(方法参数映射不被继承)。ide
3. Feign对压缩的支持微服务
在一些场景下,可能须要对请求或响应进行压缩,此时可以使用启用Feign的压缩功能。post
其中,feign.compression.request.mime-types 用于支持的媒体类型列表,默认是 text/xml,application/xml,application/json
feign.compression.request.min-request-size用于设置请求的最小阈值,默认是2048
4. Feign的日志
不少场景下,须要了解Feign处理请求的具体细节。
Feign对日志的处理很是灵活,可为每一个Feign客户端指定日志记录策略,每一个Feign客户端都会建立一个logger。
默认状况下,logger的名称是Feign接口的完整类名。须要注意的是,Feign的日志打印只会对DEBUG级别做出响应。
咱们可为每一个Feign客户端配置各自的Logger.Level对象,告诉Feign记录那些日志。Logger.Level的值有如下选择。
> 复制项目 microservice-consumer-movie-feign,将 ArtifactId 修改成 microservice-consumer-movie-feign-logging
> 建立Feign配置类
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignLogConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
> 修改Feign的接口,指定其配置类
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/{id}") User findById(@PathVariable("id") Long id); }
> 在 application.yml 中添加如下内容,指定Feign接口的日志级别为DEBUG(由于Feign的Logger.Level只对DEBUG级别做出响应)
logging: level: com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign.UserFeignClient: DEBUG # 将Feign接口的日志级别设置为DEBUG,由于Feign的Logger.Level只对DEBUG做出响应
> 启动 microservice-discovery-eureka
> 启动 microservice-provider-user
> 启动 microservice-consumer-movie-feign-logging
> 访问 http://localhost:8010/user/1,可在电影微服务的控制台看见以下内容
5. 使用Feign构造多参数请求
5.1 GET请求多参数的URL
http://localhost:8001/get?id=1&username=张三
> 最直观的方法,URL有几个参数,Feign接口就有几个参数
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/get") User findUserByCondi(@RequestParam("id") Long id, @RequestParam("username") String username); }
> 使用 Map 构建。当目标URL参数很是多时,使用Map构建可简化Feign接口的编写
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/get") User findUserByCondi(@RequestParam Map<String, Object> map); }
5.2 POST请求包含多个参数
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @PostMapping(value = "/post") User findUserByCondi(@RequestBody User user); }
6. 总结
这几章讲解了Feign的相关知识。
下文将讲解使用Hystrix实现微服务的容错处理。敬请期待~~~
7. 参考
周立 --- 《Spring Cloud与Docker微服务架构与实战》