目录
Feign简介
Feign能干什么?
Feign默认集成了Ribbon
Feign的使用步骤
1.04-springcloud-consumer-dept-feign-80
1.pom.xml
2.application.yml 和 configBean 【不变】
3.DeptConsumerController
4.FeignDeptConsumer_80 (扫描包)
2.改造springcloud-api模块
1.pom.xml
2.DeptClientService
3 Feign和Ribbon如何选择?
Feign简介
Feign是声明式Web Service客户端,它让微服务之间的调用变得更简单,类似controller调用service。SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端
只需要创建一个接口,然后添加注解即可~
Feign,主要是社区版,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法
- 微服务名字 【ribbon】
- 接口和注解 【feign】
Feign能干什么?
- Feign指在使编写Java Http客户端变得更容易
- 前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
Feign默认集成了Ribbon
- 利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
Feign的使用步骤
1.04-springcloud-consumer-dept-feign-80
1.pom.xml
Riboon依赖换成openfeign
<dependencies>
<!--Feign的依赖-->
<!-- 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.1.1</version>
</dependency>
<!--Eureka: Ribbon需要从Eureka服务中心获取要拿什么-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--实体类 + web -->
<dependency>
<groupId>com.gh</groupId>
<artifactId>01-springcloud-api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
2.application.yml 和 configBean 【不变】
3.DeptConsumerController
java">@RestController
public class DeptConsumerController {
@Autowired
private DeptClientService service = null;
@RequestMapping("/consumer/dept/{id}")
public Dept queryById(@PathVariable("id")Long id){
return this.service.queryById(id);
}
@RequestMapping("/consumer/dept/list")
public List<Dept> queryAll(){
return this.service.queryAll();
}
@RequestMapping("/consumer/dept/add")
public Boolean addDept(Dept dept){
return this.service.addDept(dept);
}
}
4.FeignDeptConsumer_80 (扫描包)
java">@SpringBootApplication
@EnableEurekaClient //开启Eureka 客户端
@EnableFeignClients(basePackages = {"com.gh.service"})
@ComponentScans({@ComponentScan("com.gh.service")})
public class FeignDeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(FeignDeptConsumer_80.class, args);
}
}
特别注意:
@ComponentScan("com.gh.service")
@ComponentScans({@ComponentScan("com.gh.service")})
这里可能报错404,原因是因为FeignDeptConsumer_80启动类使用了
@SpringBootApplication和@ComponentScan("com.gh.service"),当只有一个@ComponentScan的时候,SpringBootApplication是不会被加载的
解决办法:
@ComponentScans({@ComponentScan("com.ghservice")}) 代替componentScan这种方法可以让@SpringBootApplication 和 多个 @ComponentScan("com.ghservice") 共存。
2.改造springcloud-api模块
1.pom.xml
<!--Feign的依赖-->
<!-- 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.1.1</version>
</dependency>
2.DeptClientService
@FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
java">@Component
@FeignClient(value ="02-SPRINGCLOUD-PROVIDER-DEPT-8001")
public interface DeptClientService {
@GetMapping("/dept/list")
List<Dept> queryAll();
@GetMapping("/dept/{id}")
Dept queryById(@PathVariable("id") Long id);
@PostMapping("/dept/add")
Boolean addDept(Dept dept);
}
3 Feign和Ribbon如何选择?
根据个人习惯而定,如果喜欢REST风格使用Ribbon;如果喜欢社区版的面向接口风格使用Feign.
Feign 本质上也是实现了 Ribbon,只不过后者是在调用方式上,为了满足一些开发者习惯的接口调用习惯!