微服务服务注册与发现

一、系统架构

我们用微服务架构开发商城项目时首先需要划分微服务,通常是按照业务模块进行划分,同时也会将一些通用的功能抽取成一个微服务,微服务要做到单一职责,高内聚低耦合。

:::warning
用户端请统一请求到网关(比如nginx),由网关将请求转发到微服务。

每个微服务是一个Spring Boot工程,微服务的地址统一由服务注册中心管理。

每个微服务有自己的数据库,比如:商品数据库、用户数据库。

在数据层除了MySQL之外还有非关系数据库Redis、ES等,满足不同的需求。

:::

商城系统架构图:

二、认识Spring Cloud

(1)Spring Cloud介绍

每个微服务是一个SpringBoot工程,微服务之间的通信协作、服务保护等各种问题都有对应的解决方案和微服务组件,SpringCloud框架可以说是目前Java领域最全面的微服务组件的集合了,如下图:

Spring Cloud 是一个基于 Spring Boot 的微服务开发框架,它依托于SpringBoot的自动装配能力,它提供了一套完整的微服务解决方案。Spring Cloud 旨在帮助开发者快速构建分布式系统中的服务,包括_服务发现、配置管理、API 网关、断路器、智能路由、负载均衡、消息总线、服务间通信 _等功能。Spring Cloud 是一个非常强大的工具集可以帮助开发者快速构建健壮的微服务架构

Spring Cloud官网

:::success
Spring Cloud主要组件包括:

  • Eureka:服务发现与注册。
  • Zuul 或 Spring Cloud Gateway:API 网关。
  • Hystrix:断路器。
  • Ribbon,Spring Cloud LoadBalancer:客户端负载均衡。
  • Feign、OpenFeign:声明式服务调用。
  • Config Server:外部配置中心。

:::

(2)SpringCloud和SpringBoot的版本对应关系

须知:SpringCloud依赖SpringBoot:

SpringCloud和SpringBoot的版本对应关系

当前SpringBoot版本为3.3.x版本,目前在企业中大部分还在使用 2.7.x及以下版本,所以我们重点使用:Spring Cloud 2021.0.x以及Spring Boot 2.7.x版本

(3)重点理解 Spring Cloud Alibaba 框架的核心组件:

Spring Cloud Alibaba 是阿里巴巴基于 Spring Cloud 开发的一套微服务开发工具包在当前非常流行,它针对 Spring Cloud 的一些组件进行了扩展和替换,以便更好地适应中国开发者的需求和阿里巴巴集团内部的技术栈。

:::color2
Spring Cloud Alibaba主要组件包括:

  • Nacos:服务发现和配置中心。
  • Sentinel:流量控制组件。
  • Dubbo:RPC 框架的 Spring Cloud 支持。
  • RocketMQ:消息中间件的支持。

:::

3.1 Spring Cloud Alibaba主要组件包括:

这里重点了解:Nacos、Sentinel

:::info

  • Nacos:服务发现和配置中心。
  • Sentinel:流量控制组件。
  • Dubbo:RPC 框架的 Spring Cloud 支持。
  • RocketMQ:消息中间件的支持。

:::

3.2 Spring Cloud Alibaba与Spring Cloud 的联系:

:::color1

  • 基于 Spring Boot:两者都是基于 Spring Boot 的微服务框架。
  • Spring Cloud 核心理念:Spring Cloud Alibaba 遵循 Spring Cloud 的设计理念和模式。
  • 组件兼容:Spring Cloud Alibaba 的组件可以与 Spring Cloud 的其他组件配合使用。

:::

3.3 Spring Cloud Alibaba与Spring Cloud 的区别:

