在上一节已经学习了Ribbon为什么要出一个openFeign呢?
openFeign是什么?概念?
主要放在客户端,做服务的调用。
openFeign能干什么?
服务接口绑定器。把具体的服务通过服务接口暴露出来。
feign和openFeign的区别?
怎么使用?
接口+注解,这个是放在客户端。
提供方和调用方,相吻合的接口,面向接口编程,这个接口具体指的是Service接口,具体业务逻辑实现的服务接口。
注:
- 这个跟之前的ribbon+restTemplate是基于controller暴露出来的具体的服务http访问地址来进行访问的。
- 注意是搞在消费端的接口上面。服务提供者做好服务提供把自己的服务实例注册到服务注册中心就OK
新建项目
- pom.xml加入相关依赖
额外引入openfeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--关键核心在这里,因为也是通过服务注册中心去获取服务,基于Eureka所以eureka客户端依赖还是的引入-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- yml调整
通过eureka配置,找到服务注册中心地址,然后不注册自己(因为他就是一个客户端)
server:
port: 7773
spring:
application:
name: spring-cloud-consumer-openfeign-client
#Eureka服务提供者配置
eureka:
client:
#false表示不向注册中心注册自己(你自己就是一个eureka服务,没必要把自己注册进去了)
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
#这个主要结合discoveryClient使用
fetch-registry: true
service-url:
#单机版
defaultZone: http://localhost:9999/eureka
Fegin内置Ribbon默认设置了连接超时,是1000毫秒(1秒)。和读取超时时间。我们可以通过手动配置来修改。Ribbon内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试,可以修改。
# 连接超时时长
Ribbon.ConnectTimeout: 1000
# 数据通信超时时长
Ribbon.ReadTimeout: 2000
# 当前服务器的重试次数
Ribbon.MaxAutoRetries: 0
# 重试多少次服务
Ribbon.MaxAutoRetriesNextServer: 0
# 是否对所有的请求方式都重试
Ribbon.OkToRetryOnAllOperations: false
- 主启动类
正常的springboot启动配置,然后在额外加上启用OpenFeign的注解;
@SpringBootApplication
//启用feign客户端
@EnableFeignClients
public class RunClientMain {
public static void main(String[] args) {
SpringApplication.run(RunClientMain.class,args);
}
}
- 业务类配置
这个调用层用的GetMapping注解是用的是springMvc提供的;
@Component
//value就表示对应服务注册中心里面的服务名称
@FeignClient(value = "SPRING-CLOUD-EUREKA-PROVIDER-SERVER-01")
public interface DemoService {
/**
* 通过springMvc的方式,指定服务提供者访问地址
* @return
*/
@RequestMapping("/user/get")
public JsonResult getUser();
}
通过对比服务提供者的时候,这里通过openFeign相当于就直接进行配置就好了,其他无需管理。
这个是服务提供者的代码
@RestController
@RequestMapping("/user/")
public class DemoController {
@Value("${server.port}")
private String serverPort;
@RequestMapping("get")
public JsonResult getUser() {
return new JsonResult(0,"从服务端口:" + serverPort + "获取用户信息!");
}
}
- controller使用
@Autowired
private DemoService demoService;
@RequestMapping("consumer/openFeign/get")
public JsonResult getOpenFeignUser() {
JsonResult obj = demoService.getUser();
System.out.println(obj);
return obj;
}
总结
- 在接口服务上面加上注解,配置对应调用的服务名称
- 在接口中加入要调用的方法
openFeign超时控制
错误提示:
在yml文件里面,开启超时设置
openFeign日志打印功能
配置日志级别
在发送和接收请求的时候,Feign定义了日志的输出定义了四个等级:这里我们配置测试一下。
实现步骤:
- 在application.yml配置文件中开启日志级别配置
- 编写配置类,定义日志级别bean。
- 在接口的@FeignClient中指定配置类
- 重启项目,测试访问
实现过程:
- 日志级别
- 配置一个日志bean
为什么引入openFeign自动具备负载均衡的功能
服务降级方法实现步骤:
- 在配置文件application.yml中开启feign熔断器支持
- 编写FallBack处理类,实现FeignClient客户端接口
- 在@FeignClient注解中,指定FallBack处理类。
- 测试服务降级效果
实现过程:
在配置文件application.yml中开启feign熔断器支持:默认关闭
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
定义一个类UserServiceFallBack,实现刚才编写的UserFeignClient,作为FallBack的处理类
@Component//需要注意:一定要注入Spring 容器
public class UserServiceFallBack implements UserService {
@Override
public User findById(Integer id) {
User user = new User();
user.setId(id);
user.setUsername("用户不存在!!!");
return user;
}
}
在@FeignClient注解中,指定FallBack处理类。。
@FeignClient(value = "user-service",fallback = UserServiceFallBack.class)
public interface UserService {
@RequestMapping("/user/findById")
User findById(@RequestParam("id") Integer id);
}
重启测试:关闭user_service服务,然后在页面访问;http://localhost:8080/feignConsumer/2
请求压缩和响应压缩
SpringCloudFeign支持对请求和响应进行GZIP压缩,以提升通信过程中的传输速度。
通过配置开启请求与响应的压缩功能:
# 开启请求压缩
feign.compression.request.enabled: true
# 开启响应压缩
feign.compression.response.enabled: true
也可以对请求的数据类型,以及触发压缩的大小下限进行设置
# 设置压缩的数据类型
feign.compression.request.mime-types: text/html,application/xml,application/json
# 设置触发压缩的大小下限
feign.compression.request.min-request-size: 2048