Feign代替restTemplate实现远程调用服务

feign的使用:(以我写的demo为例)
feign是代替了restTemplate的使用:

1>首先要在消费服务项目中,导入依赖。

    <!--feign 代替@restTemplept-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2 >在消费服务中定义一个消费服务的接口,在接口上使用@FeignClient(“”)注解,写的参数是要远程调用的服务名。eg:@FeignClient(“userserver”)

   @FeignClient("userserver") //写的是要远程访问的服务的名
public interface UserClient {
    @GetMapping("/user/{id}")
    User queryById(@PathVariable("id") Long id);
}

3>在接口中,声明你要远程调用服务的方法,方法的定义及请求的方式,要和消费服务的方法一致。

	eg:  @GetMapping("/user/{id}")    // 这写的是原服务的请求路径
		       User queryById(@PathVariable("id") Long id); 

4>在消费服务的启动类上加上注解@EnableFeignClients,是开启Feign自动注入功能

@EnableFeignClients) 
@MapperScan("com.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

上面这种是把feign服务写在了服务消费方里了,还有一种是把feign服务单独出来,下面就来举例说明。

<1> 首先要有三个服务,服务提供者服务A,服务消费者B,远程调用服务支持者 服务feign。
<2> 首先写服务提供者,在服务提供者中写一个正常的业务功能类,如下所示:

@RestController
public class ScheduleClient implements IScheduleClient {

    @Autowired
    private TaskService taskService;

    /**
     * 添加任务
     *
     * @param task 任务对象
     * @return 任务id
     */
    @PostMapping("/api/v1/task/add")
    @Override
    public ResponseResult addTask(@RequestBody Task task) {
        return ResponseResult.okResult(taskService.addTask(task));
        }
    }
(1)在服务feign中些引入依赖,如下所示。 (2)ScheduleClient 类实现了IScheduleClient接口,这个接口需要写在远程调用服务支持者 服务feign当中,如下所示。
其中 @FeignClient(value=“B服务的application:name”,fallback = “降级服务实现类的类名.class”)中,value值是服务提供者在application.yam中配置的项目名称。fallback值是feign服务中,接口的另一个降级服务的实现类的名称。其中接口和类就按正常的接口与实现类书写即可,唯一需要注意的是在接口中对应方法的上面,加上实现类restful访问地址。例如:@PostMapping(“/api/v1/task/add”)
导入依赖:
	 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
feign对外提供的服务访问接口
@FeignClient("B服务的application:name")
public interface IScheduleClient {
    /**
     * 添加任务
     * @param task   任务对象
     * @return       任务id
     */
    @PostMapping("/api/v1/task/add")
    public ResponseResult  addTask(@RequestBody Task task);
}
降级服务提供的实现类:
@Component
public class IScheduleClientFallBack implements IScheduleClient {
    @Override
    public ResponseResult addTask(Task task) {
        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR,"获取数据失败");
    }
 }
在服务消费者B服务中分3步,(1)在启动类xxxApplication类上开启feign远程调用,如下所示:
(basePackages=“这里需要写< 服务feign> 中的标注了@FeignClient注解的接口的包路径”)

@SpringBootApplication
@EnableFeignClients(basePackages = "com.xxx.apis")
public class WemediaApplication {

    public static void main(String[] args) {
        SpringApplication.run(WemediaApplication.class,args);
    }
   }
写消费的逻辑。通过 @Autowired注入feign服务中的接口的bean对象,bean对象打点调对应的方法即可。从而实现服务B远程调用服务A。

总结:服务消费者A服务和服务消费者B服务,并无直接的交互,是通过远程调用服务者feign服务实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值