SpringCloud组件--服务拆分、Eureka、Nacos、Eureka与Nacos区别

172 阅读6分钟

一、服务拆分原则

微服务根据业务模块拆分,做到单一职责,不要重复开发相同业务
微服务可以将业务暴露为接口,供其他微服务使用
不同微服务都应该有自己独立的数据库
eg:在订单模块中返回订单信息及用户信息,单体(直接从数据库分别查询用户表和订单表),微服务(订单模块->
订单数据库,订单模块->用户模块->用户数据库->返回给订单模块)

二、Eureka注册中心

1.服务远程调用--提供者和消费者
服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他服务)
服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
2.Eureka作用--注册服务信息、心跳监控、拉取服务
每个微服务模块在启动时,会将服务信息注册到Eureka、并持续监控每个服务的状态,
当有服务挂掉后,会将该服务踢出注册中心,当调用某个模块时,Eureka会拉取该服务,
如果该服务采用集群,Eureka会采用负载均衡策略调用
3.Eureka搭建(服务端)

(1) 新建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: eureka-server # eureka注册中心的服务名称 
eureka:
  instance:
    hostname: ssm-eureka #指定 Eureka 实例(主机名),这个主机名在 Eureka 集群内部被用来互相发现和通信
  client:  
    register-with-eureka: false #自己不往服务端注册
    fetch-registry: false #不需要从 Eureka 服务注册中心获取服务实例的注册信息(因为它直接管理这些信息
    service-url:  #指定了 Eureka 客户端应该连接以获取服务注册信息的 Eureka 服务器的 URL
      defaultZone: http://127.0.0.1:10086/eureka
4.服务注册(客户端)

(1)引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(2)编写配置文件

spring:
  application:
    name: user-server # 注册中心的服务名称 
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

三、Nacos注册中心

1.nacos启动(搭建nacos环境)

解压后,在bin目录下,采用命令行方式启动startup.cmd -m standalone(-m为启动模式 为单机启动)

登录账号密码都为nacos

2.服务注册--添加nacos客户端依赖,不用配置管理端,nacos直接解压可用,与Eureka不同。
注:如果不通过父工程统一管理版本依赖,在子工程中使用需要指定具体版本
在父工程的pom文件中的`<dependencyManagement>`中引入SpringCloudAlibaba的管理依赖:
<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>

在子工程的pom文件中引入nacos-discovery依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件,nacos服务端地址(nacos配置属于spring配置)
spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务端地址

3.nacos服务分级存储

(1) 前言 一个服务可以有多个实例,例如我们的user-service,可以有:

  • 127.0.0.1:8081

  • 127.0.0.1:8082

  • 127.0.0.1:8083

假如这些实例分布于全国各地的不同机房,例如:

  • 127.0.0.1:8081,在上海机房

  • 127.0.0.1:8082,在上海机房

  • 127.0.0.1:8083,在杭州机房

Nacos就将同一机房内的实例划分为一个集群。 当微服务互相访问时,应该尽可能先访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。

  • 总结:Nacos引入集群概念就是为了防止出现跨集群调用,尽可能的避免。

(2) 配置集群 修改子工程user-service服务的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos服务端地址
      discovery:
        cluster-name: HZ # 集群名称,也就是机房所在位置

QQ_1722910803215.png

QQ_1722910819591.png

  • 注意:springboot多实例修改端口等配置时可在修改选项->覆盖配置属性中重新赋值。
4.nacos负载均衡
(1) 同集群优先的负载均衡

默认为轮询,但要想优先访问同集群下的服务时(效率高),可修改配置来实现。

eg: order为单实例 SH集群, user为3实例 1HZ集群 2SH集群。

order调用user模块时想优先调用SH集群,要在order的yaml文件中修改负载均衡规则:

user-service: # 要调用的微服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
    (优先访问同集群服务,在同集群下随机访问服务)
  • 至此可以实现同集群优先调用,当本地集群都无法调用时则会选择其他集群并给出警告信息。

QQ_1722912034653.png

(2) 同集群下修改权重
  • 找到user-service的实例列表,点击编辑,即可修改权重 (权重越大,访问频率越高)

QQ_1722912369465.png

5.环境隔离
(1) 前言

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

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
(2) 配置
  1. 默认情况下,所有service、data、group都在同一个namespace,名为public:
  2. 我们可以点击页面新增按钮,添加一个namespace(id为空会自动生成): QQ_1722912815517.png
  3. 给微服务配置namespace只能通过修改配置来实现。例如修改order-service的application.yml文件:
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 75d4133b-131c-4082-883a-01301f8e6156  # 命名空间,填上述ID
  • 重启order-service后,访问控制台,可以看到下面的结果:

QQ_1722913108216.png

  • 此时访问order-service,因为所在namespace不同,会导致找不到userservice,控制台会报错:

QQ_1722913163799.png

四、Nacos与Eureka区别

(1)Nacos的服务实例分为两种类型:

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

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos服务端地址
      discovery:
        ephemeral: false # 设置为非临时实例

(2)Nacos与eureka的共同点

  • 都支持服务注册和服务拉取 (拉取一次后存在缓存中,定时再去注册中心拉取更新数据)
  • 都支持服务提供者心跳方式做健康检测

(3)Nacos与Eureka的区别

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式。
  • Nacos临时实例心跳不正常会被剔除,非临时实例则不会被剔除。Eureka会30秒进行一次心跳续约,当有服务挂掉后,会踢出注册中心。
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时(当服务列表更新变化时会立即更新缓存列表数据)
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式-