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


经验分享 程序员 微信小程序 职场和发展