什么是OpenFeign
OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign
是一种声明式、模板化的HTTP
客户端。在Spring Cloud中使用OpenFeign
,可以做到使用HTTP
请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。Spring Cloud 2020版本已经彻底移除了Netflix相关组件,OpenFeign
便是Feign
的替换者。
本文我们是在Spring Cloud使用Nacos作为服务中心编写服务提供者的基础上进行的,通过OpenFeign调用前面编写的nacos-provider-payment
服务。
编写服务消费者
创建cloudalibaba-consumer-order8888
工程,调用我们编写的nacos-provider-payment
服务。
添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Cloud2020</artifactId>
<groupId>net.xiangcaowuyu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-order9003</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
</dependencies>
</project>
修改配置文件
修改application.yml
增加Nacos
相关配置。
server:
port: 8888
spring:
application:
name: nacos-consumer-order
cloud:
nacos:
discovery:
server-addr: 192.168.120.180:1111
management:
endpoints:
web:
exposure:
include: "*"
修改启动类
添加@EnableFeignClients
注解,支持使用OpenFeign
@SpringBootApplication
//@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerOrderMain8888 {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerOrderMain8888.class, args);
}
}
编写Feign客户端
添加@FeignClient
注解,value
便是我们服务提供者的名称。
@FeignClient(value = "nacos-provider-payment")
public interface NacosPaymentService {
@GetMapping(value = "/echo/{string}")
String echo(@PathVariable("string") String string);
}
测试
编写controller进行测试
@RestController
@Slf4j
@RequestMapping("/nacos/consumer")
public class NacosConsumerController {
@Resource
private NacosPaymentService nacosPaymentService;
@GetMapping("/echo/{id}")
public String echo(@PathVariable("id") String id) throws IllegalAccessException {
log.info("******************输出:" + id);
return nacosPaymentService.echo(id);
}
}
OpenFeign超时控制
OpenFeign调用接口,默认超时时间为1S。
我们修改一下nacos-provider-payment
服务,让放服务暂停2s,然后查看一下接口调用。
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable("string") String string) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello Nacos Discovery " + string+"\t当前服务端口:"+serverPort;
}
但是有时候我们业务接口可能需要处理的时间较长,那么我们可以配置接口调用的超时时间。
我们可以在配置文件中增加以下内容
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
我们再次测试接口,可以发现接口可以正常调用。
OpenFeign日志打印功能
增加日志bean
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
修改配置文件
YML文件里配置需要开启日志的Feign客户端
logging:
level:
net.xiangcaowuyu.springcloud.alibaba.service.NacosPaymentService: debug
测试
再次调用接口,可以看到输出的日志
负载均衡
如果我们同时启动了9001
、9002
端口,也就是说我们针对服务提供者做了集群,那么我们多次调用服务提供者时,会发现系统会依次输出9001
、9002
端口。也就是说,OpenFeign
自带了负债均衡功能,默认采用的时轮询算法。
我们修改一下默认的负债均衡算法,设置的简单一点,如果我们的请求包含name=zhangsan
参数,就调用到9001
端口,否则就调用9002
端口。
实现IRule接口
public class CustomerBalancerRule implements IRule {
private ILoadBalancer balancer = new BaseLoadBalancer();
@Override
public Server choose(Object object) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String name = request.getParameter("name");
List<Server> servers = balancer.getAllServers();
if ("zhangsan".equals(name)) {
if (servers.stream().anyMatch(e -> e.getPort() == 9001)) {
return servers.stream().filter(e -> e.getPort() == 9001).collect(Collectors.toList()).get(0);
}
return servers.get(0);
}
return servers.get(1);
}
@Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.balancer = iLoadBalancer;
}
@Override
public ILoadBalancer getLoadBalancer() {
return this.balancer;
}
}
配置服务提供者,调用负载均衡算法
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
nacos-provider-payment:
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
NFLoadBalancerRuleClassName: net.xiangcaowuyu.springcloud.alibaba.config.CustomerBalancerRule
评论 (0)