微服务架构

单体架构

所有功能集成在一起,打成一个jar包部署

  • 架构简单
  • 部署成本低
  • 协作能力差、
  • 发布效率低
  • 系统可用性差

面对高并发时容易卡顿

Screenshot 2025-10-15 212939.png

300个进程连续访问,tomcat资源耗尽,访问非常卡。

微服务架构

把单体架构中的功能拆分为多个独立的项目

  • 粒度小
  • 团队自制
  • 服务自制 (分别打包,分别部署) 数据隔离

单体架构的拆分

什么时候需要拆分

单体架构快速开发,规模扩大后拆分

确定的项目,资金充足,可直接选择微服务架构

怎么拆

  • 高内聚 : 职责尽量单一
  • 低耦合 : 服务独立,减少对其他微服务的依赖
  • 横向拆分 按照业务模块拆分
  • 横向拆分 抽取公共服务提高复用性

结构

  • 独立project 适合超大型项目
  • Maven聚合

两个项目的联系

通过网络请求联系 访问两个数据库,通过请求获取数据

如何用java发送网络请求

RestTemplate 工具 (存在一些问题)

注册中心

  • 注册服务信息
  • 订阅服务
  • 负载均衡
  • 发送请求,远程调用
  • 所有服务定期向服务中心发送请求,没收到请求就会剔除这个服务
  • 推送变更

Nacos(注册中心组件 ) 阿里巴巴 Nacos官网

部署

可参考我的另一篇文章

https://laning.com.cn/archives/nacosbu-shu

服务注册

  1. 引入依赖

Screenshot 2025-10-22 204339.png

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  <!-- 版本号在父工程中定义-->
</dependency>
  1. 配置yaml文件

Screenshot 2025-10-22 204829.png

  • 配置自己的服务器/虚拟机ip
  • 之后重新启动会自动进行服务注册

Screenshot 2025-10-22 205256.png

多服务启动。

Screenshot 2025-10-22 205418.png

服务发现

  1. 与服务注册相同 前两部需要引入依赖和 配置yaml文件
  2. 加入bean方法
    
    @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
  3. 注入要调用的类中

Screenshot 2025-10-22 215320.png

  1. 获取服务示例,写负载均衡

Screenshot 2025-10-22 215144.png

OpenFeign

声明式的http客户端 ,帮助java发送http请求

入门

  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>
  1. 启动类加入注解 (@EnableFeignClients)
  2. 编写FeignClient

Screenshot 2025-10-22 221320.png

  1. 在service中注入itemClient
  2. 调用方法

Screenshot 2025-10-22 221205.png

连接池

底层实现原理是用 Client 接口实现 效率低

  1. 引入依赖

Screenshot 2025-10-27 220226.png

  1. 配置开关
feign:
  okhttp:
    enabled: true # 开启OKHttp功能

OKHttp 中有连接池效率高

最佳方案

Screenshot 2025-10-27 220853.png

  1. 使用新的模块 (耦合度高)

Screenshot 2025-10-27 220934.png

创建新模块(引入依赖, 加入dto , client)

Screenshot 2025-10-27 222053.png

在cart-service中删除dto和client ,导入hm-api的依赖

<!--hm-api-->
<dependency>
    <groupId>com.heima</groupId>
    <artifactId>hm-api</artifactId>
    <version>1.0.0</version>
</dependency>

在启动类中加入,需要扫描的api包(不然扫描不到 client)

@EnableFeignClients(basePackages = "com.hmall.api.client")

日志

只有级别为debug时才会输出 , 且日志有四个级别

  1. NONE 不记录任何日志 (默认)
  2. BASIC 仅记录请求的方法,URL ,响应码和时间
  3. HEADERS 在BASIC基础上额外记录了请求和响应头的信息
  4. FULL 记录所有请求和响应的明细, 包括头信息、请求体、元数据

全局配置

package com.hmall.api.config;
​
import feign.Logger;
import org.springframework.context.annotation.Bean;
​
public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
}

迷茫java练习生