系列文章
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
<?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
<?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>
- 启动类
@EnableEurekaServer
@SpringBootApplication
public class ServerBootStrap {
public static void main(String[] args) {
SpringApplication.run(ServerBootStrap.class);
}
}
说明: @EnableEurekaServer 表示当前服务是一个 Eureka 注册中心
- application.yml
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 中配置映射
127.0.0.1 SpringCloudServerA
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自动进入我保护机制。进入自我保护的注册中心不会主动剔除服务,保证当前注册中心仍然可用,并且能进行正常的注册和调用,但不会主动同步服务列表直到网络正常。