注册中心(Nacos&Eureka)

108 阅读3分钟

微服务

微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力
  • 面向服务:微服务对外暴露业务接口
  • 自治:技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

Eureka注册中心(服务端)

  • EurekaServer:eureka服务端,注册中心:记录服务信息,心跳监控
  • EurekaClient:客户端:provider服务提供者,向eureka注册,30s向eureka发送新跳;
    consumer消费者:从eureka拉去服务列表,基于负载均衡做远程调用

Eureka使用

Eureka使用服务搭建

1.依赖

父工程依赖管理

<properties>
    <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!-- springCloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>     
    </dependencies>
</dependencyManagement>

子工程

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

2.主启动类添加注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

3.yml配置文件

server:
  port: 10086

spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka/

Eureka服务注册(客户端)

1.依赖

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

2.yml配置

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka/

服务发现

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

Ribbon负载均衡

image.png

image.png

负载均衡策略

  • 默认zone:区域轮询
  • 轮询
  • 随机
  • 加权

自定义负责均衡策略
1

@Bean
public IRule randomRule() { return new RandomRule();}

2

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule     # 负载均衡规则

饥饿加载

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

ribbon:
  eager-load:
    enabled: true
    clients:
      - userservice
      - userservice2

Nacos注册中心

nacos服务

下载nacos解压启动

nacos客户端

1.依赖 父工程依赖

<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>
</dependencyManagement>

添加nacos的客户端依赖:

<!-- nacos客户端依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.yml配置

spring:
  application:
    name: userservice
  cloud:
    nacos:
      server-addr: localhost:8848   # nacos服务端地址  

nacos分级存储模型

  • 一级是服务,如:userservice;
  • 二级是集群;
  • 三级是实例

服务集群属性设置

spring:
  cloud:
    nacos:
      server-addr: localhost:8848   # nacos服务端地址
      discovery:
        cluster-name: NJ           # 设置集群名称

效果

image.png

Nacos负载均衡策略

配置(不配做默认全部轮询

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

NacosRule负载均衡策略

  • 优先选择同集群服务实例列表
  • 本地集群找不到提供者,才去其它集群寻找,并且会报警告
  • 确定了可用实例列表后,再采用随机负载均衡挑选实例

权重配置
配置在0~1之前,权重越大调用概率越大,设置为0则不会被调用

image.png

Nacos环境隔离

namespace -> group ->service

配置namespace命名空间 (只调用相同namespace服务) 1.nacos页面配置 image.png

2,yml文件配置

spring:
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: localhost:8848   # nacos服务端地址
      discovery:
        cluster-name: NJ           # 设置集群名称
        namespace: bada8b5d-a0bf-4b37-a824-3208cf03b66d  #命名空间配置

Nacos服务维护

设置非临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos与eureka的共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测
    Nacos与Eureka的区别
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式