接上一篇:Spring cloud微服务搭建(六)——Ribbon负载均衡
在微服务中,有两种调用方式:
- Ribbon+RestTemplate
- Feign
Feign是社区产品,符合Java面向接口编程的开发风格。Feign内置了Ribbon,本质上还是通过Ribbon实现服务调用。使用Feign调用类似于在controller中直接调用service方法。
要实现Feign调用接口,只需两步:
- 新增一个服务接口。
- 用注解开启Feign。
Maven依赖
在消费方和新增Feign服务接口所在工程,都新增导入Feign依赖包,官方推荐用spring-cloud-starter-openfeign
:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.0</version>
</dependency>
新增Feign服务接口
建议和pojo类放在同一个工程,例如springcloud-api
,表示是公共资源。
-
@Component
:标记为容器中的一个bean,以便被自动扫描到。 -
@FeignClient
:一种标记注解,表示为支持Feign的服务接口。就像用@Mapper
注解修饰dao接口。value
/name
:配置服务提供方yaml文件中配置的spring.application.name
属性值。也是Eureka管理页面显示的aplication名称。
-
这个新增接口的方法签名建议与服务提供方controller中对应方法保持一致。
-
必须配置每个方法映射的url。
-
RequestMapping
中配置的url必须与服务提供方controller中对应方法映射url保持一致。 -
Feign会自动按照"http://SPRINGCLOUD-PROVIDER +url" 的链接去匹配服务提供方controller中的对应方法。
-
@Component
@FeignClient(value="SPRINGCLOUD-PROVIDER")
public interface DeptService {
@PostMapping("/dept/add")
boolean addDepartment(Department department);
@GetMapping("/dept/get/{id}")
Department queryById(@PathVariable("id") int id);
@GetMapping("/dept/list")
List<Department> queryForList();
}
消费方Controller
-
使用
@Autowired
自动注入新增Feign服务接口DeptService
。 -
直接调用接口方法。不需要配置服务提供方应用名或者IP端口信息,使代码更加简单干净。
@RestController
public class DeptController {
@Autowired
private DeptService deptService=null;
@RequestMapping("/consumer/dept/add")
public boolean addDept(Department department){
return deptService.addDepartment(department);
}
@RequestMapping("/consumer/dept/get/{id}")
public Department queryById(@PathVariable("id") int id){
return deptService.queryById(id);
}
@RequestMapping("/consumer/dept/list")
public List<Department> queryAll(){
return deptService.queryForList();
}
}
消费方启动类
-
@EnableEurekaClient
:开启对Eureka Client的支持 -
@EnableFeignClients
:开启对被@FeignClient注解的接口的自动扫描basePackages
:要自动扫描的基础包,即被@FeignClient注解的接口所在的包。
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "service")
public class Dept_Feign_80 {
public static void main(String[] args) {
SpringApplication.run(Dept_Feign_80.class,args);
}
}
测试执行
启动服务后,Feign默认按照轮询的规则交替返回db01和db02的数据。
更多:
Spring cloud开发环境搭建(一)——maven依赖
Spring cloud微服务搭建(三)—— Spring cloud服务提供方
Spring cloud微服务搭建(四)——Spring cloud 消费方