Spring Cloud系列(二):Eureka Server应用

系列文章

Spring Cloud系列(一):Spirng Cloud变化

Spring Cloud系列(二):Eureka Server应用

目录

前言

注册中心对比

Nacos

Zookeeper

Consul

搭建服务

准备

搭建

搭建父模块

搭建Server模块

启动服务

测试

其他


前言

前面针对新版本的变化有了了解,接下来,对 Spring Cloud 规范下的各大组件做一个介绍和应用用,包括原理,首先就是微服务的核心------注册中心 Eureka。

Eureka 是 Spring Cloud 提供的默认的服务注册中心,其提供了服务注册与发现功能。

Eureka 包含 Eureka-Server 和 Eureka-Client 两部分, Eureka-Server 是服务注册中心,用于管理注册的所有服务;Eureka-Client 是客户端,用于服务提供者提供服务和服务消费者调用服务。

其工作流程大体如下:

注册中心对比

除了 Spring Cloud 默认的注册中心 Eureka 外,当今主流的注册中心还有 Nacos、Zookeeper、Consul 等。

Nacos

Nacos 是一个阿里开源的动态服务发现、配置管理和服务管理平台,其不但提供了注册中心的功能,还提供了配置中心、简单的权限管理等功能,功能易用且强大。

Zookeeper

Zookeeper 是一个分布式服务框架,其采用存储+通知的方式,解决分布式中的各种问题,其功能包括:发布/订阅、分布式队列、集群管理、分布式独占锁/读写锁、集群Leader选举、分布式ID生成等等。这些功能主要是利用其 Znode 节点的特性和其节点监听的功能,其采用 ZAB 协议保持数据的一致性。

Consul

Consul 是由 HashiCorp 基于 Go 语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件, 采用 Raft 算法保证服务的一致性,且支持健康检查。

组件名 语言 CAP 主要功能
Eureka Java AP 注册中心
Nacos Java AP/CP 注册中心、配置中心
Zookeeper Java CP 注册中心、配置中心、分布式队列、分布式锁、 分布式ID、集群管理等
Consul Go CP 注册中心、配置中心

搭建服务

准备

名称 版本
Spring-Boot 2.7.8
Spring Cloud 2021.0.9
Spring Cloud Alibaba 2021.0.5.0
JDK 1.8

该系列的所有内容相关环境,都已以上为主。

搭建

当前项目分为两个模块,SpringCloudEurekaDemo2 和 SpringCloudServer。

SpringCloudEurekaDemo2 是父模块,主要用于管理子模块、管理依赖等等。

SpringCloudServer 就是注册中心所在模块,用于微服务中所有的服务注册和管理。

搭建父模块
  • pom
html 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>SpringCloudServer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.eureka</groupId>
    <artifactId>SpringCloudEurekaDemo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloudEurekaDemo2</name>
    <description>SpringCloudEurekaDemo2</description>
    <packaging>pom</packaging>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.9</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
搭建Server模块
  • pom
html 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudEurekaDemo2</artifactId>
        <groupId>com.example.eureka</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringCloudServer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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

</project>
  • 启动类
java 复制代码
@EnableEurekaServer
@SpringBootApplication
public class ServerBootStrap {

    public static void main(String[] args) {
        SpringApplication.run(ServerBootStrap.class);
    }
}

说明: @EnableEurekaServer 表示当前服务是一个 Eureka 注册中心

  • application.yml
java 复制代码
spring:
  application:
    name: cloud-server

---
server:
  port: 8081
spring:
  config:
    activate:
      on-profile: serverA
eureka:
  server:
    #注册中心多久检查一次失效的实例
    eviction-interval-timer-in-ms: 60
    #自我保护
    enable-self-preservation: true
  instance:
    hostname: SpringCloudServerA
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}:@project.version@
  client:
    service-url:
      defaultZone: http://SpringCloudServerB:8082/eureka
    register-with-eureka: true
    fetch-registry: true

---

server:
  port: 8082
spring:
  config:
    activate:
      on-profile: serverB
eureka:
  server:
    #注册中心多久检查一次失效的实例
    eviction-interval-timer-in-ms: 60
    #自我保护
    enable-self-preservation: true
  instance:
    hostname: SpringCloudServerB
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}:@project.version@
  client:
    service-url:
      defaultZone: http://SpringCloudServerA:8081/eureka
    register-with-eureka: true
    fetch-registry: true

**说明:**1.spring.config.activate.on-profile:表示当前环境名,这里采用不同的端口构建伪集群

2.eureka.server.eviction-interval-timer-in-ms:表示当前注册中心间隔多久检查实例状态,单位秒,默认 60秒

3.eureka.server.enable-self-preservation:表示是否开启自我保护(避免网络故障导致服务不可用),默认 true

4.eureka.instance.prefer-ip-address:表示猜测显示主机名时是IP优先,默认 false

5.eureka.instance.instance-id:表示注册在注册中心Eureka上的唯一实例ID,默认 主机名:应用名:端口

6.eureka.client.service-url.defaultZone:默认注册地址,默认值 http://localhost:8761/eureka/

7.eureka.client.register-with-eureka:表示是否注册自己为服务,默认 true

8.eureka.client.fetch-registry:表示是否从注册中心Eureka拉取服务,默认 true

**注意:**1.这里 SpringCloudServerA 和 SpringCloudServerB 能生效的前提是已在C:\Windows\System32\drivers\etc\hosts 中配置映射

java 复制代码
127.0.0.1 SpringCloudServerA
127.0.0.1 SpringCloudServerB

启动服务

以上配置完后,继续。

  1. 分别在 IDEA 中增加配置文件参数 serverA 和 serverB(不是IDEA的自己加vm参数)启动服务
  1. 注册中心有多个节点的,节点没全部启动完,报错是正常的(相互注册情况下),全部启动后再观察日志

测试

服务启动好了,Eureka 自带 DashBoard 可查看相应的信息。

  1. 浏览器访问 http://localhost:8081/ 或者 http://localhost:8082/

其他

  1. Eureka 全部节点都是平等的,不存在主从区分

  2. Eureka 自我保护机制是非常有必要的,如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中间出现了网络故障,Eureka Server自动进入我保护机制。进入自我保护的注册中心不会主动剔除服务,保证当前注册中心仍然可用,并且能进行正常的注册和调用,但不会主动同步服务列表直到网络正常。

相关推荐
ZSYP-S11 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
qxlxi1 小时前
【Spring事务】深入浅出Spring事务从原理到源码
spring
路在脚下@2 小时前
Spring Boot @Conditional注解
java·spring boot·spring
小蜗牛慢慢爬行5 小时前
使用 AOP 在 Spring Boot 中实现跟踪和日志记录
java·开发语言·spring boot·后端·spring·日志记录
奕_奕6 小时前
SpringMVC
spring
武子康7 小时前
Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor
java·开发语言·后端·spring·springboot·springcloud
Milk夜雨7 小时前
Java旅程(五)Spring 框架与微服务架构 & 了解 JVM 内部原理和调优
java·开发语言·spring
Seven977 小时前
Spring事务管理深度解析-从实践到原理
java·spring
解梦者8 小时前
Spring(七)Spring Cloud----Feign、Zuul和Apollo
spring·spring cloud·feign·apollo·zuul
瓜牛_gn8 小时前
苍穹外卖项目Day02代码结构深度解析
java·spring