目录
eureka注册中心(理解)
注册中心工作流程
1.服务注册 服务名称 地址列表
2.消费者通过提供方名称在注册中心中查找提供方的地址列表。
3.消费者中通过负载均衡算法,从地址列表中选择地址
4.远程调用
实操案例
单独搭建eureka模块
1.引入依赖spring-cloud-starter-netflix-eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.@EnableEurekaServer加在启动类上当作开关
3.配置文件中配置服务名称,注册中心地址
server:
port:10086(随便)
spring:
application:
name:eurekaserver(随便写,但要和其他模块调用时写的路径名一致)
#将当前服务通过下面的地址,注册到eureka注册中心
eureka:
client:
service-url:
#该地址是eureka内置的接口地址,用来提供服务注册功能
defaultZone: http://127.0.0.1:10086/eureka
启动微服务
启动微服务,然后在浏览器访问:http://127.0.0.1:10086
看到下面结果应该是成功了:
order和user服务进行服务注册
1.引入spring-cloud-starter-netflix-eureka-client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.配置文件中配置服务名称,注册中心地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
spring:
application:
name: orderservice (提供服务的名字,即本模块服务的别名,方便其他服务模块调用)
3.启动多个实例
order服务如何实现服务发现
远程调用写死地址ip:port修改为微服务名称(即服务的提供者)
给RestTemplate放入容器时添加@LoadBanlaced注解实现负载均衡
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
Ribbon负载均衡器(理解)
原理
底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。
基本流程如下:
拦截我们的RestTemplate请求http://userservice/user/1
RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
eureka返回列表,localhost:8081、localhost:8082
IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
哪些负载均衡策略
负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
默认的实现就是ZoneAvoidanceRule,是一种轮询方案
如何切换负载均衡策略()
方式一:在消费服务的启动类代码
在order-service中的OrderApplication类中,定义一个新的IRule
@Bean
public IRule randomRule(){
return new RandomRule();
}
方式二:在消费服务的配置文件
在order-service的application.yml文件中,添加新的配置也可以修改规则
xxservice: #服务提供者的名称 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #同机房优先调用
注意,一般用默认的负载均衡规则,不做修改
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: userservice(提供服务的名称)
nacos注册中心(掌握)
搭建
下载,安装,启动nacos 进入bin 用命令行启动 startup.cmd -m standalone
在启动的过程中会有nacos的地址 在浏览器中打开 nacos(账户,密码一样)
order和user服务进行注册和发现
1.引入依赖
在父工程中引入spring-cloud-alibaba-dependencies
在其他工程中引入nacos服务发现依赖spring-cloud-starter-alibaba-nacos-discovery
2.修改部分代码
远程调用将写死地址ip:port修改为微服务名称
在RestTemplate的上面加上@Bean和@LoadBanlaced
3.配置文件中配置
配置服务名称
spring:
application:
name: xxservice #1. 服务名称(供其他服务模块调用)
修改提供服务和消费服务中的application.yml文件,注释eureka地址,添加nacos地址
spring:
cloud:
nacos:
server-addr: localhost:8848
配置nacos地址
在提供服务和消费服务的配置文件application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
服务集群(多级存储模型)
在配置文件中写入
spring
.cloud
.nacos
.discovery
.cluster-name: 集群名称
也可以复制启动类,并配置 在VM options中写入-Dserver.port=端口(如:8081) -
Dspring.cloud.nacos.discovery.cluster-name=集群名称
优先从同集群中挑选实例
xxservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
nacos服务分级存储模型
服务(一对多)集群 (似机房一对多)实例(某台服务器的某单个端口服务)
服务器容灾
权重配置
权重配置来控制访问频率,权重越大则访问频率越高。
注意:如果权重修改为0,则该实例永远不会被访问
可以进行项目升级时使用实现,项目平滑升级
环境隔离
Nacos提供了namespace来实现环境隔离功能
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离
给微服务配置namespace
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ #集群名称
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
Nacos与Eureka的区别
共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
区别
1.Nacos支持服务端主动检测提供者状态
临时实例采用心跳模式,临时实例心跳不正常会被剔除
非临时实例采用主动检测模式,非临时实例则不会被剔除,会等待恢复健康
2.Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
3.Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式
Eureka采用AP方式
Nacos配置管理
在nacos图形界面统一配置管理,新建配置文件
填写配置id ,微服务名称-环境名(如:test,develop).扩展名(如:yaml,properties)
分组选择默认分组
描述 微服务...环境的外部配置环境
配置格式id后缀名一致
注意:若想在新的namespace建立,就需要在配置文件中指定namespace和group
在提供服务的模块中引入nacos配置中心依赖
spring-cloud-starter-alibaba-nacos-config
在微服务的resource目录中添加一个bootstarp.yml文件
bootstarp.yml优先极高,故nacos配置的地址必须写入其中
在项目启动时先执行bootstrap.yml配置文件,在执行application配置文件,在读取nacos配置中心配置文件
spring:
application:
name: userservice #1. 服务名称(供其他服务模块调用)
profiles:
active: dev #2.开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # 3.Nacos地址
config:
file-extension: yaml # 4.文件后缀名
测试配置文件是否被读取
- 使用@Value 每次只能读取配置文件的一个信息
- 使用@ConfigurationProperties 可将配置中的多个信息封装到实体类对象中
热更新
方式一
@RefreshScope
@Value注入的变量所在类上添加注解@RefreshScope
方式二
- 使用@ConfigurationProperties(prefix="配置文件中的哪个配置信息名")注解,加在对应配置文件中的属性名称相同的类中
- 该类还要@Component注解
- 还需要把该类注入控制层,调用其里面的方法即可
- 并在调用的控制层添加@EnableConfigurationProperties(对应的类名.class)
多环境配置共享
微服务启动时会从nacos配置中心读取两个配置文件
微服务名称-环境.yaml
微服务名称.yaml,此文件一定会加载,故把共享配置写入此文件
有统一配置时优先级(由高到低)
微服务名称-环境.yaml(高)
微服务名称.yaml
本地配置(低)