微服务注册配置中心负载均衡

目录

eureka注册中心(理解)

注册中心工作流程

实操案例

单独搭建eureka模块

启动微服务

order和user服务进行服务注册

order服务如何实现服务发现

Ribbon负载均衡器(理解)

原理

哪些负载均衡策略

如何切换负载均衡策略()

饥饿加载

nacos注册中心(掌握)

搭建

order和user服务进行注册和发现

服务集群(多级存储模型)

nacos服务分级存储模型

权重配置

环境隔离

Nacos与Eureka的区别

共同点

区别

Nacos配置管理

测试配置文件是否被读取

热更新

多环境配置共享


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来实现环境隔离功能

  1. nacos中可以有多个namespace
  2. namespace下可以有group、service等
  3. 不同namespace之间相互隔离

给微服务配置namespace

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ  #集群名称
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

Nacos与Eureka的区别

共同点

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

区别

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.文件后缀名

测试配置文件是否被读取

  1. 使用@Value 每次只能读取配置文件的一个信息
  2. 使用@ConfigurationProperties 可将配置中的多个信息封装到实体类对象中

热更新

方式一

@RefreshScope

@Value注入的变量所在类上添加注解@RefreshScope

方式二

  1. 使用@ConfigurationProperties(prefix="配置文件中的哪个配置信息名")注解,加在对应配置文件中的属性名称相同的类中
  2. 该类还要@Component注解
  3. 还需要把该类注入控制层,调用其里面的方法即可
  4. 并在调用的控制层添加@EnableConfigurationProperties(对应的类名.class)

多环境配置共享

微服务启动时会从nacos配置中心读取两个配置文件

微服务名称-环境.yaml

微服务名称.yaml,此文件一定会加载,故把共享配置写入此文件

有统一配置时优先级(由高到低)

微服务名称-环境.yaml(高)

微服务名称.yaml

本地配置(低)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值