目录
Feign伪装的实现【服务调用方consumer-service】
1、引入依赖【继承了ribbon、hystrix,可以省略ribbon的依赖】
2、配置启动类【服务调用方@EnableFeignClients】
4、controller部分【服务调用方consumer-service】
2、修改Client类并添加回退类HystrixClientFallback
Feign
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
为什么要使用Feign
代码不够优雅,feign可以帮你完成拼接url远程调用等操作
Feign伪装的实现【服务调用方consumer-service】
1、引入依赖【继承了ribbon、hystrix,可以省略ribbon的依赖】
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、配置启动类【服务调用方@EnableFeignClients】
@EnableFeignClients // Feign
@EnableCircuitBreaker // 服务熔断
@EnableDiscoveryClient // 内部既能兼容eurake又能兼容zookeeper
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
//@SpringCloudApplication // 如果使用该注解,上面三个可以隐藏
public class ConsumerApplication {
// 配置feign后该部分可以隐藏了
// @Bean
// @LoadBalanced
// public RestTemplate restTemplate() {
// return new RestTemplate();
// }
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
3、新建Client接口+@FeignClient注解
以下四个条件需要完全符合:
- 请求路径【服务名+requestMapping】;
- 参数;
- 请求方式;
- 返回类型
@FeignClient("user-service")
public interface UserClient {
@GetMapping("user/{id}")
User queryById(@PathVariable("id") BigDecimal id);
}
该controller是user-servivce的方法:
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User queryById(@PathVariable("id")BigDecimal id) {
return userService.queryById(id);
}
}
4、controller部分【服务调用方consumer-service】
修改服务调用代码:
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private UserClient userClient;
@GetMapping("{id}")
public User queryById(@PathVariable("id")BigDecimal id){
return userClient.queryById(id);
}
}
5、实现效果
集成Hystrix
1、修改调用方yaml【设置开启】
ribbon:
ConnectionTimeOut: 500 // 500毫秒连接没有建立抛出异常
ReadTimeOut: 2000 // 建立连接后2S未读取到数据抛出异常
feign:
hystrix:
enabled: true
ribbon:
ConnectionTimeOut: 500
ReadTimeOut: 2000
2、修改Client类并添加回退类HystrixClientFallback
@FeignClient(name = "user-service", fallback = HystrixClientFallback.class)
public interface UserClient {
@GetMapping("user/{id}")
User queryById(@PathVariable("id") BigDecimal id);
}
@Component
class HystrixClientFallback implements UserClient {
@Override
public User queryById(BigDecimal id) {
User user = new User();
user.setUsername("熔断");
return user;
}
}