spring cloud (二)
1、使用Feign实现远程HTTP调用
基于spring cloud (一),使用Feign可以解决一下问题:
1)添加pom依赖
<!-- Feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.0.3</version> </dependency>
2)启动类添加注解
3)创建包、接口
UserCenterFeignClient
@FeignClient(name = "user-center") //name属性的值为服务提供者名称 public interface UserCenterFeignClient { /** * 作用:自动转换成 http://user-center/user?id=xx * @param id * @return com.nicechen.util.ResultUtil */ @RequestMapping(method = RequestMethod.GET, value = "/user/findbyid") ResultUtil findById(@RequestParam("id") Integer id); }
修改 /finduser 接口
@Autowired private UserCenterFeignClient feignClient; @GetMapping("/finduser") public ResultUtil findUser(Integer id){ /*ResultUtil forObject = restTemplate.getForObject("http://user-center/user/findbyid?id={id}", ResultUtil.class,2);*/ return feignClient.findById(id); }
1.1、Feign的组成
1.2、细粒度配置自定义
feign的自定义配置也有两种方式:
- java代码方式
- 配置属性方式
1.2.1、java代码方式
Feign默认不打印日志
1) 创建FeignConfig
//由于父子上下文,如果要加configuration注解,就要把这个类放在启动类所在包外 //@Configuration public class FeignConfig { @Bean public Logger.Level level() { //让 Feign打印所有请求的细节 return Logger.Level.FULL; } }
2)回到UserCenterFeignClient接口,修改注解即可
//指定这个接口是FeignClient @FeignClient(name = "user-center",configuration = FeignConfig.class) public interface UserCenterFeignClient { /** * 作用:自动转换成 http://user-center/user?id=xx * @param id * @return com.nicechen.util.ResultUtil */ @RequestMapping(method = RequestMethod.GET, value = "/user/findbyid") ResultUtil findById(@RequestParam("id") Integer id); }
3)添加配置文件
logging:
level:
#UserCenterFeignClient的全路径,值必须为DEBUG
com.nicechen.feignclient.UserCenterFeignClient: DEBUG
1.2.2、配置属性方式
1)注释掉1.2.1添加的代码
2)配置文件添加配置:
logging: level: #UserCenterFeignClient的全路径,值必须为DEBUG com.nicechen.feignclient.UserCenterFeignClient: DEBUG feign: client: config: #想要调用的微服务的名称 user-center: loggerLevel: full
1.2.3、全局配置
1)注释掉1.2.1以及1.2.2代码,解开FeignConfig注释(如果被注释了)
2)配置文件添加配置:
logging:
level:
#UserCenterFeignClient的全路径,值必须为DEBUG
com.nicechen.feignclient.UserCenterFeignClient: DEBUG
3)启动类修改注解
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
1.3、Feign的配置项
配置文件:
1.4、Feign代码方式 vs 属性方式
2、添加查询、添加数据接口
1)前往user-center添加两个接口
@GetMapping("/findbyidwxid") public ResultUtil findByIdwxId(Integer id, Integer wxId) { return service.findByIdwxId(id, wxId); } @PostMapping("/insert") public ResultUtil insert(@RequestBody User user) { return service.insert(user); }
2)前往centent-center添加Feign接口
@FeignClient(name = "user-center") public interface TestUserFeign { @GetMapping("/user/findbyidwxid")
//多个参数也可以使用 @SpringQueryMap注解,就不需要写多个 @RequestParam注解来一个一个映射 ResultUtil findByIdwxId(@RequestParam("id") Integer id, @RequestParam("wxId") Integer wxId); @PostMapping("/user/insert") ResultUtil insert(@RequestBody User user); }
3)配置文件添加配置,否则新建的Feign接口(TestUSerFeign)不生效,因为默认仅支持一个Fegin接口
#允许多个Feign接口 main: allow-bean-definition-overriding: true
4)添加调用服务接口
@Autowired //这里有个坑,使用@Resource不行 private TestUserFeign userFeign; @GetMapping("/findbyidwxid") public ResultUtil findByIdwxId(Integer id,Integer wxId){ log.info("{}-----{}",id,wxId); return userFeign.findByIdwxId(id,wxId); } @PostMapping("/insert") public ResultUtil insert(@RequestBody User user) { return userFeign.insert(user); }
5)测试。
3、 Feign脱离Ribbon使用
场景:想要调用为注册进入Nacos的服务。
案例:调用百度。
1)添加Feign接口
//没有该服务,name可以自定义,但是要添加url
@FeignClient(name = "baidu", url = "www.baidu.com") public interface TestBaiduFrign { @GetMapping("") String index(); }
2)添加调用百度接口
@Autowired private TestBaiduFrign baiduFrign; @GetMapping("/baidu") public String baidu() { return baiduFrign.index(); }
3)测试调用接口 /baidu。
4、RestTemplate vs Feign
5、Feign性能优化
5.1、配置连接池
1)添加pom依赖
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
2)配置文件添加配置
feign: client: config: #想要调用的微服务的名称 user-center: loggerLevel: full httpclient: #让feign使用阿帕奇 httpclient做请求,而不是默认的urlconnection enabled: true #feign的最大连接数 max-connections: 200 #单个接口最大访问数 max-connections-per-route: 50
5、常见问题