SpringCloud 总结
什么是框架:
是关于软件整体结构与组件的抽象描述 用于指导大型软件系统各个方面的设计
框架的演变过程:
单体架构 : 所有的项目都放到一个架构里面 优点 部署快 简单 小项目首选 缺点 随着功能的加多项目启动慢 可扩展性差 可靠性差
垂直架构 : 将单体架构的多个模块分成多个独立项目形成多个单体架构 优点 模块与模块之间互补影响可以使用多种语言操作 缺点 代码冗余严重 重复功能太多
分布式架构 :把垂直架构的重复代码抽离出来 形成独立的服务模块 提供消费者的调用和共享 优点 可重用性高 缺点 调用关系错综复杂一旦服务者的代码发生改变 消费者的代码也会随之改变
SOA架构 :面向服务的架构 基于分布式架构基 增加一个注册中心 管理服务 优点 提高代码的重用性 可维护程度高 缺点 抽离服务粒度大
微服务架构 将系统服务层彻底独立出来 抽取成一个一个的服务 抽取的粒度更细 遵循单一原则 优点 服务拆分粒度更细 更有利于提高代码效率 缺点 由于抽离的粒度太细 部署难度更大 维护成本高
微服务的特征 :
项目单一 :微服务的细粒程度更小 每个业务都有自己对应的模块 职责更加单一
自治 数据独立 团队独立 技术独立
面向服务 服务提供统一的的访问接口
隔离性强 做好服务的隔离 降级 容错 避免了级联失败问题
springcloud 是微服务框架 是对框架架构的有序集合 集成了各种微服务框架的组件 我们把每个微服务的技术成为一个组件
springcloud和springboot的区别 首先她两就不是一种东西 springcloud首先继承springboot是集成的微服务组件 springboot是对一个工程架构的整合
Erueka :服务的注册与发现 由两部分组成 服务端和客户端 项目启动以后 服务端收集提供者的访问接口 以及收集心跳续约 (默认30秒) 然后消费者从服务端拉去服务 然后对接口进行负载均衡 选取一个接口 这样就可以调取提供者的信息
实现办法:创建模块 导入坐标 写好注解 写好配置类
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
客户端实现
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
ribbon作用 作为springcloud的一个组件 他起到负载均衡的作用 默认情况下是轮询策略 如果要对他进行修改的话 他是在消费者端 在启动类(配置类) 中 实现irule接口 然后返回自己要配置的方法 如果要对某个服务进行修改的话需要在其对应的配置文件中进行修改
工作原理 当客户端发送请求ribbon负载均衡拦截请求去服务端注册中心找到对应的服务列表跟进负载测略规则选择其中一个返回
ribbon默认使用的是懒加载方式 懒加载在启动时候比较快 访问时候比较慢 饿汉式加载 在启动时候慢加载时候快 如果要更换模式可以在配置类中修改
Nacos 作用是注册中心 默认端口为8848 启动命令是 startup.cmd -m standalone 开发步骤 首先在父工程代入坐标 先配置类 子工程中导入坐标写配置类
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
spring:
cloud:
gateway:
# 。。。
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期