微服务学习Day01目录
微服务使用的技术
服务集群, 注册中心, 配置中心, 网关组件, 分布式缓存, 分布式搜索, 消息队列, 分布式日志服务, 系统监控链路追踪
技术内容
调用,注册中心
通知,消息队列异步
汇总
服务治理 springcloudalibaba (nacos注册发现, nacos配置管理)
缓存技术 redis(雪崩击穿穿透等)
异步通信 dubbo(异步,分布式锁等)
搜索技术 es等
持续集成 未接触
总结
将项目的各个功能拆分为独立的项目(服务),
微服务- 服务间调用
基础调用
- 在启动类上 自动bean装配注入spring的 resttemplate类
- 使用resttemplate类 需要url
使用 eureka注册中心
名词
服务提供者: 被远程调用的服务
消费者: 调用远程服务的服务
注册中心: 服务提供者向注册中心提供服务信息, 消费者从注册中心拉取所需要的服务信息并调用
心跳: 服务会向eureka发送心跳,eureka每隔一定时间检测心跳,从而知道服务健康状态
向下探测: eureka并没有,nacos对非临时实例采取
- eur是一个服务端
- 被发现的服务是客户端client
使用:
- eru
- 新建项目
- 添加依赖
- 添加注解
- 配置application.yml文件
- 服务名称
spring:
application:
name: userservice # 服务器名称
- eru地址
- 其他服务
- 添加依赖
- 配制application.yml文件
- 服务名称
- eru地址
- 调用的时候url为其他服务名称直接调用
作用:
- eru:
- 接收服务信息(其他注册)
- 接收心跳
- 发现
- 其他服务
- 提供心跳
- 提供自身的服务信息
eru的ribonn来进行拦截url和负载均衡
使用:
- 添加@loadbalance 实现了client??的客户端的拦截http请求接口 intercept
- 拦截到url , 获取主机名(服务名) , 负载均衡客户端ribbon的 loadbalancer.execut(主机名), {拉取对应的服务列表, rule.chose() randomrule round robin 轮训调度 拿到真实的一个服务名称}, 改url, 发起请求
拦截url
- 拦截url , 从eur中找到对应服务列表, 轮训找出调用的服务
负载均衡原理
轮训提供服务
负载均衡策略
默认ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择 可以修改Zone
定义IRULE实现 修改负载均衡规则
- 代码实现 全体
@Bean
public IRule randomRule(){
return new RandomRule()
}
- xml/yam实现 只针对某个服务
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.规则名称
- 饥饿加载策略
默认懒加载: 服务器启动后相应第一次请求耗时很长 因为第一次访问时才会创建loadbalancer服务器等,
ribbon:
eager-load:
enabled: true # 开启
clients: # 指定饥饿加载的服务名称, 如果是一个服务就直接写后面,否则且行加-
- userservce
DispatcherServlet 加载 (SpringMVC的容器)
Nacos注册中心
认识Nacos
阿里巴巴的产品, 现在属于SpringCloud的组件
注册发现, 分布式配制等, 比Eureka更丰富
安装
- 安装nacos.io (Release,Tag, source), 解压配制(bin可执行文件 startup.cmd打开->
startup.cmd -m模式 standalone单机启动
; target jar包可执行包; conf配置文件 application.properties修改端口 serverport默认8848)
SpringCloud Commons 通用, 定义接口规范
服务发现 服务注册 DiscoveryClient, ServiceRegistry
要改依赖, 父工程管理依赖, 子工程直接加
改地址
Nacos服务注册或发现
- 添加依赖
nacos.discovery
依赖 - 修改yml文件
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
Nacos服务分级存储模型:
同一个服务可有多个实例
同一服务在同一地域的多个实例称集群 默认default 无
即 服务 - 集群 - 实例
服务调用尽可能选择本地集群的服务, 跨集群延迟高
添加集群名称cluster-name
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: BJ #集群名称 北京
根据集群负载均衡
直接就是彻底优先选择本地集群, 然后在本地集群基础上进行随即访问~
NacosRule 先集群后随机
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibab.cloud.nacose.ribbon.NacosRule
若本地都挂了,才会跨集群访问, 同时会有跨集群警告日志
根据权重负载均衡
背景: 机器性能好坏
Nacos提供了权重配制来控制访问频率, 权重越大则访问频率越高
权重值一般 0 到 1 如果是0 完全不会被访问(版本升级可以用), 0.2 0.3等
进入服务,点集群下实例的编辑
环境隔离 - namespace
Nacos中服务和数据存储的最外层都是一个名为namespace用来做最外层隔离(环境变化, 开发,测试,生产等) 里面有group(业务相关性比较高的放一个group中)
namespace环境 - group相关/版本 - 服务 - cluster集群 - 实例
不同环境的服务不可相互调用否则报错no instances availabl
即不同namespace下的服务不可见
- 在Nacos控制台可以创建namespace , 用来隔离不同的环境
- 填写空间名称和空间描述 这两个是必填, 而命名空间id可以根据uuid自动生成
配法:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ # 北京 集群名称
namespace: # 命名空id
Nacos注册中心细节分析
临时/非临时实例
服务提供者: 注册服务信息
消费者:定时拉取服务pull
临时实例: 提供心跳, nacos会30秒检测一次,无心跳则为不健康状态, 且会被剔除
非临时实例: nacos主动发请求询问, 主动探测间隔很小, 且不健康不会被剔除
nacos注册中心: 主动推送变更消息push,服务列表更新更及时
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
namespace: #命名空间uuid
ephemeral: false # 是否临时实例
cluster-name: BJ # 集群名称
Nacos与eureka的比较:
- 共同点
- 都支持服务的注册和服务网拉取
- 都支持服务提供者心跳方式做健康监测
- 区别
- Nacos支持服务端主动检测提供者状态: 临时实例采用心跳模式, 非临时实例采用主动检测模式(服务器压力会更大)
- 临时实例心跳不正常会被剔除, 非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更加及时
- Nacos集群默认采用AP方式, 当集群中存在非临时实例时, 采用CP模式;Eureka采用AP模式