:::color2

  • 服务发现:Spring Cloud 使用的是 Netflix Eureka,而 Spring Cloud Alibaba 使用的是 Nacos。
  • 断路器:Spring Cloud 原生支持 Hystrix,而 Spring Cloud Alibaba 推荐使用 Sentinel。
  • 配置管理:Spring Cloud 使用 Spring Cloud Config Server,而 Spring Cloud Alibaba 使用 Nacos 作为配置中心。
  • 负载均衡:Spring Cloud LoadBalancer结合 Nacos实现负载均衡。
  • 远程调用支持:Spring Cloud Alibaba 支持 Dubbo 作为 RPC 调用框架,而 Spring Cloud 默认不包含 RPC 支持。

:::

三、远端调用技术(Remote Procedure Call, RPC)

在Java中,远程调用技术允许一个Java虚拟机(JVM)上的对象调用另一个JVM上对象的方法,就像它们在同一进程中一样。这种技术对于分布式系统中的组件间通信至关重要。

以下是几种常见的Java远程调用技术:

  1. RMI (Remote Method Invocation)
  • RMI 是 Java 提供的一种标准远程过程调用机制。
  • 客户端可以像调用本地对象一样调用远程对象的方法。
  • RMI 使用 Java 序列化机制来传输对象。
  1. REST (Representational State Transfer)
  • RESTful 服务使用 HTTP 协议来访问资源。
  • 它通常使用 JSON 或 XML 格式来传输数据。
  • REST 是一种轻量级的架构风格,广泛应用于现代 Web 服务。
  1. Apache Dubbo
  • Dubbo 是一个高性能、轻量级的微服务框架。
  • Dubbo 支持多种协议远程调用,如 Dubbo 协议、HTTP 协议等。

不管哪种技术它们的底层还是通过TCP、UDP网络协议进行通信。

Spring Boot中远程调用的技术:

  • Spring提供的(RestTemplate)
  • Spring Cloud提供的(DiscoveryClient工具),可以通过装配好的依赖注入使用
  • OpenFeign

其中这三种,我们只使用 OpenFeign ,前两者做演示学习。

(1)RestTemplate

RestTemplate不依赖SpringCloud框架,Feign依赖SpringCloud框架。

:::info

  • RestTemplate 是Spring提供的一个模板类,用于简化HTTP请求的发送。
  • 通过RestTemplate,你可以轻松地发起GET、POST等请求,并处理响应。
  • RestTemplate支持多种数据格式,如JSON和XML。
  • RestTemplate常用于简单的HTTP调用,但在Spring Cloud中也有广泛应用。

:::

第一步:编写配置类、并将RestTemplate注册为一个Bean

/**
 * RestTemplate配置类
 */
@Configuration
public class RemoteCallConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

第二步:在业务代码中,注入RestTemplate:

//lombok提供的一个注解,用于自动生成构造函数。
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
    //这种是构造器注入的方式,本需添加@Autowired
    //但是这里添加了@RequiredArgsConstructor注解,已自动生成了构造器
    //注意:必须添加 final 字段
    private final RestTemplate restTemplate;
}

第三步:实现远端调用

List<ItemDTO> items = new ArrayList<>();
String url = "http://localhost:8081/items?ids={ids}";
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
    url,//url
    HttpMethod.GET,//请求方式
    null,//请求头&请求体
    //ParameterizedTypeReference基于反射原理来达到映射数据类型
    new ParameterizedTypeReference<List<ItemDTO>>() {},//服务器接收的数据类型
    CollUtils.join(itemIds, ",")//动态替换URL中的占位符,路径变量
);
if (response.getStatusCode().is2xxSuccessful()) {
    items = response.getBody();
}

exchange方法参数:

我们使用的是Http方式,这种方式不关心服务提供者的具体技术实现,只要对外暴露Http接口即可,更符合微服务的需要。

Java使用Spring提供的RestTemplate向服务端接口发送http请求,基本步骤如下:

:::color2

  • 注册RestTemplate到Spring容器
  • 调用RestTemplate的API发送请求,常见方法有:
    • getForObject:发送Get请求并返回指定类型对象
    • PostForObject:发送Post请求并返回指定类型对象
    • put:发送PUT请求
    • delete:发送Delete请求
    • exchange:发送任意类型请求,返回ResponseEntity
  • 解析响应结果

