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);
}
}