feign使用
快速入门
package cn.itcast.service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker //开启熔断
@SpringCloudApplication //组合注解,相当于@SpringBootApplication,@EnableDiscoveryClient,@EnableCircuitBreaker
@EnableFeignClients //启用feign组件
public class ItcastServiceConsumerApplication {
// @Bean
// @LoadBalanced
// public RestTemplate restTemplate(){
// return new RestTemplate();
// }
public static void main(String[] args) {
SpringApplication.run(ItcastServiceConsumerApplication.class, args);
}
}
package cn.itcast.service.client;
import cn.itcast.service.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@FeignClient("service-provide") //声明一个接口是一个feign接口,指定服务id
public interface UserClient {
@GetMapping("user/{id}")
public User qusetyUserById(@RequestParam("id")Long id);
}
package cn.itcast.service.controller;
import cn.itcast.service.client.UserClient;
import cn.itcast.service.pojo.User;
import javafx.beans.DefaultProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@Controller
@RequestMapping("consumer/user")
//@DefaultProperties(defaultFallback = "qusetyUserByIdFallback")
public class UserController {
@Autowired
private UserClient userClient;
// @Autowired
// private RestTemplate restTemplate;
// @Autowired
// private DiscoveryClient discoveryClient; //包含了拉取的所有服务信息
@GetMapping
@ResponseBody
@HystrixCommand
public String qusetyUserById(@RequestParam("id")Long id){
// if (id == 1){
// throw new RuntimeException();
// }
// List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
// ServiceInstance instance = instances.get(0);
return this.userClient.qusetyUserById(id).toString();
}
public String qusetyUserByIdFallback(Long id){
return "服务正忙,稍后再试";
}
}
熔断
server:
port: 80
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
fetch-registry: true #拉取服务列表,缓存到本地
registry-fetch-interval-seconds: 5 #拉取列表的间隔时间
service-provider: #服务提供方的服务id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #调用随机算法
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 6000 # 设置hystrix的超时时间为6000ms
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
package cn.itcast.service.client;
import cn.itcast.service.pojo.User;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
@Component
public class UserClientFallback implements UserClient {
@Override
public User qusetyUserById(Long id){
User user = new User();
user.setUserName("服务器正忙,请稍后再试");
return user;
}
}
package cn.itcast.service.client;
import cn.itcast.service.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@FeignClient("service-provide", fallback = UserFeignClientFallback.class)
public interface UserClient {
@GetMapping("user/{id}")
public User qusetyUserById(@RequestParam("id")Long id);
}