Spring-Cloud-OpenFeign使用心得

OpenFeign 实现微服务接口调用

一、配置OpenFeign

目前在SpringCloud技术栈中,调用服务用得最多的就是OpenFeign,使用OpenFeign调用微服务中其他服务的接口,使用Eureka或Nacos作为注册中心,具体配置如下:

1. 在启动类中添加以下注解:

@SpringBootApplication
@EnableDiscoveryClient
public class OpenFeignServer {
        public static void main(String[] args) {
            SpringApplication.run(启动类的名字.class, args);
    }
}

2. 在 pom.xml 中添加以下依赖:


    
        org.springframework.cloud
        spring-cloud-starter-openfeign
    

3. yml配置内容如下:

配置名称和注册到Eureka或Nacos上面的名字要一致,例如我注册的名字是 openfeign-server,在yml里也配置这个名字。

#这个yml是你要调用的微服务的配置
spring:
  application:
    name: 你的项目名称(自定义)例如:openfeign-server

二、具体使用

1. 新建软件包,命名为feign(随意),新建接口如下:

//配置OpenFeignClient只需要使用@FeignClient来注解一个interface即可
//value的值就是上面步骤中在yml配置的name,也就是在eureka上注册的名字
@FeignClient(value = "openfeign-server",fallbackFactory = 接口实现类的名字.class)
public interface OpenFeignService {

    //这里接口的路径和参数要和被调用的Rest服务保持一致,全路径,不允许map类型的参数,不允许有歧义的参数,参数最好都是有注解的,如@RequestParam,@RequestBody,@PathVarable
    @GetMapping("getUserName")
    String getUserName(@RequestParam("userId") String userId);

    @GetMapping("getUserAge")
    String getUserAge(@RequestParam("userId") String userId, @RequestBody User user);
}

2.在相同软件包下,分包,新建实现类如下:

@Slf4j
@Component
public Class OpenFeignServiceFallbackFactory implements FallbackFactory {
    @Override
    public OpenFeignService create(Throwable throwable){
        log.error(throwable.getMessage);
        return new OpenFeignService(){
            @Override
            public String getUserName(String userId){return null;}
            
            @Override
            public String getUserAge(String userId, User user){return null;
        };
    }
}

3.在controller中调用方法和其他接口一致,具体如下:

@Slf4j
@RestController
public class UserController {

    @Autowired
    private OpenFeignService openFeignService;

    @GetMapping("getUserName2")
    public void getUserName(){
        userClient.getUserName("100");
    }
}

4.注意(参数相关):

一般使用@GetMapping和@PostMapping两种方式来调用Rest服务。接收的参数使用@RequestParam和@RequestBody来获取。@RequestBody只能用在Post请求并且一个Post请求只能有一个@RequestBody@RequestBody的参数可以包括复杂类型

@RequestParam可以用在Post和Get请求中@RequestParam 的参数只能是基本类型或者Enum或者List和Map(List和Map里面也只能是基本类型)@RequestParam可以和@RequestBody一起使用。

如果是Get请求,又有复合类型, 比如我们想传递一个User对象。User对象里面只有普通的两个String属性。 这里我们可以使用@SpringQueryMap:

@GetMapping("getUserAge")
    public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user);

@SpringQueryMap后面的参数只能是普通的POJO,不能是复合类型,否则解析不了。如果必须使用复合类型,那么使用@RequestBody吧。

三、FeignClient的日志问题

1.日志配置

#日志配置
logging:
  level:
    com:
      test: debug

2.代码中配置OpenFeign的日志级别

OpenFeign的Logger.Level有4种级别:

  • NONE 没有日志
  • BASIC 请求方法,请求URL,返回Code和执行时间
  • HEADERS 请求和返回的头部基本信息
  • FULL 请求和返回的头部,内容,元数据
@Configuration
public class FeignLogConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

配置后就可以在日志里面看到DEBUG的所有HTTP请求信息。

四、Feign实现熔断

openFeign实际上是已经引入了hystrix的相关jar包,所以可以直接使用,设置超时时间,超时后调用FallBack方法,实现熔断机制。

1.在要调用的微服务中添加依赖


    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

2.在配置中开启熔断机制,添加超时时间

#默认是不支持的,所以这里要开启,设置为true
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

3.编写实现类(在第二步使用的时候我们已实现该类)

@Slf4j
@Component
public Class OpenFeignServiceFallbackFactory implements FallbackFactory {
    @Override
    public OpenFeignService create(Throwable throwable){
        log.error(throwable.getMessage);
        return new OpenFeignService(){
            @Override
            public String getUserName(String userId){return null;}
            
            @Override
            public String getUserAge(String userId, User user){return null;
        };
    }
}

4.在对应的Feign接口添加fallback属性(在第二部使用时我们已添加该属性)

@FeignClient(value = "openfeign-server",fallbackFactory = 接口实现类的名字.class)
public interface OpenFeignService {
    @GetMapping("getUserName")
    String getUserName(@RequestParam("userId") String userId);

    @GetMapping("getUserAge")
    String getUserAge(@RequestParam("userId") String userId, @RequestBody User user);
}

五、设置负载均衡

OpenFeign底层是使用Ribbon,Ribbon是负责做负载均衡的组件。所以是可以通过配置设置负载均衡的策略。默认的是轮询策略。如果要换成其他策略,改一下配置即可:

#服务名称
openfeign-server:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

#有如下几种规则
#1.随机规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#2.轮询规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#3.重试规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
#4.响应时间权重规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
#5.最空闲连接策略规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule

以上就是OpenFeign的实践过程,如有不足之处,欢迎各位批评指正!

你可能感兴趣的:(工作中遇到的问题,java,spring,boot,微服务,服务发现)