一、Eureka注册中心
1. Eureka的作用
1.1原理分析

1.2Eureka如何解决微服务的问题?
- 消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向Eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
1.3 Eureka架构总结
在Eureka架构中,微服务角色有两类:
- EurekaServer:服务端,注册中心
- 记录服务信息
- 心跳监控
- EurekaClient:客户端
- Provider:服务提供者
- 注册自己的信息到EurekaServer
- 每隔30秒向EurekaServer发送心跳
- Consumer:服务消费者
- 根据服务名称,从EurekaServer拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
- Provider:服务提供者
2、动手实践

2.1 搭建EurekaServer
搭建EurekaServer服务,步骤如下:
1、创建项目,映入Spring-cloud-starter-netflix-eureka-server的依赖

2、编写启动类,添加@EnableEurekaServer注解
3、添加application.yaml文件,编写下面的配置

2.2 注册user-service
将user-service服务注册到EurekaServer步骤如下:
1、在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖

2、在application.yaml文件,编写下面的配置
2.3 在order-service完成服务拉取
服务拉取时基于服务名称获取服务列表,然后再对服务列表做负载均衡
1、修改OrderService的代码,修改访问的url领,用服务名代替IP、端口

2、在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解

2.4 总结

二、Ribbon负载均衡

1.负载均衡原理

2.负载均衡策略
Ribbon的负载均衡规则是由一个叫做IRule的接口来定义的,每一个子接口都是一种规则

通过定义IRule实现可以修改负载均衡规则,有两种方式:
1、代码方式:在order-service中的OrderApplication类中,定义一个新的IRule;

2、配置文件方式:在order-service的applicaton.yaml文件中,添加新的配置也可以修改规则:

3.懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置,开启饥饿加载

4.总结

三、Nacos注册中心
3.1 Nacos注册中心

1. nacos安装
参考nacos官方
2. 服务注册到nacos
1、在cloud-demo父工程中添加spring-aloud-alibaba的管理依赖:

2、注释掉order-service和user-service中原有的eureka依赖。
3、添加nacos的客户端依赖:

4、修改user-service和order-service中的application.yaml文件,注释eureka地址,添加nacos地址:

5、启动并测试:

3. 总结:

3.2 Nacos服务分级存储模型


1.服务集群属性
默认情况下,集群的名称是DEFAULT

2.服务集群属性实战
1.修改application.yml,添加如下内容
spring:
application:
name: orderService
cloud:
nacos:
discovery:
cluster-name: HZ #集群名称,nacos默认情况下,先访问同集群的实例
server-addr: 127.0.0.1:8848
loadbalancer:
enabled: true #
我们定义orderService的集群名称是HZ(代表杭州集群),对应配置文件中的spring.cloud.nacos.discovery.cluster-name
2.在Nacos控制台可以看到集群变化

如下示例,把userService的三台机器,分别放到杭州和上海集群


3.小结
1.Nacos服务分级存储模型
一级是服务,例如userService
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了userService服务的服务器
2.如何修改服务的集群属性
修改application.yaml中的spring.cloud.nacos.discovery.cluster-name属性
3.3 NacosRule负载均衡
userService集群情况如下:

orderService集群情况如下:

默认情况下,orderService服务采用轮询的方式,调用userService的三个实例。这样杭州集群的orderService调用了上海集群的userService,不符合我们的预期。
Nacos负载均衡规则:
application.yaml 修改如下配置,可以使用Nacos负载均衡规则:

NacosRule负载均衡规则:
3.4 Nacos服务实例的权重设置
实际部署中会出现这样的场景:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器能承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
修改步骤:
1.在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮

2.将权重设置为0.1,测试发现8082被访问的频率大大降低

如果将权重设置为0,那么将没有请求到8082的实例,我们平时可以利用次功能进行版本升级。具体操作方法如下:
- 将要下线的实例设置成0;
- 然后对服务做停机操作,替换版本后,将权重设置成一个很小的值,比如0.01,先放少量请求进来;
- 如果没问题,将权重逐渐放大,最后将权重设置成该有的权重,这样可以做到上线的平滑处理;
总结:
实例的权重控制:
3.5 环境隔离-namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离

1.在Nacos控制台,可以创建namespace,用来隔离不同环境

2. 然后填写一个新的命名空间信息

3. 保存后会在控制台看到这个命名空间的id:

4. 修改orderService的application.yaml,添加namespace:

5.重启orderService后,再来查看控制台:


6.此时访问orderService,因为namespace不同,会导致找不到userService,控制台会报错:

总结:
Nacos环境隔离:
4.Nacos和Eureka对比
1. nacos注册中心细节分析

2. 临时实例和非临时实例
服务注册到nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:

临时实例宕机时,会从nacos的服务列表中删除,而非临时实例不会。
3. 总结:
1.Nacos与Eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康监测
2.Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动监测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
5.Nacos配置管理,见下一篇







