SpringCloud学习笔记(二)Eureka、Ribbon和Nacos

一、服务调用关系

  • 服务提供者:暴露接口给其他微服务调用
  • 服务消费者:调用其他微服务提供的接口
  • 提供者与消费者角色其实是相对的
  • 一个服务可以同时是服务提供者和服务消费者

二、Eureka注册中心

1、通过Eureka的一次远程服务调用的过程

  • 服务提供者注册服务信息(通常所有微服务都要注册,包括Eureka自己),每个微服务的服务器需要向注册中心进行心跳续约,没30秒1次
  • 服务消费者拉取服务提供者的消息
  • 负载均衡调用服务提供者的服务器
  • 服务消费者远程调用服务提供者的微服务

2、Eureka的作用

  • 消费者该如何获取服务提供者具体信息?
    • 服务提供者启动时向Eureka注册自己的信息
    • Eureka保存这些信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?
    • 服务消费者利用负载均衡算法,从服务列表中挑选一个
  • 消费者如何感知服务提供者健康状态?
    • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
    • Eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

3、在Eureka架构中,微服务角色有两类:

  • EurekaServer:服务端,注册中心
    • 记录服务信息
    • 心跳监控
  • EurekaClient:客户端
    • Provider:服务提供者
      • 注册自己的信息到EurekaServer
      • 每隔30秒向EurekaServer发送心跳
    • Consumer:服务消费者
      • 根据服务名称从EurekaServer拉取服务列表
      • 基于服务列表做负载均衡,选择一个微服务后发起远程调用

三、搭建EurekaServer服务

1、搭建EurekaServer服务步骤:

  • 创建eurea-server项目,引入依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
  • 编写启动类,添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
  • 添加application.yml文件,编写以下配置
server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
#    register-with-eureka: true     #false表示不向注册中心注册自己。
#    fetch-registry: true     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

2、模拟多实例部署

  • 在Service窗口对需要多实例的应用右键点击复制配置
  • 修改名字,并在VM选项中输入-Dserver.port=8082(随便填写一个端口号)

3、服务注册

  • 引入eureka-client依赖
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
  • 在application.yml中配置eureka地址
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

4、服务消费者完成服务拉取

  • 修改服务消费者的代码,修改访问的url路径,用服务名代替ip、端口
String url = "http://userservice/user/" + order.getUserId();
  • 在服务消费者项目的启动类中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced   //表示被Ribbon拦截,并进行负载均衡处理
public RestTemplate restTemplate() {
    return new RestTemplate();
}

四、Ribbon负载均衡流程

SpringCloud学习笔记(二)Eureka、Ribbon和Nacos_第1张图片

SpringCloud学习笔记(二)Eureka、Ribbon和Nacos_第2张图片

五、负载均衡策略

1、Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则;默认规则是ZoneAvoidanceRule,即在一个Zone内进行轮询访问

SpringCloud学习笔记(二)Eureka、Ribbon和Nacos_第3张图片
2、通过定义IRule实现可以修改负载均衡规则

  • 添加代码方式,在服务消费者的启动类中定义一个新的IRule
  • 好处是配置灵活,可以全局配置,但修改时需要重新打包发布
@Bean
public IRule randomRule() {
    return new RandomRule();
}
  • 配置文件方式,在服务消费者的application.yml文件中添加新的配置
  • 好处是直观,方便,无须重新打包发布,但无法做到全局配置,只能指定微服务实现
userservice:	#这里是服务提供者的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  # 负载均衡规则,随机访问

六、饥饿加载

  • Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长
  • 而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载
ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称,如果只有一个微服务,也可以直接写在上面
      - userservice # 如果写在下面,则要加个-,后续如果要添加其他微服务,继续加即可

七、Nacos注册中心

1、Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高

2、将微服务注册到Nacos

  • 在所有微服务的父工程中添加spring-cloud-alilibaba的管理依赖
<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    <version>2.2.5.RELEASEversion>
    <type>pomtype>
    <scope>importscope>
dependency>
  • 添加nacos的客户端依赖
<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
  • 修改所有微服务的application.yml文件,添加nacos地址
spring:
  cloud:
    nacos:
      server-addr: nacos:8849 # nacos服务地址
  • 在下载好的nacos中bin文件夹的地址栏上,输入cmd进入当前目录下的cmd窗口,输入startup.cmd -m standalone启动nacos服务,在浏览器中输入http://169.254.219.198:8849/nacos/index.html进入nacos管理界面

