Why:
消费方每次都要自己拼接URL很费事,所以就有了feign
What:
Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用
How
step1:添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
step2:在启动类上添加@EnableFeignClients注解
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {…}
step3:定义Http请求API,基于此API借助OpenFeign访问远端服务,(搞一个方法,让其和provider搭上线)
package com.jt.consumer.service;
@FeignClient(name="sca-provider")//sca-provider为服务提供者名称
public interface RemoteProviderService{
@GetMapping("/provider/echo/{string}")//前提是远端需要有这个服务
public String echoMessage(@PathVariable("string") String string);
}
@FeignClient:连接的名字
/provider/echo/{string}:连接的是什么
Step4:调用
package com.jt.consumer.controller;
@RestController
@RequestMapping("/consumer/ ")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
/**基于feign方式的服务调用*/
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
//基于feign方式进行远端服务调用(前提是服务必须存在)
return remoteProviderService.echoMessage(msg);
}
}
最终,用户基于/echo/{msg}进行访问。
Feign进阶
1.contextId
如果一个提供方,有多个接口,这个时候需要为远程调用服务接口指定一个contextId,作为远程调用服务的唯一标识
这样会失败,因为重名了
这时,我们使用如下操作:
这样就可以进行正常的调用了。
2.FallbackFactory:
当我们调用失败时,这个时候会有一个容错的解决方案。
1.创建类
package com.cy.service.factory;
/**
* 基于此对象处理RemoteProviderService接口调用时出现的服务中断,超时等问题
*/
@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
/**
* 此方法会在RemoteProviderService接口服务调用时,出现了异常后执行.
* @param throwable 用于接收异常
*/
@Override
public RemoteProviderService create(Throwable throwable) {
return (msg)->{
return "服务维护中,稍等片刻再访问";
};
}
}
implements FallbackFactory<RemoteProviderService>:如果RemoteProviderService出问题,就会跑过来。
2.把这个方法写进去
@FeignClient(name = "sca-provider", contextId = "remoteProviderService",
fallbackFactory = ProviderFallbackFactory.class)//sca-provider为nacos中的服务名
public interface RemoteProviderService {
@GetMapping("/provider/echo/{msg}")
public String echoMsg(@PathVariable String msg);
}
3.配置打开:
feign:
hystrix:
enabled: true #默认值为false
小节面试分析
- 为什么使用feign?(基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用)。
- @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
- Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)
- @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
总结(Summary)
何为注册中心?(用于记录服务信息的一个web服务,例如淘宝平台,滴滴平台,美团外卖平台,……)
注册中心的核心对象?(服务提供方,服务消费方,注册中心-Registry)
市面上常用注册中心?(Google-Consul,Alibaba-Nacos,…)
常见问题分析
@LoadBalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
Ribbon是什么,基于Ribbon可以解决什么问题?(一个负载均衡组件,这个组件中提供一套负载均衡算法)
为什么要负载均衡?(网络中有一组可以提供相同服务的计算机~类似银行的各个营业点)
你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)
我们如何修改负载均衡策略?(配置文件->例如application.yml,配置类->例如启功类)
为什么使用Feign方式的服务调用?(声明式远程调用,优化结构,简化服务调用过程代码的编写)
如何基于feign方式实现远程服务调用?(依赖-openfeign,配置,feign接口定义)
@EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类,告诉底层启动feign starter组件)
@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
如何理解基于Feign方式的远程服务调用?(声明式远程服务调用,底层封装了服务调用过程。)
Feign方式如何实现负载均衡?(底层基于ribbon组件实现)
Feign接口指向的对象是谁?(代理对象-feign接口的实现类对象)