Spring Cloud 学习 | - 05 - 服务消费(Feign方式)

男娘i 2022-02-25 00:04 305阅读 0赞

文章目录

  • Spring Cloud 学习 | - 05 - 服务消费(Feign方式)
      1. Feign简介
      1. 启动Eureka注册中心
      1. 启动服务提供者
      • 3.1 修改提供者Service
      • 3.2 修改提供者Controller
      • 3.3 启动2个服务提供者
      1. Feign方式服务消费者
      • 4.1 新建项目及其依赖
      • 4.2 启用Feign功能
      • 4.3 编写Feign客户端
      • 4.4 测试接口
      • 4.5 负载均衡

Spring Cloud 学习 | - 05 - 服务消费(Feign方式)

学习 Spring Cloud 之路,文中 Spring Boot 版本为 2.1.3.RELEASESpring Cloud 版本为 Greenwich.SR1 。因能力有限,难免会有不足或者错误之处,还望不吝指正,谢!

之前 Spring Cloud 学习 | - 03 - 服务消费(Rest + Ribbon实现负载均衡),我们使用Rest+Ribbon方式实现消费的负载均衡。如果只是这样,那么以后我们可能需要编写大量重复代码,而且格式基本相同,只是参数不同罢了,能不能有一种更优雅简洁的方式实现呢?我们可以用Feign方式实现。

1. Feign简介

Feign是Netflix开发的声明式、模块化的HTTP客户端。Feign可以帮助我们更加便捷、优雅的调用HTTP API, 可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,完全感知不到这是远程方法,更感知不到这是个HTTP请求。
在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码便完成了。Feign支持多种注解,礼服Feign自带的注解或JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了RIbbon和Eureka,从而让Feign的使用更加方便。

2. 启动Eureka注册中心

详细请查阅Spring Cloud 学习 | - 01 - Eureka服务注册与发现一文。

3. 启动服务提供者

3.1 修改提供者Service

Service接口:

  1. public interface UserService {
  2. /** * 查询所有用户 * @return */
  3. List findAll();
  4. /** * hello,${name} * @param name * @return */
  5. String hello(String name);
  6. }

实现类:

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. /** * 查询所有用户 * @return */
  4. @Override
  5. public List findAll() {
  6. List list = Arrays.asList("Cindy","Pony","Marry");
  7. return list;
  8. }
  9. @Override
  10. public String hello(String name) {
  11. return "Hello, " + name;
  12. }
  13. }

3.2 修改提供者Controller

代码如下:

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Value("${server.port}")
  5. private String port;
  6. @Autowired
  7. private UserService userService;
  8. private Map<String, Object> data = null;
  9. @GetMapping("/{name}")
  10. public Map<String, Object> hello(@PathVariable String name) {
  11. String hello = userService.hello(name);
  12. data = new HashMap<>(4);
  13. data.put("port", port);
  14. data.put("msg", hello);
  15. return data;
  16. }
  17. }

3.3 启动2个服务提供者

启动2个user-provider服务,端口分别为8090和8091,详细步骤请参阅https://blog.csdn.net/xudc0521/article/details/88878904#31_2_181。

4. Feign方式服务消费者

4.1 新建项目及其依赖

利用Spring Initializr快速创建一个Spring Boot项目,主要依赖如下:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-openfeign</artifactId>
  12. </dependency>

4.2 启用Feign功能

在XxxApplication主启动类上加上注解@EnableFeignClients,同时也要加上服务发现的注解@EnableDiscoveryClient,完整代码如下:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableFeignClients // 启用Feign功能
  4. public class UserConsumerFeignApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(UserConsumerFeignApplication.class, args);
  7. }
  8. }

4.3 编写Feign客户端

新建一个接口UserService,修改代码如下:

  1. @FeignClient("user-provider")
  2. public interface UserService {
  3. /** * hello,${name} * @param name * @return */
  4. @GetMapping("/user/{name}")
  5. Map<String, Object> hello(@PathVariable String name);
  6. }
  • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类
  • @FeignClient()声明这是一个Feign客户端,value值指定服务提供者名称,即调用哪个服务
  • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

4.4 测试接口

添加一个Junit方法测试,代码如下:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class UserConsumerFeignApplicationTests {
  4. @Autowired
  5. private UserService userService;
  6. @Test
  7. public void contextLoads() {
  8. for (int i = 0; i < 10; i++) {
  9. Map<String, Object> map = userService.hello("Cindy" + i);
  10. System.err.println(map);
  11. }
  12. }
  13. }

输出结果:
在这里插入图片描述

4.5 负载均衡

Feign中本身已经集成了Ribbon依赖和自动配置,默认实现了负载均衡。
在这里插入图片描述
因此我们不需要额外引入依赖,也不需要再注册RestTemplate对象。

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读