feign
可以对rest请求进行隐藏 伪装成 类似springMVC的Controller一样. 不用自己再拼接url, 拼接参数等操作
1.feign依赖 包含 负载均衡依赖包 ribbon 所以不需要引入了
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
2. 启动类 加注解 EnableFeignClients
@SpringCloudApplication //@SpringBootApplication @EnableDiscoveryClient@EnableCircuitBreaker @EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
3.另写一个 feign类客服端 告诉feign 要请求的服务的 请求方法 请求参数 返回值类型 和服务名user-server
@FeignClient("user-server")
public interface UserClient {
@GetMapping("user/{id}")
User findOne(@PathVariable("id")Integer id);
}
4. Controller 类中 直接注入这个类 传入请求参数
feign就会自动根据服务名user-server 去拉取列表 然后用 ribbon 获取一个实例 然后获得端口 和ip地址 拼接url 发起请求
@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "DefaulterrorFallback")
public class UserController {
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public User findOne(@PathVariable("id") Integer id) {
User user = userClient.findOne(id);
return user;
}
public User DefaulterrorFallback() {
User user = new User();
user.setName("错误");
return user;
}
3.feign 的熔断机制 和超时时长 配置 feign默认 没有开启hystrix
feign 真实超时 算法 (ReadTimeOut+ConnectionTimeOut) *2 倍数可以配置 为重试连接的配置
这个值最好不要超过 hystrix 超时时长 因为 还没有重试连接就 已经熔断了
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ConnectiontimeOut: 500 建立连接超时时间 ms默认1000
ReadtimeOut: 2000 读取数据时间 默认
feign:
hystrix:
enabled: true
4.feign 的熔断 逻辑 业务必须 用一个实现类
@FeignClient(value = "user-server",fallback =UserClientImpl.class )
public interface UserClient {
@GetMapping("user/{id}")
User findOne(@PathVariable("id")Integer id);
}
5.实现类
@Component
public class UserClientImpl implements UserClient {
@Override
public User findOne(Integer id) {
User user = new User();
user.setName("未知用户");
return user;
}
}
6.经过测试以前的 熔断机制也会执行 , 但上面的如果存在 会覆盖 以前的方法 , 不能设置超时时间..........?