创建工程
调用用户微服务
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itmuch.cloud</groupId>
<artifactId>microservice-consumer-movie-feign-customizing</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 引入spring boot的依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
<!-- 引入spring cloud的依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
说明:
1)加入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
application.yml
server:
port: 8010
spring:
application:
name: microservice-consumer-movie
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
说明:
1)基本跟其他一样,不变;
User
package com.itmuch.cloud.study.user.entity;
import java.math.BigDecimal;
public class User {
private Long id;
private String username;
private String name;
private Integer age;
private BigDecimal balance;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
public BigDecimal getBalance() {
return this.balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
说明:
1)用户实体;
FeignConfiguration
com.itmuch.cloud.config.FeignConfiguration
package com.itmuch.cloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Contract;
/**
* 该类为Feign的配置类
* 注意:该不应该在主应用程序上下文的@ComponentScan中。
*/
@Configuration
public class FeignConfiguration {
/**
* 将契约改为feign原生的默认契约。这样就可以使用feign自带的注解了。
* 用feign.Contract.Default替换SpringMvcContract契约
* @return 默认的feign契约
*/
@Bean
public Contract feignContract() {
//Spring Cloud Netflix默认的SpringMvcController将替换为feign.Contract.Default。
return new feign.Contract.Default();
}
}
说明:
1)该类为Feign的配置类;
2)注意:该不应该在主应用程序上下文的@ComponentScan中。
3)将契约改为feign原生的默认契约。这样就可以使用feign自带的注解了,用feign.Contract.Default替换 SpringMvcContract契约;
UserFeignClient
com.itmuch.cloud.study.user.feign.UserFeignClient
package com.itmuch.cloud.study.user.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import com.itmuch.cloud.config.FeignConfiguration;
import com.itmuch.cloud.study.user.entity.User;
import feign.Param;
import feign.RequestLine;
/**
* 使用@FeignClient的configuration属性,指定feign的配置类。
* 使用@FeignClient的configuration属性指定配置类,同时,将findById上的Spring MVC注解修改为Feign自带的注解。
*/
@FeignClient(name = "microservice-provider-user", configuration = FeignConfiguration.class)
public interface UserFeignClient {
/**
* 使用feign自带的注解@RequestLine
* @see https://github.com/OpenFeign/feign
* @param id 用户id
* @return 用户信息
*/
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);
}
说明:
1)使用@FeignClient的configuration属性,指定feign的配置类;
2)同时,将findById上的Spring MVC注解修改为Feign自带的注解;
3)使用feign自带的注解@RequestLine;
MovieController
com.itmuch.cloud.study.user.controller.MovieController
package com.itmuch.cloud.study.user.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.itmuch.cloud.study.user.entity.User;
import com.itmuch.cloud.study.user.feign.UserFeignClient;
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
}
测试
启动相关服务,略,具体前面其他文章,
http://localhost:8010/user/1
小结1
1)SpringCloud中覆写Feign的默认配置,用feign.Contract.Default替换 SpringMvcContract契约;
2)将findById上的Spring MVC注解修改为Feign自带的注解;
访问Eureka中注册的服务
FeignConfiguration2
package com.itmuch.cloud.config;
import feign.Contract;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 该类为Feign的配置类
* 注意:该不应该在主应用程序上下文的@ComponentScan中。
*/
@Configuration
public class FeignConfiguration2 {
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("user", "password123");
}
}
说明:1)由于eureka设置了密码,所以需要认证,否则会报错;
2)feign.FeignException:
status 401 reading UserFeignClient2#findServiceInfoFromEurekaByServiceName(String); content:{"timestamp":1531228194010,"status":401,"error":"Unauthorized","message":"Bad credentials","path":"/eureka/apps/microservice-provider-user"}
UserFeignClient
package com.itmuch.cloud.study.user.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import com.itmuch.cloud.config.FeignConfiguration;
import com.itmuch.cloud.study.user.entity.User;
import feign.Param;
import feign.RequestLine;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* 使用@FeignClient的configuration属性,指定feign的配置类。
* 使用@FeignClient的configuration属性指定配置类,同时,将findById上的Spring MVC注解修改为Feign自带的注解。
*/
@FeignClient(name = "microservice-provider-user", configuration = FeignConfiguration.class)
public interface UserFeignClient {
/**
* 使用feign自带的注解@RequestLine
* @see https://github.com/OpenFeign/feign
* @param id 用户id
* @return 用户信息
*/
// @RequestLine("GET /{id}")
// public User findById(@Param("id") Long id);
@RequestMapping(value="/{id}", method= RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
说明:
1)报错java.lang.IllegalStateException: Method findById not annotated with HTTP method type (ex. GET, POST);
2)处理方法,使用@RequestMapping(value="/{id}", method= RequestMethod.GET)即可;
UserFeignClient2
package com.itmuch.cloud.study.user.feign;
import com.itmuch.cloud.config.FeignConfiguration;
import com.itmuch.cloud.config.FeignConfiguration2;
import com.itmuch.cloud.study.user.entity.User;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 使用@FeignClient的configuration属性,指定feign的配置类。
* 使用@FeignClient的configuration属性指定配置类,同时,将findById上的Spring MVC注解修改为Feign自带的注解。
*/
@FeignClient(name = "microservice-provider-user",url="http://localhost:8761/", configuration = FeignConfiguration2.class)
public interface UserFeignClient2 {
@RequestMapping(value = "/eureka/apps/{serviceName}")
public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName") String serviceName);
}
说明:
1)这里需要加上url="http://localhost:8761/",要不访问会报错;
MovieController
package com.itmuch.cloud.study.user.controller;
import com.itmuch.cloud.study.user.feign.UserFeignClient2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.itmuch.cloud.study.user.entity.User;
import com.itmuch.cloud.study.user.feign.UserFeignClient;
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@Autowired
private UserFeignClient2 userFeignClient2;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
@GetMapping("/{serviceName}")
public String findServiceInfoFromEurekaByServiceName(@PathVariable String serviceName) {
return this.userFeignClient2.findServiceInfoFromEurekaByServiceName(serviceName);
}
}
测试
http://localhost:8761/eureka/apps/microservice-provider-user
http://localhost:8010/microservice-provider-user
小结2
1)通过Feign的方式访问Eureka中注册的服务;
==============================
QQ群:143522604
欢迎和大家一起学习、交流、提升!
==============================