在SpringCloud教程-03:负载均衡(Ribbon)一文中,我们介绍了如何使用Ribbon来实现客户端的负载均衡,在使用Ribbon时,一般会用RestTemplate来实现对远程服务的调用,但是这依旧不够简洁,每次在使用RestTemplate去远程调用时,还是得写一些模板化的东西。Spring Cloud Feign,在此基础上做了更进一步的封装,我们只需要创建一个接口,并使用注解的方式配置一下,就可以完成对服务提供方的绑定和调用。
本文介绍如何使用Feign实现客户端的负载均衡,主要分为以下几个步骤:
1.创建项目
新建一个Springboot项目feign_server1。
2.引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.修改配置文件
server:
port: 8015
spring:
application:
name: feign-server1
eureka:
client:
service-url:
default: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
4.添加启动注解
启动类添加@EnableFeignClients,开启Feign的负载均衡功能
//开启Feign的负载均衡功能
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class FeignServer1Application {
public static void main(String[] args) {
SpringApplication.run(FeignServer1Application.class, args);
}
}
5.跨服务调用
写个简单的接口方法来调用。
5.1controller
@RestController
//@RequestMapping(value = "feign")
public class FeignController {
//编译报错,可以不用管,程序启动时才会注入此bean
@Autowired
FeignService feignService;
@GetMapping("getCompany")
public String getCompany(String id){
String company = feignService.getCompany(id);
System.out.println(company);
return company;
}
}
5.2service
通过@FeignClient来指定我们调用哪个服务,前面启动了两个服务,都为company-server,feign会通过服务名来调用服务。
//通过此注解,来指定调用哪个服务
@FeignClient(value = "company-server")
public interface FeignService {
/**调用company-server服务中的company/get接口*/
@GetMapping(value = "/company/get")
String getCompany(@RequestParam(value = "id")String id);
}
6.启动项目,测试
启动项目,然后访问接口http://localhost:8015/getCompany?id=36,可以看到服务会自动负载到两台服务上。