在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 HTTP 请求的封装处理,形成了一套模板化的调用方法。缺点:在每次进行服务调用时,都需要通过@Resource/@Autowired的方式,来声明一个 RestTemplate。
Feign是一个声明式web服务客户端(消费者),让编写web服务客户端变得非常容易,只需要创建一个接口并在接口上添加注解即可。
Feign是Spring Cloud组件中一个轻量级RESTful的http服务客户端,feign内置Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务,Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
OpenFeign是springCloud在feign的基础上支持了spring MVC的注解,如@RequesMapping等等,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现了。实现类中做负载均衡并调用其他服务
1.消费者添加坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.消费者的启动类必须加上@EnableFeignClients来开启OpenFeign
@Component
3.@FeignClient(value = "CLOUD-PAYMENT-SERVICE") //注解+生产者的入住注册中心名
public interface PaymentFeignService {
@GetMapping(value = "/test/paymentId/{id}") //这是访问生产者controller的接口url
public PaymentEntity paymentId(@PathVariable("id") Long id); //参数
}
测试结果可以用
OpenFeign默认等待1秒钟,超过报错,所以需要开启OpenFeign客户端超时控制,在yml文件配置
负载均衡配置:
CLOUD-PAYMENT-SERVICE: //生产者名 注册中心
ribbon :
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule //随机
总结:
- 消费者引入坐标
- 消费者创建controller,调用服务层,
- 服务层是接口,类上加入生产者的入驻注册中心的名,例如@FeignClient(value = "CLOUD-PAYMENT-SERVICE"),和+@Component
- 服务层方法上消费者的访问url 例如@GetMapping(value = "/test/paymentId/{id}") //这是访问生产者controller的接口url
- 参数为消费者需要什么参传入什么参数
消费者服务层案例:
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface CumsService {
@GetMapping(value = "/user/success")
Result findUser(@RequestBody UserBean userBean);
}
6.生产者只需将服务名注入注册中心