当前位置: 首页 > article >正文

五天SpringCloud计划——DAY3之服务治理(Nacos+OpenFeign+OKHttp)

一、引言

在微服务架构中,一个项目通常会被分为多个模块来降低耦合,但是通常情况下,一个项目中总会出现一种情况——一个模块内的方法需要调用另一个模块内的方法。本文就来使用Nacos+OpenFeign+OKHttp帮助大家解决这个问题。

二、Nacos的使用

1.Nacos是什么,有什么用?

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

  • 服务提供者:提供接口供其它微服务访问,比如item-service

  • 服务消费者:调用其它微服务提供的接口,比如cart-service

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

Nacos便是一种注册中心 ,提供者提供的服务放在注册中心,需要用的时候去注册中心找

2.Nacos的部署

1)部署Nacos

我们基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。

由于是Docker部署,所以大家需要将SQL文件导入到你Docker中的MySQL容器

然后将你的Nacos配置文件放在虚拟机的root/目录下

之后使用Docker部署你的Nacos,代码如下

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

启动完成后,访问下面地址:http://192.168.150.101:8848/nacos/,注意将192.168.150.101替换为你自己的虚拟机IP地址。

2)后端服务交给Nacos

Nacos部署之后你需要在你需要调用的模块中加入相关的依赖和配置,把它交给Nacos管理

依赖如下

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

引入这给依赖表示该模块服务可以被调用也可以调用别的模块

然后在配置文件中配置nacos的地址——

spring:
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848

同样,注意将192.168.150.101替换为你自己的虚拟机IP地址。

3.小结

到这里我们就把我们的模块提供的服务交给了Nacos管理,之后我们就可以通过模块名去调用该模块的方法了,这样我们就不需要写死服务的地址了

代码如下

三、OpenFeign

我们可以发现,使用了Nacos之后还有一个问题,那就是我们的代码还是太长了,那我们用美元更简单的方法去实现这些代码呢?这就引出了我们的OpenFeign

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

1.依赖引入

  <!--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>

2.加入注解

,我们在cart-service(服务调用者)CartApplication启动类上添加注解,启动OpenFeign功能:

3.编写OpenFeign客户端

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

其中代码如下:

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>

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

4.使用FeignClient

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

feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作,是不是看起来优雅多了。

而且,这里我们不再需要RestTemplate了,还省去了RestTemplate的注册

四、连接池

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

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

  • Apache HttpClient :支持连接池

  • OKHttp:支持连接池

如果我们的项目的访问频次比较高,还是建议使用连接池,这里我们选择OKHttp

1.引入依赖

cart-servicepom.xml中引入依赖:

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

2.开启连接池

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

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

这样我们的连接池就启动成功了

五、最佳实践

其实我们这种写法还是有一些不足的,比如如果有多个模块都要调用同一个模块中的同一个方法,那么我们要在每个需要调用的模块中建一个client包,还有写同一段代码,将来需要修改代码时也是需要修改多个地方,所以我们要解决这个问题

下面是一种解决方案

我们可以把需要用到的模块方法全都放在一个模块里面

我们可以新建一个hm-api将需要用到的模块方法放在里面就可以了

五、结语 

时隔一个星期,也是将琐事处理完了,继续吧


http://www.kler.cn/a/430336.html

相关文章:

  • DAY15 神经网络的参数和变量
  • 【网络协议】静态路由详解
  • Nginx:Stream模块
  • 【网络安全 | 漏洞挖掘】通过监控调试模式实现价值$15k的RCE
  • 高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解
  • 【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
  • ubuntu16.04部署dify教程
  • 算法-字符串-165.比较版本号
  • 【UBOOT】【run_main_loop】uboot 启动 linux 内核
  • 使用javascript+canvas显示二叉树
  • DedeCMS最新注入漏洞(CNVD-2024-44514、CVE-2024-9076)
  • 怎么为开源项目做贡献提PR?
  • 企业经营数据分析系统:提升决策能力的利器
  • git中配置ssh的方法
  • 【计算机网络】实验15:VLAN间通信的实现方法“单臂路由”
  • 分布式事物各方案常见使用场景
  • PHP和GD库如何在图片上添加文字
  • 【IT】测试用例模版(含示例)
  • 踩坑日记-@Data注释的使用
  • 【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
  • 文生图模型开源之光!ComfyUI - AuraFlow本地部署教程
  • 如何拦截伪蜘蛛、假蜘蛛
  • 【漫话机器学习系列】002.拟合度:调整R方(Adjusted R-Squared)
  • 迅为RK3576开发板满足了4G/5G、wifi6、多网口、NPU等扩展需求
  • vue入门实战(二)父子组件显示,参数传递
  • minio参考官方文档实现多节点部署,基于ubuntu,还是失败了。。。。