系列目录

【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战


本文目录

  • 系列目录
  • 前言
  • 什么是RPC?
  • Feign和OpenFeign都是什么?
  • HTTP调用 vs Feign(RPC)调用
  • 单独使用Feign实战
  • Feign核心源码解读
  • Feign整体设计架构
  • Spring Cloud OpenFeign实战
  • Feign在实际项目的通常做法
  • 最后

前言

通过上文,我们掌握了Spring Cloud Alibaba微服务框架的初始环境搭建,并能通过Nacos注册中心的服务注册和发现,配合RestTemplate和Ribbon,实现2个服务之间通过服务名进行远程调用。
实际上,微服务之间的调用还有更简单、更方便、更强大的调用方式,那就是RPC调用!本文所讲的微服务调用组件Feign,正是RPC框架之一!
本文会循序渐进的从Feign讲到OpenFeign,并会讲到Feign核心原理实际项目使用OpenFeign的通常做法

  • 单独使用Feign实战,实现2个服务之间的RPC调用;
  • Feign核心源码解读;
  • Feign整体设计架构预览;
  • Spring Cloud Alibaba快速整合Feign,实现2个服务之间通过Nacos服务注册发现的RPC调用;
  • Feign在实际项目的通常做法。

什么是RPC?

RPC(Remote Produce Call),即远程过程调用,目的是:调用[远程服务方法]像调用[本地方法]一样!


Feign和OpenFeign都是什么?

Feign是RPC框架中的一种,是Netflix开发的声明式、模板化的HTTP客户端,底层依然是走的HTTP调用,但表现形式是接口调用,可以帮助我们更加便捷、优雅地调用HTTP API,就像调用本地方法一样方便。
它通过扩展集成了Netflix Ribbon,从而拥有负载均衡的功能,默认是基于配置来提供服务实例列表

OpenFeign是指Spring Cloud OpenFeign,是Spring Cloud开发的,对Feign进行了增强,使其支持Spring MVC注解,还整合了Spring Cloud Netflix Ribbon,从注册中心获取服务实例(在Spring Cloud Alibaba框架中的注册中心默认是Nacos),从而使得Feign与Spring Cloud整合。


HTTP调用 vs Feign(RPC)调用

回顾一下RestTemplate方式的服务调用(gg-user是服务名):

@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getUserName")public String getUserName(@RequestParam("id") Integer id) {    String url = String.format("http://%s/user" />

ReflectiveFeign.newInstance方法内会调用Proxy.newProxyInstance生成动态代理类,如下图:

  • Feign是如何集成的Ribbon" />


    Feign整体设计架构

    通过上面的源码解读,我想你应该可以看懂架构图的上部和下部,Feign实际在设计上考虑了很多扩展功能,像Client、Log、Interceptor、Contract等等,非常灵活,非常强大,给了我们足够的扩展空间,它对所有的组件都提供了接口,如果对接口的实现类不满意,还可以基于Feign的接口来自定义实现。
    所以,Spring Cloud正是通过Feign的扩展,将Feign完美整合到Spring Cloud框架中,形成了Spring Cloud OpenFeign


    Spring Cloud OpenFeign实战

    单独使用Feign的时候,我们还需要做一些配置,可一旦被Spring Cloud整合,那么一切就会变得非常非常简单,只需要加依赖+加注解

    接下来,基于上文的Spring Cloud Alibaba工程环境,我们改造demo-a服务,将RestTemplate调用改成OpenFeign调用。

    只需要三步就可以达到效果。

    • 第一步:引入 OpenFeign 组件

    额外增加包spring-cloud-starter-openfeign,不用加版本,都在父工程定义了,上文已经说了版本。

    <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
    • 第二步:定义远程API接口加@FeignClient

    接口上额外增加@FeignClient注解,value=服务名
    方法上换成SpringMVC注解,代替Feign注解

    @FeignClient(value = "demo-b")public interface UserService { @GetMapping("/user" />日志分析、自定义统一拦截器、客户端组件配置、GZIP压缩等等,这也是我计划将在下文分享的内容,如果感觉不错,欢迎订阅本专栏,后面还有更多的【Spring Cloud Alibaba】实战知识陆续放出。

    关注我 天罡gg 分享更多干货: https://blog.csdn.net/scm_2008
    大家的「关注❤️ + 点赞 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!