Feign和Ribbon 都是做负载均衡的
- 在SpringCloud之Eureka和Ribbon的使用的基础上将Ribbon换成Feign
在API(pojo)项目创建Service,和服务提供者中的service一样
- 接口名称可以不一样,就和Dubbo和Zookeeper类似
- 接口的内容要一致,且在api中的service的接收请求要和服务提供者中的controller要一样
步骤
- 导入依赖
- 在实体类项目编写service
- 在服务消费者的controller中使用实体类项目中的service
- 导入依赖 在服务提供者导入依赖
<dependencies>
<!-- 实体类-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
- 在实体类项目编写service
@Service
@FeignClient(name= "SPRINGCLOUD-PROVIDER-DEPT")//value=服务id
public interface FeignDeptService {
@RequestMapping(value = "/add")
boolean addDept(@RequestBody Dept dept);
@GetMapping("/byId/{id}")
Dept getById(@PathVariable(value = "id") int id);
@GetMapping("/getAll")
List<Dept> getAll();
}
- 在服务提供者中使用实体类项目中的service
@RestController
public class FeignDeptConsumerController {
//消费者,不应该有service层
//RestTemplate提供多种便捷访问远程http服务的方法,简单的restful服务模板
@Autowired
private FeignDeptService feignDeptService;
@GetMapping("/consumer/add/")
public boolean add(Dept dept){
return feignDeptService.addDept(dept);
}
@GetMapping("/consumer/byId/{id}")
public Dept getDeptById(@PathVariable(value = "id") int id){
return feignDeptService.getById(id);
}
@GetMapping("/consumer/getAll")
public List getAll(){
return feignDeptService.getAll();
}
}
小结
用到的注解
-
@FeignClient
(name= "SPRINGCLOUD-PROVIDER-DEPT")//value=服务id
在Api接口上
-
@EnableFeignClients
//(basePackages = {"com.cloud.service"})
在服务消费者的启动类上,意为扫描声明它们是FeignClient客户端的接口(通过FeignClient
@FeignClient
)。 配置组件扫描指令,以与org.springframework.context.annotation.Configuration@Configuration
类一起使用