一、为什么需要使用rpc
需求: 一个微服务项目调用另一个微服务项目的接口。
rpc
即远程过程调用协议,通过网络传输协议(http、tcp)进行跨进程
之间的大量的数据传输。那么,openfeign
就是通过http协议
,实现两个服务之间的数据传输,传输的数据格式为json
。
注:linux少量数据的进程通信
,是通过管道实现的。
二、理解与要求
提供者:
不做任何变动,依然提供controller即可。
消费者:
需要构建一个feign客户端,访问提供者的controller。
站在提供者角度:
提供者根据不知道你拿数据去做一些什么业务处理,所以只提供数据,其它一律不操心。
站在消费者角度:
消费者消费数据。① 信任:认为整个过程不会出现问题。 ② 怀疑:认为消费可能会出现问题,出现问题如何处理?(hystrix降级) ③ 多个提供者如何访问?(ribbon)
1. 提供者和消费者,不允许定义多个Object类型参数,且Object类型参数必须标注@RequestBody。因为多个Object类型参数,消费者启动报错 Method has too many Body parameters 【String类型除外】
2. 提供者和消费者,String类型可以定义多个,但必须加 @RequestParam,且参数名映射相同。
三、编程实现
3.1 提供者
虽然controller对于引入openfeign并没有太多的要求,但是由于传递参数导致提供者需要有一定的书写规范
,不然消费者不太好消费。
// 支持继承方式定义controller
public interface OrderApi {
@PostMapping("/order/push")
String push(String name, User user);
}
@RestController
public class OrderApiFeign implements OrderApi {
@Override
public String push(@RequestParam("name") String name, @RequestBody User user) {
System.out.println("name = " + name);
System.out.println("user = " + user);
return "success";
}
}
3.2 消费者
消费者微服务项目引入依赖
<!-- hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
编写feign客户端
// name:指定调用的服务名;fallback:调用失败,指定回调类
// 此处的服务名一定是注册在eureka中的,如果调用第三方,可以使用url指定
@FeignClient(name = "oms-order", fallback = RemoteServiceImpl.class)
public interface RemoteOrderService {
// url 必须与提供者保持一致
@PostMapping("/order/push")
String push(@RequestParam("name") String name, @RequestBody User user);
}
// 服务降级回调类,必须实现 相应的接口
@Component
public class RemoteOrderServiceImpl implements RemoteOrderService{
@Override
public String push(@RequestParam("name") String name, @RequestBody User user) {
return "服务降级";
}
}
// 启动类
@EnableCircuitBreaker // 启用hystrix
@EnableDiscoveryClient // 注册eureka
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.shang.feign"}) // 启用feign
@RibbonClients(
// name: 指定调用哪一个服务 configuration:轮训访问规则
@RibbonClient(name = "oms-order",configuration = RandomRule.class)
)
public class OmsConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(OmsConsumerApplication.class, args);
}
}
yml中开启断路器
feign:
hystrix:
enabled: true