Feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service. SpringCloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
只需要创建一一个接口,然后添加注解即可!
feign 主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
Ribbon RestFul风格
Feign 面向接口
Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,
不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
在 springcloud-api
项目的springcloud下创建service包
也可创建springcloud-api-feign
maven项目,更直观项目不凌乱,导入springcloud-api所有内容。
导入Feign依赖
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
<version>1.4.6.RELEASEversion>
dependency>
在service中创建DeptClientService
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@PostMapping("/dept/list")
public List<Dept> queryAll();
@GetMapping("/dept/add")
public boolean addDept(Dept dept);
}
新创建maven项目 springcloud-consumer-dept-feign
复制springcloud-consumer-dept-80
项目的所有内容,更改启动类名称为FeignDeptConsumer_80
导入feign依赖
<dependency>
<groupId>org.examplegroupId>
<artifactId>springcloud-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
<version>1.4.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-ribbonartifactId>
<version>1.4.6.RELEASEversion>
dependency>
DeptConsumerController的内容
@RestController
public class DeptConsumerController {
//Feign面向接口编程
//springcloud-api-feign 下的service
@Autowired
private DeptClientService deptClientService =null;
//添加数据
@RequestMapping("/consumer/dept/add")
public boolean add(Dept dept){
return deptClientService.addDept(dept);
}
//通过id查询
@RequestMapping("/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return deptClientService.queryById(id);
}
//查询所有
@RequestMapping("/consumer/dept/list")
public List<Dept> queryAll(){
return deptClientService.queryAll();
}
}
在DeptConsumer_feign启动类加上Feign相关注解@EnableFeignClients(…)
//消费者 运行方式80可省略 例:localhost/consumer/dept/list
@SpringBootApplication
@EnableEurekaClient //在服务启动后,自动注册到Eureka注册中心中
@EnableFeignClients(basePackages = {"com.lemon.springCloud"}) //Feign被扫描到
public class DeptConsumer_feign {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_feign.class,args);
}
}
启动注册中心,启动服务提供者,启动当前80端口。运行浏览器,根据控制器配置的路径访问,运行没问题,完成。