SpringCloud
为什么使用微服务
- 大型项目,功能复杂
- 用户请求达到一定数量级
单体架构
将业务的所有功能集中在一个项目中开发,打成一个jar包部署运行
优点
- 架构简单
- 部署成本低(打成jar包直接运行)
缺点
- 团队协作成本高(几百号人用一套代码,很容易产生冲突)
- 系统发布效率低(代码量越多,打包时间越长)
- 系统可用性差(共用一个Tomcat, 一个接口的高并发会影响其他接口的访问速度)
微服务架构



服务拆分原则
- 中小厂建议从单体项目做大到微服务
- 按业务功能拆分、提取公共服务以便提高复用率
服务治理
注册中心
原理:服务调用者和服务提供者之间的桥梁

服务多级存储模型
注:优先访问同一集群下的实例,实例权重越大被访问到的概率就越大(权重数值一般是0-1)
实例分为临时实例和非临时实例
- 临时实例通过主动上报心跳来告知服务器其当前状态,若心跳停止,则服务器会删除该临时实例;
- 非临时实例则是服务器主动询问其当前状态,即使发现异常也不会删除该非临时实例;

安装Nacos
version: '3'
services:
nacos:
image: nacos/nacos-server:v2.0.4
container_name: nacos
ports:
- 8848:8848
- 9848:9848
- 9849:9849
environment:
TZ: Asia/Shanghai
MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 数据库ip
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_USER: 用户名
MYSQL_SERVICE_PASSWORD: 密码
MYSQL_SERVICE_DB_NAME: nacos
MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
volumes:
- /data/nacos/logs/:/home/nacos/logs
注:
- 注意数据库配置
- Nacos控制台的默认访问地址通常是 http://localhost:8848/nacos 默认登录账号密码为 nacos/nacos
服务注册

服务发现
实战中,一般通过Feign实现
配置中心
配置共享

<!-- bootstrap 启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config 服务配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

热更新
文件名约定:${spring.application.name}-${spring.profiles.active}.${file-extension}
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "pattern") //只要前缀名和变量名两者拼接与配置配置文件一致,就能完成属性的自动注入
public class PatternProperties {
private String dateformat;
}
Feign
本质:是一个声明式的http客户端,可以实现http请求的发送
注:Feign 本身并不支持 SpringMVC 的注解,而OpenFeign支持

OpenFeign


开启连接池
注:默认底层是每次需要重新建立连接(HttpURLConnection),效率较低,所以推荐使用连接池

SpringCloud Gateway
注:底层基于WebFlux,与web依赖会有冲突
解决gateway与spring-boot-starter-web冲突问题



路由规则配置示例
server:
port: 8080
spring:
application:
name: gateway-service
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 118.25.83.109
gateway:
routes:
- id: item # 路由规则id,自定义,只需保证唯一即可,实践推荐和微服务名保持一致
uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
- Path=/items/**,/search/** # 这里是以请求路径作为判断规则
- id: cart
uri: lb://cart-service
predicates:
- Path=/carts/**
路由断言工厂

路由过滤器


自定义过滤器
全局过滤器 GlobalFilter
作用:对所有路由都生效的过滤器

GatewayFilter
过滤器执行顺序



跨域问题

系统部署
打包方式
方式一(整体打包)

方式二(单个模块打包)
# -pl(--projects): 指定要构建的项目列表
# -am(--also-make): 同时构建这些项目所依赖的模块
mvn clean package -pl ruoyi-gateway -am
容器运行
Dockerfile
#java 版本
FROM openjdk:8
#挂载的docker卷
VOLUME /tmp
# 拷贝 jar 包到容器内
COPY ruoyi-auth.jar ruoyi-auth.jar
# 定义时区参数
ENV TZ=Asia/Shanghai
# 设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
# 配置启动命令
ENTRYPOINT ["java", "-jar", "/ruoyi-auth.jar"]
docker-compose.yml
version: '3'
services:
ruoyi-gateway:
image: ruoyi-gateway:04.24.1
container_name: ruoyi-gateway
restart: always
build:
context: ./ruoyi-gateway
dockerfile: Dockerfile
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
ruoyi-auth:
image: ruoyi-auth:04.22.1
container_name: ruoyi-auth
restart: always
build:
context: ./ruoyi-auth
dockerfile: Dockerfile
ports:
- 9200:9200
environment:
TZ: Asia/Shanghai
ruoyi-system:
image: ruoyi-system:04.22.1
container_name: ruoyi-system
restart: always
build:
context: ./ruoyi-system
dockerfile: Dockerfile
ports:
- 9201:9201
environment:
TZ: Asia/Shanghai
# 单独启动某一个容器
docker-compose up -d <容器名称>
# 启动所有容器
docker-compose up -d
# 单独停止某一个容器
docker-compose stop <容器名称>
# 停止所有容器
docker-compose down
RuoYI-Cloud
数据库配置


参考文章
【1】课堂笔记 密码:j.N?-+4[
【3】使用RouterFunction为应用程序添加一个新的路由

浙公网安备 33010602011771号