八、Nacos服务分级存储模型

  • 将微服务以特征划分集群,比如在杭州、北京的服务器各自划分一个集群;服务调用尽可能选择本地集群的服务,跨集群调用延迟较高;本地集群不可访问时,再去访问其他集群
  • 一级是服务,例如userservice
  • 二级是集群,例如杭州或上海
  • 三级是实例,例如杭州机房的某台部署了userservice的服务器

2、设置服务集群属性:修改application.yml文件

spring:
  cloud:
    nacos:
      server-addr: nacos:8849 # nacos服务地址
      discovery:
        cluster-name: HZ  #配置集群名称,HZ代码杭州

九、NacosRule负载均衡策略

  • NacoosRule会优先选择同集群服务实例列表,如果本地集群找不到,才会去其他集群寻找,并且会报警告,当确定了可用实例列表后,再采用随机负载均衡挑选实例
  • 配置策略:修改微服务的application.yml配置文件,和Eureka的负载均衡策略一样
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则,在集群内部采用随机访问,如果本地没有,则会进行跨集群访问
  • 根据权重负载均衡:Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
    • 在Nacos控制台中可以设置实例的权重值,0~1之间
    • 当权重设置为0时则该实例完全不会被访问

十、环境隔离

  • Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
  • 在Nacos控制台中可以创建namespace,用来隔离不同环境
  • 将生成的namespace的ID添加到实例的application.yml文件中即可完成隔离
  • 不同namespace下的实例无法相互访问
spring:
  cloud:
    nacos:
      server-addr: nacos:8849 # nacos服务地址
      discovery:
        cluster-name: HZ #集群名称
        namespace: 014035c1-8176-4b5e-9423-0e85c6d2cd41 # dev环境,即命名空间的ID
        ephemeral: false # 是否是临时实例

十一、Nacos与Eureka的比较

1、共同点:

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

2、不同点

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除,等正常后就会恢复
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认优先保证AP方式,当集群中存在非临时实例时,优先保证CP;Eureka优先保证AP

3、修改非临时实例的方法,即修改实例的application.yml文件

spring:
  cloud:
    nacos:
      server-addr: nacos:8849 # nacos服务地址
      discovery:
        ephemeral: false # 是否是临时实例,默认是true

十二、Nacos配置管理

  • 配置获取的步骤,优先读取nacos中的配置并覆盖掉applicatino.yml文件中相同的配置
    SpringCloud学习笔记(二)Eureka、Ribbon和Nacos_第4张图片
    统一配置管理的步骤
  • 在Nacos中添加配置文件,手动填写当前环境、服务名称、文件后缀名,以及配置文件里面的详细信息
  • 在微服务中引入Nacos的配置管理客户端依赖:

<dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
  • 在微服务的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml,通过这个文件获取nacos服务器的信息,并决定nacos读取哪个配置文件
spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8849 # nacos地址
      config:
        file-extension: yaml # 文件后缀名

十三、Nacos配置自动更新

  • Nacos中的配置文件变更后,微服务无需重启就可以感知
  • 方法一:在@Value注入的变量所在类上添加注解@RefreshScope
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {

    @Value("${pattern.dateformat}")
    private String dateformat;

	...
}
  • 方法二:使用ConfigurationProperties注释
@Data
@Component
@ConfigurationProperties(prefix = "pattern")	//这里通过约定大于配置的方式自动根据配置属性名匹配
public class PatternProperties {
    private String dateformat;
    private String envSharedValue;
    private String name;
}
  • 注意:不是所有的配置都适合放到配置中心,维护起来比较麻烦;建议将一般关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

十四、Nacos多种配置的优先级

  • 最高:[服务名]-[spring.profile.active].yaml,环境配置
  • 其次:[服务名].yaml,默认配置,多环境共享
  • 最低:application.yml,本地配置
    SpringCloud学习笔记(二)Eureka、Ribbon和Nacos_第5张图片

十五、Nacos集群搭建步骤

  • 搭建MySQL集群并初始化数据库表
  • 下载解压nacos
  • 修改集群配置(节点信息)、数据库配置
  • 分别启动多个nacos节点
  • nginx反向代理

你可能感兴趣的:(SpringCloud学习笔记,spring,cloud,eureka,学习)