Feign 更好的服务调用方式

Feign官网:https://github.com/OpenFeign/feign

Feign(伪装) 声明式服务调用

1、依赖

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

2、主类加注解

@EnableFeignClients

3、编写接口

在consumer-service服务里,编写接口(底层跟Mybatis一样,使用动态代理,帮我们实现接口)

cn.itcast.consumer.client.UserClient

package cn.itcast.consumer.client;

import cn.itcast.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("user-service")//服务名称  eureka注册中心里的名字
/*
用服务名称去eureka注册中心里找此服务,然后通过ribbon负载均衡找到最适合的那个服务实例,
然后向user/{id}这个地址发起请求,并且传递id作为参数,得到json结果,帮你转换为User对象
 */
public interface UserClient {

    @GetMapping("user/{id}")
    //方法名叫啥都行,controller里面调用的
    User queryById(@PathVariable String id);

    /*
    告诉她4个东西:
    请求方式(@GetMapping),请求路径(user-service+user/{id}),参数(String id),返回值(User)。
     */

}

controller里直接调用,像调用一个本地方法一样

cn.itcast.consumer.web.ConsumerController

@Slf4j
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public User queryById(@PathVariable String id){
        return userClient.queryById(id);
    }

}

VmGdcd.md.png

feign的一些事情

openfeign依赖引入之后,ribbon的依赖就不用再引入了,openfeign已经依赖了了。

ribbon

feign的负载均衡ribbon跟以前完全一样,不用管。她的ribbon有一个默认的超时时长,1s

可以在配置文件中修改

ribbon:
  ConnectionTimeOut: 500
  ReadTimeOut: 2000

如果0.5s之内没有建立连接,抛出异常;如果建立了连接,超过2s没有读取到数据,也会抛出异常。

hystrix

  • 1、
    Hystrix默认在feign中是关闭的,需要手动开启
feign:
  hystrix:
    enabled: true #开启feign的熔断(hystrix)功能
  • 2、
    加注解:@EnableCircuitBreaker或@SpringCloudApplication

  • 3、定义一个类实现UserClient接口,在里面实现熔断逻辑,然后设置此类未Fallback类

package cn.itcast.consumer.client;
xxx...

@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient {

    @GetMapping("user/{id}")
    String queryById(@PathVariable("id") String id);

}

VmtP6H.md.png

package cn.itcast.consumer.client;

import cn.itcast.consumer.pojo.User;
import org.springframework.stereotype.Component;

@Component//将此类注入到Spring中去
public class UserClientFallback implements UserClient {
    @Override
    public String queryById(String id) {
         return "查询失败,请重新刷新页面。";
    }
}

完成,启动,访问

VmUuLj.md.png

insist,on the road
-------------本文结束感谢您的阅读-------------