【SpringCloud】注册中心和Ribbon负载均衡

SpringCloud

1.Eureka注册中心
1.1 Eureka的作用
  • 注册中心
  • 拉取服务
  • 负载均衡
  • 远程调用

order-service得知user-service实例地址流程:

user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端),称为服务注册

eureka-server保存服务名称到服务实例地址列表的映射关系

order-service根据服务名称,拉去实例地址列表,称为服务发现或服务拉取

order-service如何从多个user-service实例中选择具体的实例:

order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用

order-service如何等职某个user-service实例是否依然健康,是不是已经宕机?

user-service会每个一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳

当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除

order-service拉去服务时就能将故障实例排除了

一个微服务既可以是服务提供者,也可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

1.2 搭建eureka-server

引入SpringCloud为eureka提供的starter依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

编写启动类:给eureka-server服务编写一个启动类,启动类上添加一个@EnableEurekaServer注解,开启eureka的注册中心功能

java 复制代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

编写配置文件:

yml 复制代码
server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka
2.Ribbon负载均衡

发起请求的路径是http://userservice/user/1,实际访问的路径是http://localhost:8081/user/1

2.1 负载均衡原理

当请求发出时,负载均衡拦截器会拦截发起的请求,负载均衡客户端会从请求路径中获取服务的名称,动态负载均衡服务列表会根据服务名车给从注册中心拉去服务列表,并返回服务列表,IRule会根据负载均衡规则从服务列表中选择一个服务,负载均衡客户端使用ip地址的端口号代替服务名称修改请求地址,发起真实请求

Rule默认值是一个RoundRobinRule,简单轮询服务列表来选择服务器,它是Ribbon默认的负载均衡规则

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

RandomRule: 随机选择一个可用的服务器

2.2 饥饿加载

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

yml 复制代码
ribbon:
  eager-load:
    enabled: true
    clients: userservice
3.Nacos注册中心
3.1 服务注册

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范

  • 父工程引入依赖

    xml 复制代码
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.6.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
  • 子工程引入服务发现依赖

    xml 复制代码
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • 配置Nacos地址

    yml 复制代码
    spring:
      cloud:
        nacos:
          server-addr: localhost:8848
3.2 服务分级存储模型

一个服务可以有多个实例,user-service可以有:

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

这些实例分布雨全国各地的不同机房,Naocs将统一机房内的实例划分为一个集群,一个服务可以包含多个集群,每个集群下可以有多个实例,形成分级模型

微服务互相访问时,应该尽可能访问同集群的实例,因为本地访问速度更快。当本集群内不可用时才可访问其他集群

配置文件中添加集群配置

yml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

添加属性

sh 复制代码
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
3.3 同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡,Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例

修改负载均衡规则:

yml 复制代码
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 
3.4 权重配置

实际部署中服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,希望性能好的机器承担更多的用户请求,但默认情况下NacosRule是同集群内随机挑选,不会考虑机器性能的问题。

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高,可在Nacos控制台修改权重

3.5 环境隔离

Nacos提供了namespace来实现环境隔离功能

  • Nacos中可以有多个namespace
  • namespace下可以有group、service
  • 不同namespace之间相互隔离,互相不可见

给微服务配置namespace

yml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,ID
3.6 Nacos与Eureka的区别

Nacos的服务实例分为两种类型

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型
  • 非临时实例:如果实例不宕机,不会从服务列表剔除,也可叫永久实例

配置实例为永久实例:

yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos与Eureka的共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,而非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Naocs集群采用AP方式,当集群中存在非临时实例,采用CP模式;Eureka采用AP方式
相关推荐
MrSYJ12 小时前
AuthenticationEntryPoint认证入口
java·spring cloud·架构
程序猿不脱发217 小时前
聊聊负载均衡架构
运维·架构·负载均衡
银迢迢17 小时前
SpringCloud微服务技术自用笔记
java·spring cloud·微服务·gateway·sentinel
弈芯1 天前
SpringCloud微服务拆分最佳实践
spring cloud
云川之下1 天前
【网络】使用 DNAT 进行负载均衡时,若未配置配套的 SNAT,回包失败
运维·网络·负载均衡
yuxb732 天前
集群与负载均衡:HAProxy 与 Nginx 实践
运维·nginx·负载均衡
麦兜*2 天前
【Prometheus】 + Grafana构建【Redis】智能监控告警体系
java·spring boot·redis·spring·spring cloud·grafana·prometheus
牛奶咖啡133 天前
云计算核心技术之云网络技术
云计算·负载均衡·云网络技术·专有/私有网络vpc·vpc系统架构·云网络关键技术·容器云网络技术
sniper_fandc3 天前
Spring Cloud系列—SkyWalking告警和飞书接入
spring cloud·skywalking
努力买辣条3 天前
基于Docker的高可用WordPress集群部署:Nginx负载均衡+Mysql主从复制+ProxySQL读写分离
nginx·docker·负载均衡