eureka下基本使用openfeign+ribbon+netflix

561 阅读2分钟

一、为什么需要使用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