1、pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<!--客户端只有当我们有了这个依赖之后,才能有那些状态页面的查看,否则会报ErrorPage-->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
注意:spring-boot-starter-web依赖必须要有,如果没有的话,会报错
feign的依赖在Finchley版本已经需要使用openfeign,不再是之前的依赖。
2、application.yml
spring:
application:
name: eureka-client-consumer-feign
server:
port: 8603
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3、代码测试
(1)服务提供者部分代码
@Value("${server.port}")
private String port;
@RequestMapping("/getUUid/{i}")
public String getUUid(@PathVariable("i") Integer i){
UUID uuid = UUID.randomUUID();
String s = i + "==="+uuid.toString();
return s;
}
@RequestMapping("/getParam")
public String getParam(@RequestBody String param){
return param;
}
@RequestMapping("/getServerPort")
public String getServerPort(){
return port;
}
(2)feign客户端代码
a、启动类代码
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class EurekaClientCustomerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientCustomerFeignApplication.class, args);
}
}
b、feign接口代码
@FeignClient("eureka-client-provider")
public interface StoreClient {
@RequestMapping(method = RequestMethod.POST,value = "/getUUid/{i}")
public String getUUid(@PathVariable("i") Integer i);
@RequestMapping("/getParam")
public String getParam(String param);
}
注:在@FeignClient下不能使用@GetMappingz这些合成注解,@PathVariable中需要设置值不能省略
c、feign提供服务的代码
@Autowired
StoreClient storeClient;
@RequestMapping("/getResult")
public String getResult(){
String uUid = storeClient.getUUid(3);
return uUid;
}
@RequestMapping("getParamTest")
public String getParamTest(){
String ceshi = storeClient.getParam("你好");
return ceshi;
}
注:
访问返回结果是:
也就是说,我们要携带参数的话,地址栏是可以的。如果要在方法参数中携带参数,那么我们就需要使用@RequestBody的注解。
4、和ribbon一样,feign同样能够覆盖默认的配置
修改的代码:
@FeignClient(name="eureka-client-provider",configuration = FootConfigration.class)
public interface StoreClient {
@RequestLine("GET /getUUid/{i}")
public String getUUid(@PathVariable("i") Integer i);
@RequestLine("POST /getParam")
public String getParam(String param);
}
注:请求部分的注解必须要使用feign自己的注解,不能再使用springmvc的注解,否则就会报错
修改配置的代码:
@Configuration
public class FootConfigration {
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
}
注:这个配置类不能放在启动类的扫描范围之下,否则将会全局起作用。
在中文文档中有针对于哪些配置可以进行更改进行了罗列: