3.springCloud学习之-服务消费Feign

253 阅读3分钟

1.背景

今天我们学习SpringCloud的客户端负载均衡Ribbon

我们今天继续使用之前eureka-server作为服务注册中心

使用Springboot和springcloud的版本如下

  • springboot版本:2.3.5-release
  • springcloud版本:Hoxton.SR9

2.Feign服务消费

什么是feign

Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的编码器和解码器。Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  • 支持可插拔的HTTP编码器和解码器;
  • 支持Hystrix和它的Fallback;
  • 支持Ribbon的负载均衡;
  • 支持HTTP请求和响应的压缩。

3.如何使用

3.1 消费者

添加依赖

<dependency>
       <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

添加注解

@EnableFeignClients

@EnableFeignClients(basePackages = "com.wyq.springcloudfeignconsumer.service")

增加配置类

@FeignClient(name ="ms-feign-producer",path = "/api/user",configuration = Config.class,fallback = UserServiceImpl.class)
public interface UserService {

    @GetMapping("/{id}")
    public String selectUser(@PathVariable("id") String id);
}

配置文件

spring:
  application:
    name: ms-feign-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka
    register-with-eureka: true
  instance:
    prefer-ip-address: true
    #appname: ${spring.application.name}
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    hostname: ${spring.cloud.client.ip-address}
server:
  port: 8081

使用

@RequestMapping("/api/comsumer/user")
@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/{id}")
    public String selectUser(@PathVariable("id") String id){
        return userService.selectUser(id);
    }
}

3.2 生产者

添加依赖

<dependency>
       <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

修改配置文件

spring:
  application:
    name: ms-feign-producer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka
    register-with-eureka: true
  instance:
    prefer-ip-address: true
    #appname: ${spring.application.name}
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    hostname: ${spring.cloud.client.ip-address}
server:
  port: 8082

提供服务

@RequestMapping("/api/user")
@RestController
public class UserController {
    @Value("${server.port}")
    Integer port;

    @GetMapping("/{id}")
    public String selectUser(@PathVariable("id") String id){
        if ("1".equals(id)) {
           int i =  1/0;
        }
        User user = new User();
        user.setId(id);
        user.setName("wangyunqi");
        user.setPort(port);
        return user.toString();
    }
}

4.如何设置日志级别

日志级别

  1. NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
  2. HEADERS:记录BASIC级别的基础上,记录请求和响应的header
  3. FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
  4. BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。

如何设置

  1. 通过javaConfig方式配置
  @Bean
   public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    
    @FeignClient(name ="ms-feign-producer",path = "/api/user",configuration = Config.class,fallback = UserServiceImpl.class)
public interface UserService {

    @GetMapping("/{id}")
    public String selectUser(@PathVariable("id") String id);
}
  1. 通过配置文件方式
feign:
  client:
    config:
      ms-feign-producer:
        loggerLevel: full  #这种方式也是可以设置日志级别

5.如何设置拦截器

在实际的开发过程中,我们可以再调用其他的服务的时候传递一些信息,我们希望通过拦截器的方式进行统一的拦截


public class BasicAuthRequestInterceptor implements RequestInterceptor {
  @Override
  public void apply(RequestTemplate template) {
    template.header("Authorization", headerValue);
  }
}