OpenFeign客户端(最常用)
特点:声明式的http访问工具,只需要定义接口(接口无需实现),在接口上添加描述服务的注解即可。这个工具默认已经具备Ribbon功能
pom依赖:
声明式接口:
/**
* name指定远程访问的服务名
*/
@FeignClient(name = "service-provider")
public interface UserClientService {
@GetMapping("/loadUserNames")
public List<String> findAllUsers();
}
使用:
@RestController
public class UserController {
@Autowired
private UserClientService userClientService;
@GetMapping("/findAllUserNames")
public List<String> findAllUserNames() {
return userClientService.findAllUsers();
}
}
启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class,args);
}
}
熔断器(熔断效应)
pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(1) RestTemplate + Ribbon
@GetMapping("/findAllUsers")
@HystrixCommand(fallbackMethod = "findAllUsersFallback")
public List<String> findAllUsers() {
List list = restTemplate.getForObject("http://service-provider/loadUserNames",List.class);
return list;
}
public List<String> findAllUsersFallback(){
//准备核心业务访问
List<String> errors = new ArrayList<>();
errors.add("服务故障!");
return errors;
}
启动类
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
(2) OpenFeign
实现
/**
* name指定远程访问的服务名
*/
@FeignClient(name = "service-provider",fallback = UserClientServiceFallback.class)
public interface UserClientService {
@GetMapping("/loadUserNames")
public List<String> findAllUsers();
}
@Component //由spring容器声明实例并托管
class UserClientServiceFallback implements UserClientService{
@Override
public List<String> findAllUsers() {
List<String> errors = new ArrayList<>();
errors.add("服务故障!");
return errors;
}
}