跳过正文
  1. 文章/
  2. Java/
  3. SpringFramework/
  4. SpringCloud/

3、服务注册中心

·3220 字·7 分钟· loading · loading · ·
Java SpringFramework SpringCloud
GradyYoung
作者
GradyYoung
目录
SpringCloud - 点击查看当前系列文章
§ 3、服务注册中心 「 当前文章 」

注册中心以及服务注册
#

  • 注册中心:是一个专用于完成微服务的注册,以及服务发现的东西
  • 它采用的模式:发布/订阅模式
  • 产品:Eureka(国外的),Nacos(国内阿里巴巴),ZooKeeper(动物园管理员)
  • 这种产品非常多,具体使用情况具公司的情况具体使用

常用服务注册中心对比
#

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
#

  • Eureka是SpringCloud体系中,专门用来完成服务的注册和发现的组件

  • Eureka组件分为2个部分:

    • Eureka-Server(注册中心)
    • Eureka-client(客户端)
  • 当前目前,Eureka已经从2.0开始,不再更新了,但是Spring还是在维护

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();
}

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

  • 开发环境,有时需要去提前做一些微服务的横向扩容测试

  • 横向扩容:我们给每个微服务,提供很多的注册实例

  • 一个微服务程序,被放置在多个Tomcat中,实际上就是横向扩容,横向扩容的目的:

    • 提示系统整体的响应性能
    • 提升系统整体的可用性(高可用)
  • 针对同一个微服务程序,模拟多台Tomcat

实现方式(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
#

  • 对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
  • 在主启动类上添加注解:@EnableDiscoveryClient

@EnableDiscoveryClient和@EnableEurekaClient的区别
#

  • 相同点
    • 都是能够让注册中心能够发现,扫描到该服务
  • 不同点
    • @EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以适用与Eureka或其他注册中心

自我保护
#

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

SpringCloud - 点击查看当前系列文章
§ 3、服务注册中心 「 当前文章 」