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);
}
}
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或@SpringCloudApplication3、定义一个类实现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);
}
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 "查询失败,请重新刷新页面。";
}
}
完成,启动,访问