:::

(2)DiscoveryClient工具

常见的负载均衡算法有:

1、随机

2、轮询

  1. 方法1:随机负载均衡

使用DiscoveryClient工具实现服务发现,SpringCloud已经帮我们自动装配,我们可以直接注入使用:

@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {

    //这是Spring Cloud提供的远程调用方法,
    private final DiscoveryClient discoveryClient;
    ....

    //方法1:使用discoveryClient实现服务发现,内部就集成了负载均衡
    List<ItemDTO> items = new ArrayList<>();
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
        //随机负载均衡
        ServiceInstance instance = instances.get(new Random().nextInt(instances.size()));
        String url = instance.getUri().toString() + "/items?ids={ids}";
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                url,
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },
                CollUtils.join(itemIds, ",")
        );
        if (response.getStatusCode().is2xxSuccessful()) {
            items = response.getBody();
        }
        ....
}
  1. 方法2:轮询负载均衡

上边的例子是我们手动通过discoveryClient去注册中心查询服务列表,然后再手动随机取出一个服务地址进行远程调用,Spring Cloud Loadbalancer 提供了现成的客户端负载均衡器可以非常方便的实现客户端负载均衡。

@Configuration
public class RemoteCallConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {

    //这是Spring Cloud提供的远程调用方法,
    private final DiscoveryClient discoveryClient;
    ....

    //方法2:使用注解实现服务发现,内部就集成了负载均衡
    List<ItemDTO> items = new ArrayList<>();
    //上面添加的@LoadBalanced,已经实现负载均衡,不需要手动随机取出服务地址
    String url = "http://item-service/items?ids={ids}";
    ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
            url,
            HttpMethod.GET,
            null,
            new ParameterizedTypeReference<List<ItemDTO>>() {
            },
            CollUtils.join(itemIds, ",")
    );
    if (response.getStatusCode().is2xxSuccessful()) {
        items = response.getBody();
    }
    ...
}

(3)OpenFeign

我们利用_Nacos实现了服务的治理,利用RestTemplate_实现了服务的远程调用,虽然ip和端口换成了服务名,但是远程调用的代码还有些复杂

这种远端调用方式太浓郁,太过于复杂

有没有一种类似调用本地service方法的方式去实现远程调用呢?

接下来我们讲解的OpenFeign技术就可以让远程调用像本地方法调用一样简单

:::success
OpenFeign是什么:

**Spring Cloud **早期版本使用的 Feign 组件实现远程调用,Feign中集成了 Ribbon,随着Netflix公司不再维护Feign,Spring Cloud在Feign基础上新建了一个开源项目OpenFeign,OpenFeign 是一个声明式的 HTTP 客户端框架,它简化了编写 REST 客户端的过程

:::

使用 OpenFeign 的步骤

  1. 添加依赖:

在你的项目中添加 OpenFeign 的依赖。如果你使用 Maven,可以添加以下依赖:

搭配Nacos注册和订阅使用:

  • 服务消费者:
<!--openFeign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 服务提供者:
<!--nacos 服务注册发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 创建 Feign 客户端接口:
    1. 定义一个接口来描述你的远程服务。
    2. 使用 <font style="background-color:#FBDE28;">@FeignClient</font> 注解来标识远程调用接口,并指定服务名、接口路径。用的都是SpringMVC的注解,开发简单。
    3. 创建单独的api模块,创建需要用的远端调用接口文件
