原创文章,转载请注明原文章地址,谢谢!
Feign旨在使编写Java Http客户端变得更容易。前面在使用Ribbon+RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign再次基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可)即可完成对服务提供方的接口绑定,简化了使用SpringCloud Ribbon时,自动封装服务调用客户端的开发量。
Feign配置
首先依旧是客户端的,参考服务消费者80模块,新建feign模块,其所有类和配置先和80模块的保持一致。接下来修改feign模块,在pom.xml中添加feign相关的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
因为我们待会儿需要在api模块中写关于feign的相关的接口,因为作为公共模块来讲,所有的消费者都要依赖这个api中的内容,所以会在api中写,那么同样在api模块的pom.xml中添加feign相关的依赖。接下来在api模块中新建接口,这个接口便是feign作为客户端需要被通过这个被调用的。
@FeignClient(value = "CLOUD-USER")
public interface UserClientService {
@GetMapping("/user/get/{id}")
User get(@PathVariable("id") Long id);
@GetMapping("/user/list")
List<User> list();
}
接着回到消费者feign,修改其控制器方法。
@RestController
public class ConsumerUserController {
@Autowired
private UserClientService userClientService;
@RequestMapping("/consumer/user/get/{id}")
public User get(@PathVariable("id") Long id) {
return userClientService.get(id);
}
@RequestMapping("/consumer/user/list")
public List<User> list() {
return userClientService.list();
}
}
最后别忘了在主启动类上添加@EnableFeignClients注解,便是开启Feign服务调用功能。然后测试,启动三个eureka和三个服务提供者,最后启动消费者feign,多次访问localhost/consumer/user/get/1,注意观察看到返回的数据库名字,各不相同,负载均衡实现。
总结
- Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate)该请求发送给Eureka服务器(CLOUD-USER/user/get/1)通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。
- Feign自带负载均衡配置项。Feign继承了Ribbon,利用Ribbon维护了CLOUD-USER的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
博客内容仅供自已学习以及学习过程的记录,如有侵权,请联系我删除,谢谢!
网友评论