服务注册、服务发现、OpenFeign及其OKHttp连接池实现

目录

一、服务注册

二、服务发现

OpenFeign:

OKHTTP:


一、服务注册

接前篇文章,我们在将Nacos当中注册服务;这里以item-service为例将其注册到Nacos

1.引入依赖:

在item-service的pom.xml中添加依赖:

XML 复制代码
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.在yml文件中配置nacos地址:

item-service下的``application.yml:

javascript 复制代码
spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848 # nacos地址

这样启动之后就会自动注册;

为了测试一个服务多个实例的情况,我们再配置一个item-service的部署实例:

然后配置启动项,注意重命名并且配置新的端口,避免冲突:

重启item-service的两个实例:

访问nacos控制台,可以发现服务注册成功:

点击详情,可以查看到item-service服务的两个实例信息:

二、服务发现

服务发现的前两步和服务注册一致,多了个第三步的发现并调用服务

XML 复制代码
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
javascript 复制代码
spring:
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848

接下来,服务调用者cart-service就可以去订阅item-service服务了。不过item-service有多个实例,而真正发起调用时只需要知道一个实例的地址。

因此,服务调用者必须利用负载均衡的算法,从多个实例中挑选一个去访问。常见的负载均衡算法有:

  • 随机

  • 轮询

  • IP的hash

  • 最近最少访问

  • ...

这里我们可以选择最简单的随机负载均衡。

另外,服务发现需要用到一个工具,DiscoveryClient,SpringCloud已经帮我们自动装配,我们可以直接注入使用:

接下来,我们就可以对原来的远程调用做修改了,之前调用时我们需要写死服务提供者的IP和端口:

但现在不需要了,我们通过DiscoveryClient发现服务实例列表,然后通过负载均衡算法,选择一个实例去调用:

这里更正一下上一篇文章的说法,之前提到服务注册能够替代服务调用,实际上并不是,而是相辅相成,两者共同达成我们的目的

OpenFeign:

由于这段代码比较繁杂,且要自己实现,倘若以后其他地方也需要这样调用代码就很冗余,所以我们引入OpenFeign来优化这段代码

首先我们需要引入依赖:

XML 复制代码
  <!--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>

接下来,我们在cart-service的CartApplication启动类上添加注解,启动OpenFeign功能:

在cart-service中,定义一个新的接口,编写Feign客户端:

java 复制代码
package com.hmall.cart.client;

import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient("item-service")
public interface ItemClient {

    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

这里只需要声明接口,无需实现方法。接口中的几个关键信息:

  • @FeignClient("item-service") :声明服务名称

  • @GetMapping :声明请求方式

  • @GetMapping("/items") :声明请求路径

  • @RequestParam("ids") Collection<Long> ids :声明请求参数

  • List<ItemDTO> :返回值类型

有了上述信息,OpenFeign就可以利用动态代理帮我们实现这个方法,并且向http://item-service/items发送一个GET请求,携带ids为请求参数,并自动将返回值处理为List<ItemDTO>。

我们只需要直接调用这个方法,即可实现远程调用了。

最后,我们在cart-service的com.hmall.cart.service.impl.CartServiceImpl中改造代码,直接调用ItemClient的方法:

OKHTTP:

通过研读OpenFeign的底层代码发现,其发送请求时用的是HttpURLConnection(jdk自带),其每一次调用都要手动建立连接,然后用InputStream流的方式进行读写,效率低下,于是我们引入带有连接池的客户端OKHttp

在cart-service的pom.xml中引入依赖:

XML 复制代码
<!--OK http 的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>

在cart-service的application.yml配置文件中开启Feign的连接池功能:

TypeScript 复制代码
feign:
  okhttp:
    enabled: true # 开启OKHttp功能

这样我们就实现了连接池,重启之后即可生效

相关推荐
码智社16 分钟前
Redis 哨兵模式详解:从原理到生产实践
java·redis
星恒随风22 分钟前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
晚风叙码22 分钟前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
救救孩子把24 分钟前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务
无足鸟ICT38 分钟前
【RHCA+】影响Linux系统性能的因素
linux·运维·服务器
silvamux_41 分钟前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
论文复现现场42 分钟前
DeepSeek V4.1 Flash 和 V4 Pro 有什么区别?API 价格、性能与迁移建议
java·服务器·人工智能·python·大模型api·deepseek·deepseek v4.1
沫璃染墨1 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
迪康coolmu1 小时前
金融客户数据合规落地:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·数据库·经验分享·安全·网络安全·金融
郭小李1 小时前
转发与重定向
java·服务器·数据库