一 介绍
在某些场景下,自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign。
二 场景
让电影微服务中的同一个Feign接口,使用不同的账号登录,并调用用户微服务的接口。
三 新建项目microservice-consumer-movie-feign-manual
四 去掉Feign接口UserFeignClient上的@FeignClient注解
package com.itmuch.cloud.study.user.feign; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.itmuch.cloud.study.user.entity.User; public interface UserFeignClient { @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User findById(@PathVariable("id") Long id); }
五 去掉启动类上的@EnableFeignClients注解
package com.itmuch.cloud.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ConsumerMovieApplication { public static void main(String[] args) { SpringApplication.run(ConsumerMovieApplication.class, args); } }
六 修改Controller如下:
package com.itmuch.cloud.study.user.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.feign.FeignClientsConfiguration; import org.springframework.context.annotation.Import; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import com.itmuch.cloud.study.user.entity.User; import com.itmuch.cloud.study.user.feign.UserFeignClient; import feign.Client; import feign.Contract; import feign.Feign; import feign.auth.BasicAuthRequestInterceptor; import feign.codec.Decoder; import feign.codec.Encoder; @Import(FeignClientsConfiguration.class) @RestController public class MovieController { private UserFeignClient userUserFeignClient; private UserFeignClient adminUserFeignClient; @Autowired public MovieController(Decoder decoder, Encoder encoder, Client client, Contract contract) { // 这边的decoder、encoder、client、contract,可以debug看看是什么实例。 this.userUserFeignClient = Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract) .requestInterceptor(new BasicAuthRequestInterceptor("user", "password1")).target(UserFeignClient.class, "http://microservice-provider-user/"); this.adminUserFeignClient = Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract) .requestInterceptor(new BasicAuthRequestInterceptor("admin", "password2")) .target(UserFeignClient.class, "http://microservice-provider-user/"); } @GetMapping("/user-user/{id}") public User findByIdUser(@PathVariable Long id) { return this.userUserFeignClient.findById(id); } @GetMapping("/user-admin/{id}") public User findByIdAdmin(@PathVariable Long id) { return this.adminUserFeignClient.findById(id); } }
七 测试
1 启动eueka
2 启动user微服务
3 启动movie微服务
可以正常获得查询结果,同时可以看到用户微服务打印类似以下信息:
当前用户是user,角色是user-role