• 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主要功能
    EurekaJavaAP注册中心
    NacosJavaAP/CP注册中心、配置中心
    ZookeeperJavaCP

    注册中心、配置中心、分布式队列、分布式锁、

    分布式ID、集群管理等

    ConsulGoCP注册中心、配置中心

    搭建服务

    准备

    名称版本
    Spring-Boot2.7.8
    Spring Cloud2021.0.9
    Spring Cloud Alibaba2021.0.5.0
    JDK1.8

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

    搭建

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

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

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

    搭建父模块
    • pom
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <modules>
    6. <module>SpringCloudServermodule>
    7. modules>
    8. <parent>
    9. <groupId>org.springframework.bootgroupId>
    10. <artifactId>spring-boot-starter-parentartifactId>
    11. <version>2.7.8version>
    12. <relativePath/>
    13. parent>
    14. <groupId>com.example.eurekagroupId>
    15. <artifactId>SpringCloudEurekaDemo2artifactId>
    16. <version>0.0.1-SNAPSHOTversion>
    17. <name>SpringCloudEurekaDemo2name>
    18. <description>SpringCloudEurekaDemo2description>
    19. <packaging>pompackaging>
    20. <properties>
    21. <java.version>1.8java.version>
    22. <spring-cloud.version>2021.0.9spring-cloud.version>
    23. <spring-cloud-alibaba.version>2021.0.5.0spring-cloud-alibaba.version>
    24. properties>
    25. <dependencyManagement>
    26. <dependencies>
    27. <dependency>
    28. <groupId>org.springframework.cloudgroupId>
    29. <artifactId>spring-cloud-dependenciesartifactId>
    30. <version>${spring-cloud.version}version>
    31. <type>pomtype>
    32. <scope>importscope>
    33. dependency>
    34. <dependency>
    35. <groupId>com.alibaba.cloudgroupId>
    36. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    37. <version>${spring-cloud-alibaba.version}version>
    38. <type>pomtype>
    39. <scope>importscope>
    40. dependency>
    41. dependencies>
    42. dependencyManagement>
    43. project>
    搭建Server模块
    • pom
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <parent>
    6. <artifactId>SpringCloudEurekaDemo2artifactId>
    7. <groupId>com.example.eurekagroupId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <artifactId>SpringCloudServerartifactId>
    12. <properties>
    13. <maven.compiler.source>8maven.compiler.source>
    14. <maven.compiler.target>8maven.compiler.target>
    15. properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.cloudgroupId>
    19. <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    20. dependency>
    21. dependencies>
    22. project>
    • 启动类 
    1. @EnableEurekaServer
    2. @SpringBootApplication
    3. public class ServerBootStrap {
    4. public static void main(String[] args) {
    5. SpringApplication.run(ServerBootStrap.class);
    6. }
    7. }

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

    • application.yml
    1. spring:
    2. application:
    3. name: cloud-server
    4. ---
    5. server:
    6. port: 8081
    7. spring:
    8. config:
    9. activate:
    10. on-profile: serverA
    11. eureka:
    12. server:
    13. #注册中心多久检查一次失效的实例
    14. eviction-interval-timer-in-ms: 60
    15. #自我保护
    16. enable-self-preservation: true
    17. instance:
    18. hostname: SpringCloudServerA
    19. prefer-ip-address: true
    20. instance-id: ${spring.cloud.client.ip-address}:${server.port}:@project.version@
    21. client:
    22. service-url:
    23. defaultZone: http://SpringCloudServerB:8082/eureka
    24. register-with-eureka: true
    25. fetch-registry: true
    26. ---
    27. server:
    28. port: 8082
    29. spring:
    30. config:
    31. activate:
    32. on-profile: serverB
    33. eureka:
    34. server:
    35. #注册中心多久检查一次失效的实例
    36. eviction-interval-timer-in-ms: 60
    37. #自我保护
    38. enable-self-preservation: true
    39. instance:
    40. hostname: SpringCloudServerB
    41. prefer-ip-address: true
    42. instance-id: ${spring.cloud.client.ip-address}:${server.port}:@project.version@
    43. client:
    44. service-url:
    45. defaultZone: http://SpringCloudServerA:8081/eureka
    46. register-with-eureka: true
    47. 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 中配置映射

    1. 127.0.0.1 SpringCloudServerA
    2. 127.0.0.1 SpringCloudServerB

    启动服务

    以上配置完后,继续。

    1. 分别在 IDEA 中增加配置文件参数 serverA 和 serverB(不是IDEA的自己加vm参数)启动服务

    2. 注册中心有多个节点的,节点没全部启动完,报错是正常的(相互注册情况下),全部启动后再观察日志

    测试

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

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

    其他

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

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

  • 相关阅读:
    矩阵分析与应用+张贤达
    MQTT的认识(2)
    SpringBoot中@ConfigurationProperties注解的常见使用(学习笔记)
    SQL数据库添加新账号,只操作指定数据库
    安装依赖报错
    Linux用户和权限之一
    VUE后台管理系统模板
    ChatGPT成精了!
    linux 应用层调用shell指令api.之popen 和system
    0816(032天 线程/进程03 一点细节+线程池)
  • 原文地址:https://blog.csdn.net/qq_35427539/article/details/137505621