微服务架构
单体架构
所有功能集成在一起,打成一个jar包部署
- 架构简单
- 部署成本低
- 协作能力差、
- 发布效率低
- 系统可用性差
面对高并发时容易卡顿

300个进程连续访问,tomcat资源耗尽,访问非常卡。
微服务架构
把单体架构中的功能拆分为多个独立的项目
- 粒度小
- 团队自制
- 服务自制 (分别打包,分别部署) 数据隔离
单体架构的拆分
什么时候需要拆分
单体架构快速开发,规模扩大后拆分
确定的项目,资金充足,可直接选择微服务架构
怎么拆
- 高内聚 : 职责尽量单一
- 低耦合 : 服务独立,减少对其他微服务的依赖
- 横向拆分 按照业务模块拆分
- 横向拆分 抽取公共服务提高复用性
结构
- 独立project 适合超大型项目
- Maven聚合
两个项目的联系
通过网络请求联系 访问两个数据库,通过请求获取数据
如何用java发送网络请求
RestTemplate 工具 (存在一些问题)
注册中心
- 注册服务信息
- 订阅服务
- 负载均衡
- 发送请求,远程调用
- 所有服务定期向服务中心发送请求,没收到请求就会剔除这个服务
- 推送变更
Nacos(注册中心组件 ) 阿里巴巴 Nacos官网
部署
可参考我的另一篇文章
https://laning.com.cn/archives/nacosbu-shu
服务注册
- 引入依赖

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

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

多服务启动。

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

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

OpenFeign
声明式的http客户端 ,帮助java发送http请求
入门
- 引入依赖
<!--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>
- 启动类加入注解 (@EnableFeignClients)
- 编写FeignClient

- 在service中注入itemClient
- 调用方法


连接池
底层实现原理是用 Client 接口实现 效率低
- 引入依赖

- 配置开关
feign:
okhttp:
enabled: true # 开启OKHttp功能
OKHttp 中有连接池效率高
最佳方案

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

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

在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时才会输出 , 且日志有四个级别
- NONE 不记录任何日志 (默认)
- BASIC 仅记录请求的方法,URL ,响应码和时间
- HEADERS 在BASIC基础上额外记录了请求和响应头的信息
- 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;
}
}