目录
1、在springcloud-order项目中引入Feign客户端的依赖
2、在server-order服务的启动类中添加注解@EnableFeignClients
3、使用@FeignClient注解声明Feign客户端需要调用的远程接口
3.1、server-pay服务提供远程接口Controller
3.2、server-member服务提供远程接口Controller
3.3、创建IPayService接口,映射需要调用的pay服务提供的远程接口
3.4、创建IMemberService接口,映射需要调用的member服务提供的远程接口
3.5、在controller中注入接口bean对象,通过调用方法的形式直接调用服务提供者提供的远程接口,更符合开发习惯
3.6、启动服务server-member、server-pay、server-order及server-eureka注册中心
4.1、使用注解@RequestBody接收对象VO参数,否则接收不到传过来的参数
4.2、使用注解@RequestParam("xxx")接收一个普通参数(String/Integer)
4.2.1、在服务提供方和服务调用方提供同样的注解@RequestParam("xxx")
4.2.2、服务提供方不添加@RequestParam("xxx")注解,服务调用方添加@RequestParam("xxx")注解,但是xxx要与服务提供方的参数一致才能映射
4.3、使用@PathVariable接收RESTFul请求路径上的参数
5.1、在父目录springcloud下创建聚合项目springcloud-api作为公共模块
5.2、在springcloud-api项目的pom文件中引入依赖
5.3、在springcloud-api项目里添加vo对象类和接口
5.5、在服务提供方server-member和服务调用方server-order引入公共服务模块
5.6、server-member服务端(服务提供方)定义MemberController2 实现api项目中定义的接口
5.7、server-order客户端(服务调用方)定义接口继承api项目中定义的接口
在项目开发中一般访问远程服务接口时并不使用RestTemplate来做,前面已经演示过了怎么通过RestTemplate来访问远程接口,以及基于eureka注册中心的服务发现机制搭配RestTemplate访问远程接口,而使用Feign客户端来访问远程接口是比较常见的做法,其底层实现原理是RPC远程过程调用,同时feign客户端集成了ribbon
1、在springcloud-order项目中引入Feign客户端的依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2、在server-order服务的启动类中添加注解@EnableFeignClients
@EnableFeignClients(basePackages = "course.springcloud")
basePackages需要配置openfeign的包扫描路径,扫描FeignClient注解并初始化,如果FeignClient注解的接口和启动类同一个路径下,则不需要配置
3、使用@FeignClient注解声明Feign客户端需要调用的远程接口
注意:接口方法上的注解要与服务提供者提供的注解一致,即请求方式要一致,此外,路径也要一致,否则将映射不到请求
3.1、server-pay服务提供远程接口Controller
@RestController
@RequestMapping("/")
public class PayController {
@Value("${server.port}")
private int port;
@GetMapping("/payInfo")
public String getPayInfo() {
return "当前端口为:" + port + "this is pay Info";
}
}
3.2、server-member服务提供远程接口Controller
@RestController
@RequestMapping("/member")
public class MemberController {
@Value("${server.port}")
private int port;
@GetMapping("/memberInfo")
public String memberInfo() {
return "当前请求端口为:" + port + " this is Member Info";
}
}
3.3、创建IPayService接口,映射需要调用的pay服务提供的远程接口
// value 配置服务提供者的应用名称或者service id;
// path配置请求的前缀(即服务提供者类上的RequestMapping注解上的路径),// 如果不加这个path前缀,那么方法上的每个请求路径都要写完整请求的路径
@FeignClient(value = "server-pay", path = "/")
public interface IPayService {
//该注解要与服务提供者的路径及请求方式保持一致,请求方式是GetMapping、PostMapping还是其他,否则映射不到
@GetMapping("/payInfo")
String getPayInfo();
}
3.4、创建IMemberService接口,映射需要调用的member服务提供的远程接口
// value 配置服务提供者的应用名称或者service id;
// path配置请求的前缀(即服务提供者类上的RequestMapping注解上的路径)
// 如果不加这个path前缀,那么方法上的每个请求路径都要写完整请求的路径
// 例如下面例子所示:则方法中的GetMapping要写成@GetMapping("/member/memberInfo"),如果方法比较多的话,这么写就比较麻烦
@FeignClient(value = "server-member", path = "/member")
public interface IMemberService {
//该注解要与服务提供者的路径及请求方式保持一致,请求方式是GetMapping、PostMapping还是其他,否则映射不到
@GetMapping("/memberInfo")
String getMemberInfo();
}
3.5、在controller中注入接口bean对象,通过调用方法的形式直接调用服务提供者提供的远程接口,更符合开发习惯
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private IMemberService iMemberService;
@Autowired
private IPayService iPayService;
//使用OpenFeign访问server-member服务的远程接口 /member/memberInfo
@GetMapping("/getMember")
public String getMember() {
return iMemberService.getMemberInfo();
}
//使用OpenFeign访问server-pay服务的远程接口 /payInfo
@GetMapping("/getPay")
public String getPay() {
return iPayService.getPayInfo();
}
}
3.6、启动服务server-member、server-pay、server-order及server-eureka注册中心
3.7、访问接口localhost:9071/order/getPay
3.8、访问接口 localhost:9071/order/getMember