服务注册组件——Eureka高可用集群搭建
什么是Eureka?
服务注册组件:将微服务注册到Eureka中。
为什么需要服务注册?
微服务开发重点在一个"微"字,大型应用拆分成微型服务,意味着服务的数量不可能少。
服务之间存在调用关系,假设没有服务注册,微服务之间的调用关系就会是这个样子:
微服务的部署可能不会在同一台服务器上,而是需要通过远程调用,然后就涉及到IP地址了。理论上来说,直接通过IP地址直接通信也没有什么问题。 但是如果服务出问题,需要换一台服务器部署,ip地址就需要更改了。同时如果该服务被多个其他服务依赖,那么每一个IP地址都需要重置。
服务注册可以形象的理解为一张表,表的左边写着服务名称,而右侧对应的是IP地址。服务的调用使用名称来替代IP地址,那么当IP地址发生改变,直接修改服务注册中心的名称与IP的映射关系。其他服务由于是用名称来远程调用,所以并不需要更改。
Eureka与Zookeeper的区别
Eureka满足Ap原则,而Zookeeper满足CP原则。
(CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者最多同时满足俩)
Eureka三个角色
Eureka Server 提供服务注册和发现
Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务
消费方与提供方:调用另一个服务称为消费。被另一个服务调用称为提供。
所以,同一个服务可能既是消费方也是提供方。
【注】:Eureka隐藏IP地址的功能体现在整个微服务的内部。
搭建Eureka集群
创建工程
- 创建文件夹Eureka Cluster,用IDEA打开:
- 创建msc-eureka-6001,msc-eureka-6002,msc-eureka-6003工程【jdk1.8】,
导入pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置application.yaml
- 配置地址映射
C:\Windows\System32\drivers\etc
msc-eureka-6001,
server:
port: 6001
eureka:
instance:
hostname: eureka6001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己是注册中心,职责是维护服务,而不是调用服务
service-url:
defaultZone: http://eureka6003.com:6003/eureka/,http://eureka6002.com:6002/eureka/ # 注册到eureka6003和eureka6002里
msc-eureka-6002,
server:
port: 6002
eureka:
instance:
hostname: eureka6002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己是注册中心,职责是维护服务,而不是调用服务
service-url:
defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6003.com:6003/eureka/
msc-eureka-6003
server:
port: 6003
eureka:
instance:
hostname: eureka6003.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己是注册中心,职责是维护服务,而不是调用服务
service-url:
defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/
创建主启动类并添加注解@EnableEurekaServer
package zkrun.top;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
@SpringBootApplication
public class App_msc_eureka_6001
{
public static void main(String[] args)
{
SpringApplication.run(App_msc_eureka_6001.class, args);
}
}
启动Eureka集群
访问任意一个端口,都会显示另外两个Eureka服务
创建注册服务测试Eureka集群的高可用性
新建工程msc-provider-5001
导入pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- Eureka客户端启动需要依赖web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> <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>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 配置application.yaml
server:
port: 5001
spring:
application:
name: msc-provider #应用名称
eureka:
client:
service-url:
defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/,http://eureka6003.com:6003/eureka/
instance:
instance-id: msc-provider-5001
prefer-ip-address: true #访问路径可以显示IP地址
- 创建主启动类添加注解@EnableEurekaClient
package zkrun.top;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class App_msc_provider_5001
{
public static void main(String[] args)
{
SpringApplication.run(App_msc_provider_5001.class, args);
}
}
- 测试Eureka集群高可用
手动停掉eureka6001,
eureka6001无法访问:
6002和6003仍然提供注册服务:
小结:
- 三个Eureka和注册服务都没有继承父工程,其pom依赖都是独立的。其中注册服务依赖spring-boot-starter-web。今后在设计父工程的pom时,应该考虑到每个子工程的依赖。
- 与Eureka同级别的服务注册组件还有Zookeeper,Consul等。根据具体的应用场景和组件的优势来决定技术选取是软件开发更应该注意的。(除了Eureka之外,同级别的其他组件也需要了解)
代码参考:https://github.com/Noneplus/JavaDev-Note/tree/master/SpringCloud代码
最新文章
- UI: 概述, 启动屏幕, 屏幕方向
- [专题论文阅读]【分布式DNN训练系统】 FireCaffe
- POJ 2653	 Pick-up sticks --队列,几何
- String类的使用 Part2
- Speech Patterns (string)
- Spark SQL &#160;inferSchema实现原理探微(Python)
- mysql和mysqli的区别
- Qt 智能指针学习(7种QT的特有指针)
- 第四十节,requests模拟浏览器请求模块初识
- python基本数据类型——set
- Linux系列教程(二十)——Linux的shell概述以及如何执行脚本
- Django ORM详解
- hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)
- lock了mutex的线程退出了却没有unlock时会怎么样?
- flask之wtform与flask-session组件
- C++调用matlab函数
- (转)Is attacking machine learning easier than defending it?
- Sql Server分页储存过程
- memory-based 协同过滤(CF)方法
- LOJ#2170. 「POI2011」木棍 Sticks
热门文章
- Java编程思想:内部类其他知识点
- Sublime Text 3 实现C++代码的编译和运行
- 学习笔记-jvm运行时数据区
- STM32-I2C_CheckEvent-标志位自动清除理解
- 个人永久性免费-Excel催化剂功能第54波-批量图片导出,调整大小等
- [leetcode] 110. Balanced Binary Tree (easy)
- python小技巧 将二元列表转为一元列表
- 在C#中ParameterizedThreadStart和ThreadStart区别
- python课堂整理5---元组
- LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer