什么是Feign?
Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用(Feign和restTemplate都是一种客户端远程调用工具,但Feign结合了Ribbon实现了负载均衡)
前面我们实现微服务调用的是结合restTemplate远程调用和Ribbon客户端负载均衡,
@Autowired
RestTemplate restTemplate;
/**
* 测试客户端负载均衡ribbon
*/
@Test
public void test05() {
//服务ID
String serviceId = "XC-SERVICE-MANAGE-CMS";
//ribbon从eureka获取服务列表
for(int i=0; i<10; i++){
ResponseEntity<Map> map = restTemplate.getForEntity("http://" + serviceId + "/cms/page/get/5a754adf6abb500ad05688d9", Map.class);
Map body = map.getBody();
System.out.println(body);
}
}
但这样编写代码不利于管理统一与多次调用。
我们需要将这些调用方法写在一个接口上,方便调用方随时随地的调用。
因此我们采用Feign结合Ribbon来取代掉之前的调用方式
1、引入依赖
<!-- feign:集成okhttp客户端远程调用和Ribbon客户端父子均衡,使微服务之间调用更便捷-->
!--这个包包含了spring-cloud-starter-ribbon-->
<dependency><
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
2、启动类添加 @EnableFeignClients 开启Feign服务
3、调用服务方法接口配置(注意,是接口哦)
package com.xuecheng.manage_course.client;
/**
* @author Huang
* @version 1.0
* @date 2020/4/15 13:35
*/
import com.xuecheng.framework.domain.cms.CmsPage;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
//指定调用的服务名(即被调用微服务的spring.appliaction.name,作为注册中心的域名)
@FeignClient(value = "XC-SERVICE-MANAGE-CMS")
public interface CmsPageClient {
//根据页面ID查询页面信息,远程调用cms微服务请求数据
@GetMapping("/cms/page/get/{id}") //表示远程调用http的方法类型(如:restTemplate.getForEntity()、restTemplate.postForEntity()等等)
//如何知道远程调用http的方法类型和该方法的返回值类型呢?通过SwaggerUI查询对应微服务的接口即可获取该方法的详情信息
public CmsPage findCmsPageById(@PathVariable("id") String id);
}
1)、@FeignClient:指定调用服务的域名
2)、通过查询接口文档工具(Swagger)来查看该方法的http请求方式和该方法的返回值类型
http请求方式:get、post、delete、put
4、yml
server:
port: 80 #端口号(网页的端口一般默认80,避免用户额外添加端口访问)
spring:
application:
name: cloud-consumer-feign-order80 #服务名(作为注册中心的微服务名)
CLOUD-PAYMENT-SERVICE: #设置OpenFeign中Ribbon负载均衡策略("CLOUD-PAYMENT-SERVICE"是服务名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon: #设置OpenFeign客户端调用远程接口超时配置(OpenFeign默认支持Ribbon)
ReadTimeout: 5000 #处理请求的超时时间
ConnectTimeout: 5000 #连接建立的超时时长
MaxAutoRetries: 1 #同一台实例的最大重试次数,但是不包括首次调用,默认为1次
MaxAutoRetriesNextServer: 0 #重试负载均衡其他实例的最大重试次数,不包括首次调用,默认为0次
OkToRetryOnAllOperations: false #是否对所有操作都重试,默认false
5、测试
@Autowired
CmsPageClient cmsPageClient;
/**
* 测试Feign
*/
@Test
public void test06() {
//发起远程调用
CmsPage cmsPage = cmsPageClient.findCmsPageById("5a754adf6abb500ad05688d9");
System.out.println(cmsPage);
}
只需要像接口调用方法那样即可(和DAO有雷同之处)