1.Eureka
1.1 消费者与提供者
服务提供者:
暴露接口给其他微服务调用
服务消费者:
调用其他微服务提供的接口
消费者与提供者的关系是相对的,根据业务情况来看,一个服务既可以是消费者也可以是提供者
1.2 服务调用原理分析
服务调用出现的问题
关于地址信息获取
不能采用硬编码形式,消费者可能要调用多个提供者的地址,用硬编码的话就只能调用其中一个提供者的地址。
Eureka的作用
总结
1.3 实践
三个步骤
搭建EurekaServer
启动类
register user-servive and order-service
多例部署,为了防止端口冲突,需要修改端口设置
服务发现(消费者拉取服务列表)
@LoadBalanced 表示负载均衡
小结
2.Ribbon负载均衡
2.1 负载均衡流程
分析源码后
2.2 负载均衡策略
IRule的接口定义了Ribbon的负载均衡策略
内置的一些负载均衡策略
如何配置负载均衡策略?
两种方式的作用范围不同
代码方式作用全体
配置文件方式只针对某个服务而言
2.3 饥饿加载
如果要对多个服务器进行饥饿加载
3. Nacos
什么是Nacoshttps://www.jianshu.com/p/39ade28c150d
Nacos既可以作为注册中心,又可以作为配置中心
注册中心
提供一个存储介质,供服务提供者和服务消费者共同连接,而存储的主要信息就是这里的 URL。
一个完整的注册中心需要实现以下功能:
- 接收服务端的注册与客户端的引用,即将引用与消费建立关联,并支持多对多。
- 当服务端发生变化时,能及时更新状态,通知客户端。
- 当注册中心重启时,能自动恢复注册数据,以及订阅请求。
配置中心https://blog.csdn.net/qq_46112274/article/details/122620460
3.1 安装
下载安装包
windows版
将nacos-server-1.x.x.zip包解压到任意非中文目录
bin:启动脚本
conf:配置文件
端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改application.properties配置文件中的端口:
server.port=8848
启动
进入./nacos/bin目录下,打开终端。
通过startup.cmd脚本启动
.\startup.cmd -m standalone
按住ctrl,单击Console中的地址,可以进入控制台
默认的账号密码都是nacos
3.2 Nacos的依赖
父工程:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3 服务分级存储模型
服务分级存储模型划分三级
第一级:服务
第二级:集群
第三级:实例
可以发现比Eureka多了一层集群
为什么要有集群?
与机房内的本地调用相比,跨集群调用的延迟较高。为了降低延迟,引入集群的概念,当本地集群不可访问时,再去访问其他集群。
如何给实例配置集群
3.4 NacosRule负载均衡
NacosRule策略
- 优先选择本地集群的服务实例列表
- 当本地集群找不到提供者,才会去其他集群寻找,并且会报警告
- 在本地集群中采用随机负载均衡的方式调用实例
服务实例的权重设置
实例部署中服务器设备的性能有差异,我们希望性能好的机器承担更多的用户请求,为此我们可以对服务实例的权重进行设置。
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
如何设置实例的权重值?
控制台
小结
3.5 环境隔离
我们既然已经将服务实例划分为集群,为什么还要有环境隔离?
集群是地域划分,实际当中我们还有开发环境、生产环境的变化,需要依据这些环境变化来进行环境隔离
Nacos提供了环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
group:将业务相关度比较高的服务放到一个组
创建namespace
默认情况下,所有 service、data、group 都在同一个 namespace,名为 public(保留空间):
我们可以点击页面新增按钮,添加一个 namespace:
然后,填写表单:
就能在页面看到一个新的 namespace:
配置namespace
给微服务配置 namespace 只能通过修改配置来实现。
例如,修改 order-service 的 application.yml 文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间ID
重启 order-service 后,访问控制台。
public
dev
此时访问 order-service,因为 namespace 不同,会导致找不到 userservice,控制台会报错:
4.Nacos和Eureka对比
-
服务提供者
如图,在Nacos中,服务提供者有了临时实例和非临时实例之分。
对于临时实例,与eureca相同,采用心跳监测方式,服务提供者每隔一段时间向nacosserver发送心跳监测数据,报告健康状况,一旦不健康了,就让它从服务列表消失;
对于非临时实例,nacos会主动询问它的健康状况,当它不健康了,只要不手动关闭它,并不会将它从列表中剔除,而是等待它恢复健康。
配置一个服务实例为非临时实例
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
-
服务消费者
nacos采取pull与push相结合的方式,当服务提供者发生变更时,会主动推送变更消息,更加快速地更新服务列表缓存,从而提高效率,减少错误。
主动询问对NacosServer的压力比较大,所以一般推荐临时实例。