//指向服务提供者的名字“item-service” 和 路径“/items”(接口路径)
@FeignClient(name = "item-service",path="/items")
public interface ItemClient {
    @GetMapping
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
  1. 注入FeignClient

接下来在“服务消费者方”服务注入 Feign 客户端,通过Feign客户端进行远程调用。

@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {

    //这是OpenFeign实现远程调用方法;
    // OpenFeign作为Spring Cloud的一部分,
    //只需创建一个接口并用注解来配置它,就可以实现对远程服务的调用,
    //它整合了 Ribbon 和 Eureka 来支持负载均衡
    private final ItemClient itemClient;

    ...
    //使用Feign加EnableFeiginConfigs注解实现
    itemClient.queryItemByIds(itemIds);//上面声明的远端接口
    ...
}

在启动类中标注 @EnableFeignClients 以此来声明开启了Feign

@SpringBootApplication
@MapperScan("com.hmall.cart.mapper")
//开启Feign
@EnableFeignClients
public class CartServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(CartServiceApplication.class,args);
    }
}

使用OpenFeign是非常简单的,只需要定义一个接口,用FeignClient标识目标服务的名称,在接口中定义要调用的接口,使用Spring MVC注解进行标识。在其它bean中注入此接口即可使用。

:::color2
其实远程调用的关键点就在于四个:

  • 请求方式
  • 请求路径
  • 请求参数
  • 返回值类型

所以,OpenFeign就利用SpringMVC的相关注解来声明上述4个参数,然后基于动态代理帮我们生成远程调用的代码,而无需我们手动再编写,非常方便。

:::

四、Spring Cloud Loadbalancer(负载均衡器)

源码解析:

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。 显然有人帮我们根据service名称,获取到了服务实例的ip和端口。这就是 @LoadBalanced注解起到的作用。

@LoadBalanced注解是如何实现负载均衡呢?

首先在创建RestTemplate的bean时添加@LoadBalanced注解,LoadBalancerAutoConfiguration自动配置筛选出添加@LoadBalanced注解的RestTemplate,为RestTemplate设置LoadBalancerInterceptor。

LoadBalancerInterceptor会在对RestTemplate的请求进行拦截,然后从nacos中根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

下边通过跟踪源代码解释整个执行过程。

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

request.getURI() :获取请求uri,本例中就是 http://item-service/items?ids=100000006163

originalUri.getHost() :获取uri路径的主机名,其实就是服务id, item-service

this.loadBalancer.execute() :处理服务id,和用户请求。

这里的 this.loadBalancer 是 LoadBalancerClient 类型,LoadBalancerClient 会根据负载均衡算法选择一个实例并发起请求,我们继续跟入。

调用choose方法根据负载均衡算法选择一个服务实例,继续跟入

默认使用的负载均衡策略是轮询,通过RoundRobinLoadBalancer实现

最终选择一个服务实例

放行继续执行。

继续测试该接口,因为是轮询策略,下次会选择另一个服务实例

在Spring Cloud 2020版本以前客户端负载均衡使用的是Netflix公司的Ribbon组件,由于Netflix公司对一些组件不再更新,Spring Cloud之后的版本就移除了Ribbon,使用Spring Cloud LoadBalance实现客户端负载均衡。

五、负载均衡

(1)服务端负载均衡

Nginx负载均衡:

Nginx可以支持多种负载均衡算法,包括_轮询、最少连接、IP 哈希_:

  1. 轮询 (默认)
    1. 按照顺序将请求分发给不同的服务器。
  2. 最少连接
    1. 将请求发送到当前活跃连接数最少的服务器。
  3. IP 哈希
    1. 根据客户端 IP 地址进行哈希计算,使得来自同一客户端的请求始终被路由到同一台服务器。

通过nginx实现负载均衡的结构图如下:

在nginx的配置方法也非常简单,只要配置上游服务器和具体的代理位置即可,大家可作为参考

http {
    upstream item_services {
        server 127.0.0.1:8081 weight=3;  # 分配较高权重
        server 127.0.0.1:7081 weight=2;  # 分配中等权重
        server 127.0.0.1:6081 weight=1;  # 分配较低权重
    }

    server {
        listen       80;  # 监听 80 端口,也可以根据需要更改
        server_name  localhost;  # 更改为你的域名或 IP 地址

        location /items {  # 这里可以根据需要调整路径前缀
            proxy_pass http://item_services;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 其他可选配置
            proxy_redirect off;
            proxy_buffering off;
            proxy_read_timeout 90;
        }
    }
}

