一、什么是Feign
Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务
一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
二、Feign的使用
1. 导入依赖:
1 2 3 4 5
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
|
2. 在主类上添加Fegin的注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @EnableDiscoveryClient @EnableFeignClients @SpringBootApplication public class ShopProductApplication {
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
public static void main(String[] args) { SpringApplication.run(ShopProductApplication.class, args); } }
|
3. 创建一个service, 并使用Fegin实现微服务调用
1 2 3 4 5 6
| @FeignClient(value = "admin") public interface AdminService {
@GetMapping("/admin/{id}") Admin getAdminById(@PathVariable("id") int id); }
|
调用的是Admin模块的 AdminController.java 里的方法
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController public class AdminController { @Autowired private AdminService adminService; @GetMapping("/admin/{id}") public Admin getAdminById(@PathVariable int id) { System.out.println("1111"); return adminService.getAdminById(id); }
}
|
service-product模块 -> ProductController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @RestController public class ProductController {
@Autowired private AdminService adminService; @Autowired private RestTemplate restTemplate;
@GetMapping("/shop/admin/{id}") public String getAdminById(@PathVariable("id") int id) { Admin admin = adminService.getAdminById(id); System.out.println(admin.toString()); return "success!"; }
}
|
4. 测试结果
自定义实现负载均衡: 通过idea再启动一个 admin2微服务,设置其端口为8072
![](/../images/java/a14.png)
启动微服务
![](/../images/java/a13.png)
运行结果:
![](/../images/java/a12.png)
注: 在poduct服务中调用admin服务,结果是它会在不同的端口(8071,8072)实现随机挑选admin服务,即有时在AdminApplication打印结果,有时候又在AdminApplication2打印。