分布式架构的一种
把服务进行 拆分
springcloud 解决了 服务拆分过程中的 治理问题
与单体应用 进行区分
(单体架构 把业务所有功能集中开发,打成一个包部署)
每个模块独立开发和部署(服务集群)
服务之间互相调用
出现分布式技术
Webservice
ESB
Hession
Dubbo
微服务方案 技术框架落地
eg springcloud + 阿里dubbo
2012 dubbo 开源 (“半吊子”微服务)
2015-2017 springcloud(整合)
封装了Feign客户端 发http 请求 Restful接口
Spring Cloud Bus 自动通知 热更新
功能模块进行拆分
单一职责
即 不同微服务 不重复开发相同业务
数据独立
不要访问其他微服务数据库
业务接口
每个模块将自己的业务暴露为接口,供其他服务调用
且没法关联查询
将工程文件夹放到 IDE 的 工作空间
可以看到项目所有的微服务
项目结构
父工程(主要定义了依赖版本)
数据分离
业务逻辑
返回订单对象
符合 微服务 拆分 的单一职责
spring的 HTTP 请求工具
用Bean的方式 把RestTemplate 注册 为spring容器 的 对象
就可以在任何地方 以 注入的方式 来用
Bean的注入 只能放在 配置类里面
带有 main的 启动类 本身也是配置类
在这创建 RestTemplate对象
跟入 orderservice
先把 resttemplate注入进spring 容器里来
http请求 返回 json 但在这里需要一个user对象
resttemplate 会 给让你输入一个 返回对象
概念 是 业务中谁对谁而言
既可以是 提供 也可以是 消费者
ip 端口 是 硬编码在 代码中的
不方便 环境部署
集群 不好布置
starter -----spring boot里面的 自动装配
注解是 eureka server 自动装配的 开关
创建 maven模块
父工程pom 已经把 版本依赖做好了
所有组件版本信息 点进去看
加个 springboot注解
psvm
加上 eureka 自动装配的 开关注解(启动类 上 做注解)
新建 配置文件
eureka 集群 所以 自己也将自己的 微服务 注册
注册到eureka 的 实例
编辑eureka地址信息
yml文件 不许 出现两个 根名称
启动两个实例
-D 参数
yml 文件 内的 server.port
实例列表
查看 order services 是 负载均衡 走的 哪个
LoadBalancer 标记 拦截 实现 http 请求 接口
接口定义的 方法名字 intercept
同样实现了intercept 方法
下断点
取得主机名
去 做 服务拉取
Ribbon load balamcer对象
步入 这个 execute 方法
把这个 service id 交给 getloadBanlancer处理
得到 loadbalancer 对象
动态服务列表 负载均衡器
在这个对象里面
就拉取到了 服务列表
整个步骤 根据 服务名称 拉取 服务列表
getserver 开始负载均衡
进入 getserver 方法
选择 server 步入
找一个 super 父亲的 选择
要有一个 规则 从 动态 server 里 选
这个 IRule 是一个 接口I
规则接口 那就会有实现类
IDEA Ctrl H 查看实现类
比如
轮询负载均衡
随机
默认规则 ZoneAvoidance
返回来了 选择的 8081
IRule 接口 继承关系 图
在 服务 注册 时 可以 设置 zone的 值
(杭州,上海)
配置类内 修改 规则 用 Irule 的 bean 作为 一个 对象 注入到 spring 容器
创建 load balance Client 还要做 服务拉取
时间较长
拉取 时 创建了 动态 serverlist load balancer 等 耗费时间 - 懒加载
第二次 server list 会 缓存到内存中
与 spring boot 一样
8848 默认端口
定义了服务发现 与 服务注册
Eureka 和 nacos 都要遵循 这些接口
所以 服务者 消费者 代码 不用变
需要 更改 依赖 和 地址
添加 父管理依赖
添加 服务注册 启动器依赖
nacos 地区 随机 选择 服务
如果 本地 没有 服务 访问 外地 同服务 同时 警告
注册中心 - 数据中心 对 服务 进行 隔离
命名空间 - group 属性
服务(集群)–下一级–》 实例
对实例的划分 是 对业务 进行的 划分 (地域)
命名空间 是 对于 开发生产 测试 环境 的划分
(比如 把 业务相似度 比较高的 服务 放在 一个 分组)
订单—支付 放一块
默认 public
添加 命名 空间的 ID
会在 动态服务 loadbalancer 里拉取 缓存 server 列表 周期30s
划分 提供者 为 临时 实例
和非临时实例
临时 实例 会 直接剔除
非临时实例 会 等待 康复
如果 提供者 挂掉了 nacos 主动 推送 变更 消息
nacos 强调 AP 数据的 可用性
CP 强调 可靠性 和 一致性
Nacos 配置管理 功能
Feign 声明式远程调用 比较 Resttemplate
配置文件 - 关联服务重启 - (热更新 不用重启 就能 配置 生效)
读取配置 结合 本地配置
DataID 服务名称+ profile运行环境名 dev/test/prod.yaml
![在这里插入图片描述](https://img-blog.csdnimg.cn/e2f375f857d245388e8770ec78de4f03.png)
用 Value 注解 读取配置
配置 自动加载 注解
定义一个 成员变量
添加 data注解 getset 方法
用 component 把这个类变成 spring 容器的 一个 bean
注入进来 用getdateformat 获取
另起一个 spring 测试 微服务 环境
配置文件 的 优先级
以 userservice 为准
nginx 有 反向代理 和 负载均衡 的 功能