spring-cloud微服务之【服务调用】【openFeign】--持续更新

在上一节已经学习了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定义了日志的输出定义了四个等级:这里我们配置测试一下。


实现步骤:

  1. 在application.yml配置文件中开启日志级别配置
  2. 编写配置类,定义日志级别bean。
  3. 在接口的@FeignClient中指定配置类
  4. 重启项目,测试访问

实现过程:

  • 日志级别

  • 配置一个日志bean

为什么引入openFeign自动具备负载均衡的功能

服务降级方法实现步骤:

  1. 在配置文件application.yml中开启feign熔断器支持
  2. 编写FallBack处理类,实现FeignClient客户端接口
  3. 在@FeignClient注解中,指定FallBack处理类。
  4. 测试服务降级效果

实现过程:

在配置文件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 
 

 

 

 


版权声明:本文为qqzhengwei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。