基于Feign实现服务调用

  1. 1. 一、什么是Feign
  2. 2. 二、Feign的使用
    1. 2.1. 1. 导入依赖:
    2. 2.2. 2. 在主类上添加Fegin的注解
    3. 2.3. 3. 创建一个service, 并使用Fegin实现微服务调用
    4. 2.4. 4. 测试结果

不要假装努力,结果不会陪你演戏

一、什么是Feign

​ Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务
一样简单, 只需要创建一个接口并添加一个注解即可。
​ Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

二、Feign的使用

1. 导入依赖:

1
2
3
4
5
<!--fegin-->
<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 // 开启feign
@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")  // value指定是哪个微服务
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

启动微服务

运行结果:

注: 在poduct服务中调用admin服务,结果是它会在不同的端口(8071,8072)实现随机挑选admin服务,即有时在AdminApplication打印结果,有时候又在AdminApplication2打印。