1 feign负载均衡
1.1 简介
feign是声明式的web service客户端,它让微服务之间的调用变得更加简单了,类似controller调用service,springcloud集成了ribbon和eureka,
可在使用feign时提供负载均衡的http客户端。
只需要创建一个接口,然后添加注解即可
feign主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范,调用微服务访问两种方法
- 微服务名称【RestTemplate+ribbon】
- 接口和注解【feign】
1.2 feign能干什么
- feign使编写java http 客户端变得更容易
- 前面在使用RestTemplate+ribbon时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所有通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。若依feign在此基础上做了进一步封装,由他来帮助定义和实现依赖服务接口的定义
- 在feign的实现下,只需要创建一个接口并使用注解的方式来配置(类似于在Dao接口上标注@Mapper注解)现在是一个微服务接口上标注一个Feign注解即可
- 添加上注解即可完成对服务提供方的接口绑定,简化使用springcloud ribbon时,自动封装服务调用客户端的开发量
1.3 feign集成ribbon
利用ribbon维护了微服务列表信息,并且通过轮询实现了客户端的负载均衡,而与ribbon不同的是,通过reign只需要定义服务绑定且以声明式的方法,可读性而且简单的实现了服务调用。
1.4 代码示例
新增一个feign工程
pom
新增feign项目的pom
<dependencies>
<dependency>
<artifactId>demo-parent</artifactId>
<groupId>springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--导入Ribbon的同时要导入erueka,因为它要发现服务从那里来-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>springcloud</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</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>
</dependency>
</dependencies>
yml
和之前的消费者一样
server:
port: 8080
# eureka配置
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka0.com:8000/eureka/,http://eureka1.com:8100/eureka/,http://eureka2.com:8200/eureka/
DeptConsumerController
@RestController
@RequestMapping("/dept")
public class DeptConsumerController {
@Autowired
private DeptClientService deptClientService = null;
@RequestMapping("/findAll")
public List<Dept> findAll() {
return this.deptClientService.findAll();
}
@RequestMapping("/findById/{id}")
public Dept findById(@PathVariable("id") int id) {
return this.deptClientService.findById(id);
}
@RequestMapping("/add")
public int add(@RequestBody Dept dept) {
return this.deptClientService.addDept(dept);
}
}
启动类
@SpringBootApplication
//@EnableEurekaClient //服务启动后注册在eureka上
@EnableFeignClients(basePackages = {"com.ccct"})
public class FeignConsumerDept8080 {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerDept8080.class, args);
}
}
1.5 API工程代码调整
因为feign更接近java面向接口编程,所以需要创建一个接口类
pom
先导入依赖
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
DeptClientService
@Component
@FeignClient(value = "PROVIDER-DEPT/dept")
public interface DeptClientService {
@GetMapping("/findAllDept")
List<Dept> findAll();
@GetMapping("/findById/{id}")
Dept findById(@PathVariable("id") int id);
@PostMapping("/add")
int addDept(@RequestBody Dept dept);
}
注意:
- 提供者中@RequestMapping("/dept")中带的地址需要写在@FeignClient的value中;
- 方法上面的路径地址需要和提供者中的对应;不然会报404。
最后,启动注册中心,提供者、消费者就可以测试验证了