Feign和RestTemplate 的使用比较
一.RestTemplate
基于RestTemplate 进行远程服务调用,但是在调用之前基于loadBalancerClient对象去从nacos注册中心基于服务名查找服务实例(可能有多个),此时会在本地按照一定算法去选择服务实例,然后进行服务调用.
1.首先创建RestTemplate的实例,交给IOC容器管理
2.在Controller类中注入loadBalancerTemplate
3.通过@LoadBalancer,可以通过服务名sca-provider直接获取ip地址和端口号,缺点是方法不能重复调用.
二.feign是SpringCloud的一个组件
使用方式:
1.添加feign依赖
2.在启动类中添加注解@EnableFeignClients,这样在启动启动feign方式的服务调用(服务启动时会扫描@FeignClient注解描述的接口,并基于接口创建代理对象)由代理对象帮我们发起远程调用.
3.写服务调用的接口,底层会在服务启动时帮我们创建实现(代理对象),在实现类内部进行远程服务调用
其中:1),name属性的值为nacos中的服务名
2),contextId 为一个当前接口名,如果不写清楚 当有两个方法访问sca-provider时,底层会同时注册sca-provider时 会出现bean重复注册的.
因为将来一个服务提供方会提供很多资源调用,此时假如没有指定contextId,服务启动就会重复注册sca-provider从而导致失败 fallbackFactory用于指定服务中断或异常时,应该返回给客户端的默认结果
此处的fallbackFactory用于指定服务中断或异常时,应该返回给客户端的默认结果.
4.写一个feign的controller,用来调用service中的接口
@RestController
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
// @PathVariable URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中
@GetMapping("/feign/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
return remoteProviderService.echoMsg(msg);
}
}