摘要:我们回顾下上堂课的知识点–ribbon;以及我们为什么需要用ribbon;简单的来说;ribbon的使用可以使得整体项目服务访问更加稳定可靠安全;不担心一个服务宕机而出现系统崩的问题。其实我们前面就已经将springcloud的两大要点学的差不多了;领会之前的教学;相信你们对微服务这种分布式项目没有三四也有一二的理解了;咋们也要坚持对接下来的学习及前面的复习;还有自己去GitHub上找些大神写的微服务项目去看看;看看人家是怎么写的;这样会才能使得自己的进步更快;更有成效。
一、Feign简介
fegin是什么?它也有负载均衡的功能;那么它跟ribbon的负载均衡有啥区别呢?正所谓一车容不下两方向盘啊;那么我们到底用哪一个呢?等等;脑海里出现一大堆小问题;别着急;待我慢慢讲来,给你们一一解答。首先呢;Feign 是在 Ribbon 的基础上进行了一次改进,之前我们都是使用ribbon+RestTemplate 进行业务访问;由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了一些进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它。现在的代码规范大家都已习惯呢对接口一个编程;就比如我们的DAO接口层上标注@Mapper注解来以实现绑定;从而调用对数据库的访问;而现在呢;也一样的开发模式;不同的就是访问的对象不同;现在是一个微服务接口;只需标注Feign注解也即可达到对服务提供方的接口绑定,这样从而简化使用Ribbon时,自己去封装服务调用客户端的开发量。
- 新建feign子项目 --microservicecloud-consumer-dept-feign
为了与之前的ribbon访问有对比;我们新建一个子项目;这里pom文件与microservicecloud-consumer-dept-80的pom文件一致(可以去掉ribbon的jar包);另外我们还需要加上feign的jar包:
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
- 新建service层
为了方便大家理解:在此特说明下这个service层;我将新建在api公共子项目里面;就是为了方便其他的子项目共同调用。看代码:
package com.chihiro.microservice.service;
import com.chihiro.microservice.entity.Dept;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.xml.ws.RequestWrapper;
import java.util.List;
@FeignClient(value = "MICROSERVICECLOUD-DEPT") //绑定MICROSERVICECLOUD-DEPT服务接口
public interface DeptClientService {
@RequestMapping(value = "/dept/list/{deptno}",method = RequestMethod.GET)
public Dept list(@PathVariable("deptno") int deptno);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();
}
- 消费者(Consumer)调用
package com.chihiro.microservice.controller;
import com.chihiro.microservice.entity.Dept;
import com.chihiro.microservice.service.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@Controller
public class DeptController_consumer {
@Autowired
private DeptClientService deptClientService;
@RequestMapping(value = "/consumer/dept/list")
@ResponseBody
public List<Dept> list()
{
return deptClientService.list();
}
@RequestMapping(value = "/consumer/dept/{deptno}")
@ResponseBody
public Dept list(@PathVariable("deptno") int deptno)
{
return deptClientService.list(deptno);
}
}
方便大家的理解;我将原码献上:https://gitee.com/Chirhiro/springcloud-4