说明:

:::info

  1. upstream 块定义了一个名为 item_services 的服务器组,包含三个服务器实例。你可以通过修改 server 行中的地址和端口来指向实际的服务实例。
  2. server 块定义了 Nginx 的监听端口和服务名称。
  3. location 块指定了路径 /items/ 下的所有请求将被代理到 item_services 上游组。
  4. proxy_pass 指令指定了代理目标。
  5. proxy_set_header 指令设置了转发给后端服务的 HTTP 头。

:::

(2)客户端负载均衡

注册中心概念:

首先引入注册中心的概念。

在微服务远程调用的过程中,包括两个角色:

  • 服务提供者:提供接口供其它微服务访问,比如:房东(提供房源)
  • 服务消费者:调用其它微服务提供的接口,比如:租户(有住宿需求)

在大型微服务项目中,服务提供者的数量会非常多,为了管理服务提供者就引入了注册中心的概念。注册中心、服务提供者、服务消费者三方间关系如下:

三方的分工分析:

1 注册中心:提供服务注册接口,接收服务注册请求,保存服务实例的信息。

目前开源的注册中心中间件有很多,国内比较常见的有:

  • Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用
  • Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用,我们项目使用Nacos。
  • Consul:HashiCorp公司出品,目前集成在SPringCloud中,不限制微服务语言

2 服务提供者:服务接口提供方,请求注册中心将服务信息注册到注册中心。

3 服务调用者:远程调用的客户端,请求注册中心查询服务地址,通过负载均衡选取目标服务地址进行远程调用。

服务注册与发现流程如下:

:::color1

  • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心
  • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)
  • 调用者作为客户端自己通过负载均衡算法挑选一个服务提供者实例进行远程调用,即客户端负载均衡
  • 调用者向该实例发起远程调用

:::

当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?

:::color4

  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)
  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除
  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表
  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

:::

Nacos注册中心

Nacos 官网

Nacos安装配置:

测试阶段可以自己在虚拟机上安装docker并安装配置nacos

Nacos的表结构如下:

访问nacos

启动完成后,访问下面地址:http:// 你的ip :8848/nacos/

进入首页:

注意:2.4版本开始nacos默认不进行认证直接进入首页,以前的版本首次访问会跳转到登录页,账号密码都是nacos

服务注册(服务提供者注册)

添加依赖:

  1. 在父工程需要添加Spring Cloud及Spring Cloud Alibaba的版本约束,如果已添加不用重复添加
<!--spring cloud-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dependencies</artifactId>
  <version>${spring-cloud.version}</version>
  <!--   type=pom ,scope=import 表示继承 和 parent 作用一样             -->
  <type>pom</type>
  <scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  <version>${spring-cloud-alibaba.version}</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
  1. 因为我们安装的是2.4.0版本的nacos,Spring Boot默认使用的Nacos比该版本低,所以需要在父pom.xml中约定nacos-client版本,如下:
<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
  <version>2.4.0</version>
</dependency>
  1. 服务提供者方pom.xml中添加依赖:(discovery发现依赖)
<!--nacos 服务注册发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 服务提供者方application.yml中添加nacos地址配置:

严格按照这个排版格式来写

spring:
  application:
    name: item-service # 服务名称
cloud:
  nacos:
    server-addr: 你的ip:8848 # nacos地址

最后启动服务实列,查看日志Nacos是否注册成功。

服务发现/订阅服务(服务消费者订阅):

引入依赖:

  1. 服务消费者方中的pom.xml中添加下面的依赖:
<!--nacos 服务注册发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

可以发现,这里Nacos的依赖于服务注册时一致,这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者。

因此,等一会儿服务消费者启动,同样会注册到Nacos。

配置Nacos地址:

  1. 服务消费者方application.yml中添加nacos地址配置:

严格按照这个排版格式来写

