【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");
}
}
