【SpringCloud】(九):Feign的自定义配置
上篇文章介绍了Feign以及它的基本使用,下面我们来完成Feign的定义配置,可以类比Ribbon的自定义的配置方式;
配置中也存在@Configuration和@ComponentScan冲突,不要把Configuration的类配置在@ComponentScan能扫描的路径
根据文档内容来自定义Feign;
1.启动类
package com.dynamic.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class ComsumerMovieFeignApplication { public static void main(String[] args) { SpringApplication.run(ComsumerMovieFeignApplication.class, args); } }
2.Controller
package com.dynamic.cloud.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import com.dynamic.cloud.entity.User; import com.dynamic.cloud.feign.FeignClient2; import com.dynamic.cloud.feign.UserFeignClient; @RestController public class MovieController { @Autowired private UserFeignClient userFeignClient; @Autowired private FeignClient2 feignClient2; @GetMapping("/movie/{id}") public User findById(@PathVariable Long id) { return this.userFeignClient.findById(id); } @GetMapping("/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName")String serviceName) { return this.feignClient2.findServiceInfoFromEurekaByServiceName(serviceName); } }
Controller中注入了两个FeignClient ,分别配置不同的@Configuration。
一个是UserFeignClient:调用用户微服务。
一个是FeignClient2:通过传入用户微服务的ServicId 从Eureka中获取信息。
UserFeignClient
package com.dynamic.cloud.feign; import org.springframework.cloud.netflix.feign.FeignClient; import com.dynamic.cloud.entity.User; import com.dynamic.config.FooConfiguration; import feign.Param; import feign.RequestLine; @FeignClient(name="microservice-provider-user",configuration = FooConfiguration.class) public interface UserFeignClient { @RequestLine("GET /simple/{id}") public User findById(@Param("id") Long id); }
配置类:FooConfiguration
package com.dynamic.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import feign.Contract; import feign.Logger; @Configuration public class FooConfiguration { @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
Logger.Level.FULL设置打印日志的级别
FeignClient2
package com.dynamic.cloud.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.dynamic.config.AuthConfiguration; @FeignClient(name="xxx",url="http://localhost:8761/",configuration=AuthConfiguration.class) public interface FeignClient2 { @RequestMapping(value="/eureka/apps/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName") String serviceName); }
配置类:AuthConfiguration
设置 Eureka Server的访问的用户名和密码
package com.dynamic.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import feign.auth.BasicAuthRequestInterceptor; @Configuration public class AuthConfiguration { @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("user","pass123"); } }