openfeign介绍
声明式 WebService 客户端,可以代替RestTemplate实现uri请求
eg:RestTemplate实现服务请求
config层配置RestTemplate类
@Configuration public class CustomizationBean { //返回RestTemplate对象,用于http发送,如post get @Bean @LoadBalanced //这个表示给RestTemplate 负载均衡的能力,用轮询算法(eg:先10001再10002,再10001 。。。)去选择某个服务去访问 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
controller层配置
通过restTemplate.getForObject get方式 请求对应10001、10002服务
//定义一个url地址 对应 member-service-provider-10000服务 // public static final String MEMBER_SERVICE_PROVIDER_URL = // "http://localhost:10001" public static final String MEMBER_SERVICE_PROVIDER_URL = "http://MEMBER-SERVICE-PROVIDER"; //MEMBER-SERVICE-PROVIDER :表示服务提供方集群,对外暴露的名称,对应k-v值为10001和10002两个微服务 //通过@LoadBalanced注解到RestTemplate,就会用轮询算法选择哪个v值。
//根据id找到member数据 @GetMapping(value = "/member/consumer/get/{id}") public Result<Member> getMemberById(@PathVariable("id") Long id) { log.info("service-consumer id = {}",id); return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL+"/member/get/"+id,Result.class); }
运行类配置
@EnableEurekaClient//配置eureka客服端 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableDiscoveryClient //启用 服务发现 @RibbonClient(name = "MEMBER-SERVICE-PROVIDER",configuration = RibbonRule.class) //指定负载均衡算法为RibbonRule类中的myRibbonRule(RandomRule算法) public class MemberConsumerApplication { public static void main(String[] args) { SpringApplication.run(MemberConsumerApplication.class, args); } }
eg:openfeign实现服务请求
service层
只需要配置对应10001、10002服务uri请求的方法接口即可
@Component @FeignClient(value = "MEMBER-SERVICE-PROVIDER")//member-service-provider对应eureka server中的k-v的k值 public interface MemberFeignService { //定义远程调用的接口 // MEMBER-SERVICE-PROVIDER和/member/get/{id}组合 // 成为 http://localhost:10001:/member/get/{id} @GetMapping(value = "/member/get/{id}") public Result getMemberById(@PathVariable("id") Long id); }
controller层
只需要调用service层openfeign接口即可
@RestController public class MemberConsumerController { //调用openfeign接口 @Resource private MemberFeignService memberFeignService; @GetMapping(value = "member/consumer/openfeign/get/{id}") public Result getMemberById(@PathVariable("id") Long id) { return memberFeignService.getMemberById(id); } }
运行类配置
只需要开启openfeign 加注解@EnableFeignClients//启用openfeign
@SpringBootApplication @EnableEurekaClient @EnableFeignClients//启用openfeign public class MemberConsumerOpenfeignApplication { public static void main(String[] args) { SpringApplication.run(MemberConsumerOpenfeignApplication.class,args); } }
openfeign日志配置
日志级别
NONE∶默认的,不显示任何日志
BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
HEADERS∶除了 BASIC中定义的信息之外,还有请求和响应的头信息;
FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
config层
配置full级别
@Configuration public class OpenFeignConfig { @Bean //FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据 public Logger.Level loggerLevel(){ return Logger.Level.FULL; } }
application.yml
配置openfeign接口MemberFeignService
打印信息级别为debug
logging: level: #指定openfeign接口 打印信息-debug级别 com.zyz.springcloud.service.MemberFeignService: debug
当调用MemberFeignService接口方法时候,后台显示打印信息
eg:http://localhost/member/consumer/openfeign/get/1
openfeign超时
默认一秒等待返回时间。浏览器发出uri请求后一秒后未收到就会出现 time out
设置超时时间
application.yml
设置2000毫秒
ribbon: #建立连接 从服务提供方获取可用资源的所有全部时间 ReadTimeout: 2000 #两端连接所用时间 ConnectionTimeout: 2000