3、服务注册中心

注册中心以及服务注册

常用服务注册中心对比

Nacos Eureka Consul CoreDns Zookeeper
一致性协议 CP + AP AP CP / CP
健康检查 TCP/HTTP/MySQL/client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
负载均衡 权重/DSL/metaData/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销示例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS NNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
Spring Cloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
k8s集成 支持 不支持 不支持 支持 支持

Eureka

img

Eureka-Server搭建

1、创建maven项目,导入依赖

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

2、在该模块的启动类上,添加注解将该应用程序定位为微服务的注册中心

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3、在application.yml中,对eureka进行配置

server:
  port: 9000
spring:
  #必须添加项目名
  application:
    name: eureka
eureka:
  client:
    #不需要获得任何其它服务的注册信息
    fetch-registry: false
    #自身的注册
    register-with-eureka: false
    service-url:
      #地址中的eureka不可以改变
      defaultZone: http://localhost:9000/eureka

4、进入eureka界面,证明搭建成功

image-20210816102601525

Eureka-client注册服务

对项目中的消费者以及生产者进行注册,例如,项目订单、商品等微服务

1、导入依赖(Eureka-Client客户端)

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

2、修改微服务application.yml文件

server:
  port: 8080
spring:
  #必须添加项目名
  application:
    name: star-product
eureka:
  client:
    #可以不写,默认值为true
    fetch-registry: true
    #可以不写,默认值为true
    register-with-eureka: true
    service-url:
      #配置eureka注册地址
      defaultZone: http://localhost:9000/eureka
  instance:
    #将自己的ip注册到eureka的server
    prefer-ip-address: true

3、在启动类上, 添加注解,将该程序定义为:Eureka注册中心的客户端

@SpringBootApplication
@EnableEurekaClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class,args);
    }
}

4、启动该微服务,查看eureka界面是否注册成功

image-20210816105131181

5、可以在服务消费方,使用该application名进行访问

image-20210816110920893

前提:需要在RestTemplate方法上,添加注解@LoadBalanced

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}

横向扩容(提供者高可用)

实现方式(Idea)

1、编辑添加实例

image-20210816112129641

2、选择springboot实例

image-20210816112207730

3、配置实例

image-20210816112454223

4、查看eureka,查看实例是否注册成功

image-20210816114213221

eureka高可用

实现方式(Idea)

1、修改eureka微服务的配置文件

server:
  port: 9000
spring:
  application:
    name: eureka
eureka:
  client:
    #获得其它服务的注册信息
    fetch-registry: true
    #进行自身的注册
    register-with-eureka: true
    service-url:
      #需要将自己注册在自身以及其他eureka服务上
      defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka

2、添加新的springboot实例

image-20210816145314812

3、启动两个eureka实例,观察

image-20210816145426060

4、将其他微服务,注册在所有的eureka上

server:
  port: 8090
spring:
  application:
    name: star-orders
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
  instance:
    prefer-ip-address: true

5、观察实例在所有的eureka上都被注册

image-20210816145849865

配置actuator

1、修改微服务在注册中心显示的名称

server:
  port: 8080
spring:
  application:
    name: star-product
eureka:
  client:
    #可以不写,默认值为true
    fetch-registry: true
    #可以不写,默认值为true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
  instance:
    #配置中心显示的名称
    instance-id: productName

image-20210816155209255

2、访问路径显示ip地址

server:
  port: 8080
spring:
  application:
    name: star-product
eureka:
  client:
    #可以不写,默认值为true
    fetch-registry: true
    #可以不写,默认值为true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
  instance:
    #配置中心显示的名称
    instance-id: productName
    #将自己的ip注册到eureka的server
    prefer-ip-address: true

image-20210816155357061

服务发现Discovery

@EnableDiscoveryClient和@EnableEurekaClient的区别

自我保护

image-20210816174607485

Eureak默认开起来自我保护。避免因为意外情况,将正常的节点直接删除。

进入自我保护模式最直观的体现就是Eureka Server首页的警告

默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了----因为微服务本身是健康的,此时本不应该注销这个微服务。

自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。

Eureka Server通过“自我保护模式”来解决这个问题----当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

在Spring Cloud中,可以使用

eureka.server.enable-self-preservation=false

来禁用自我保护模式,一般不会去主动禁用自我保护

心跳间隔

eureka:
  instance:    
    #客户端向服务器发送心跳的时间间隔,单位秒(默认30秒)
    lease-renewal-interval-in-seconds: 30
    #服务器在最后一次收到客户端心跳的等待时间,单位秒(默认30秒),超时会剔除该客户端
    lease-expiration-duration-in-seconds: 90

Eureka的健康检查

在eureka的客户端中,每个微服务需要把自己的健康状况传播发送到EurekaServer。让EurekaServer能够清晰的知道每个微服务,目前的健康状态。

http://10.1.1.121:9003/actuator/info就是健康检查的页面,默认没有开启健康检查

Nacos(Alibaba)

官网:https://nacos.io/zh-cn/

使用

1、下载nacos服务端,解压缩

image-20210817093437818

2、启动bin下的startup.cmd

image-20210817094400093

3、启动控制台

http://172.16.4.22:8848/nacos/index.html

image-20210817094513033

4、注册提供者和消费者到nacos

4.1添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2在启动类添加注解@EnableDiscoveryClient
4.3修改yml配置文件
server:
  port: 8080
spring:
  application:
    name: student-system
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
4.4查看nacos服务端,添加成功

image-20210817103034680

Nacos高可用(win下同ip不同端口)

1、下载nacos,并解压,复制三份

image-20210817200500890

2、获取conf文件夹下nacos-mysql.sql脚本,在数据库生成

避坑:如果运行报错Invalid default value for 'gmt_create',那么需要将sql语句中的DEFAULT CURRENT_TIMESTAMP全部删除,创建后的数据库

image-20210817200944283

3、分别修改三个nacos实例的配置,conf文件夹下

3.1、修改application.properties

修改三个nacos实例的端口,并且三个nacos实例连接同一个数据库就可以

image-20210817201048445

3.2、重命名cluster.conf.example为cluster.conf,并编辑

添加所有的nacos实例的ip:port,包括自己的

image-20210817201319357

避坑:此处需要使用本机的ip,不可以使用localhost或127.0.0.1

4、分别启动三个nacos实例

在各自的bin目录下,使用命令:startup.cmd -m cluster,进行启动

5、启动界面,查看效果

image-20210817201657443