spring:
  cloud:
    nacos:
      server-addr: 192.168.101.68:8848
服务发现并调用服务

接下来,服务调用者服务消费者就可以去订阅服务提供者服务了,它的底层使用了Spring Cloud Loadbalancer组件实现客户端负载均衡。

常见的负载均衡算法有:

1、随机

2、轮询

3、IP的hash

4、最近最少访问

调用服务请参考标题三:

三、远端调用技术(Remote Procedure Call, RPC) 介绍的 DiscoveryClient、OpenFeign

六、OkHttp

介绍

Feign底层发起http请求,依赖于第三方的http客户端框架。

常用的http客户端有

  1. HttpURLConnection:默认实现,不支持连接池

:::info
HttpURLConnection 是 Java 标准库中用于发送 HTTP 请求和接收 HTTP 响应的一个类。它位于 java.net 包中,提供了一组丰富的 API 来处理 HTTP 连接。HttpURLConnection 可以用于发送 GET、POST、PUT、DELETE 等各种 HTTP 方法的请求,并允许设置请求头、请求体等。

:::

  1. Apache HttpClient :支持连接池

:::info
Apache HttpClient 是一个用于发送 HTTP 请求和接收 HTTP 响应的强大客户端库,它是 Apache HttpComponents 项目的一部分。这个库为 Java 开发者提供了高级别的 API 来处理 HTTP 和 HTTPS 协议,同时也提供了低级别的组件来构建和定制 HTTP 客户端。

:::

  1. OKHttp:支持连接池

:::info
OkHttp 是一个高效的 HTTP 客户端库,由 Square Inc. 开发和维护。它最初是为了提高 Android 应用程序中的网络请求效率而设计的,但现在也被广泛用于 Java 应用程序中。OkHttp 提供了许多高级功能,以简化 HTTP 请求的处理并提高性能。

:::

因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OKHttp,使用连接池可以提升 HTTP 请求的效率。

更换为okhttp

服务消费者方pom.xml中引入依赖:

<!--OK http 的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>

服务消费者方application.yml配置文件中开启Feign的连接池功能:

feign:
  okhttp:
    enabled: true # 开启OKHttp功能

重启服务,okhttp就生效了。

注解:

  1. @EnableFeignClients

@EnableFeignClients 注解用于启用 Spring Cloud Feign 客户端支持。当你需要在你的应用程序中使用 Feign 客户端来调用其他服务时,就需要使用这个注解。以下是详细说明和使用场景:

:::color2
何时使用 @EnableFeignClients:

调用外部服务:

当你需要调用其他微服务或外部 REST API 时,可以使用 Feign 客户端来简化 HTTP 请求的编写和管理。

声明 Feign 客户端:

你需要在你的项目中定义一个或多个 Feign 客户端接口,并使用 @FeignClient 注解来声明这些接口。

自动扫描 Feign 客户端:

@EnableFeignClients 注解会告诉 Spring Cloud 自动扫描并注册所有使用 @FeignClient 注解的接口为 Spring 的 Bean。

:::

  1. @FeignClient

@FeignClient 注解是 Spring Cloud Feign 提供的一个注解,用于定义一个 Feign 客户端接口。Feign 客户端接口可以简化 HTTP 客户端的开发,使得调用远程服务就像调用本地方法一样简单。以下是关于 @FeignClient 注解的详细说明和使用方法。

:::color2
基本用法:

  • 定义 Feign 客户端接口: 使用 @FeignClient 注解来声明一个接口,该接口将作为 Feign 客户端。
  • 使用注解的方法: 在接口的方法上使用 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 等注解来定义 HTTP 请求。

:::

结论:

  1. RPC

微服务之间的远程调用被称为RPC,即远程过程调用。

:::color1
RPC的实现方式有很多,比如:

  • 基于Http协议
  • 基于Dubbo协议

:::

posted @ 2025-03-18 08:47  厂长是我表哥  阅读(110)  评论(0)    收藏  举报