温故而知新,可以为师矣
本文为拉钩教育java高薪培训班学习笔记与总结
1. 主流服务中心对比
Zookeeper
Zookeeper
它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主 要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。简单来说
zookeeper
本质
=
存储
+
监听通知。
Zookeeper ⽤来做服务注册中⼼,主要是因为它具有节点变更通知功能,只要客户端监听相关服务节点,服务节点的所有变更,都能及时的通知到监听客户端,这样作为调⽤⽅只要使⽤
Zookeeper 的客户端就能实现服务节点的订阅和变更通知功能了,⾮常⽅便。另外,
Zookeeper 可⽤性也可以,因为只要半数以上的选举节点存活,整个集群就是可⽤的。
Eureka
由
Netflflix
开源,并被
Pivatal
集成到
SpringCloud
体系中,它是基于 RestfulAPI ⻛格开发的服务注册与发现组件。
Consul
Consul
是由
HashiCorp
基于
Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采⽤
Raft
算法保证服务的⼀致性,且⽀持健康检查。
Nacos
Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说
Nacos
就是 注册中⼼
+ 配置中⼼的组合,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。
Nacos 是Spring Cloud Alibaba
核⼼组件之⼀,负责服务注册与发现,还有配置。
2. 服务注册中心组件 Eureka
Eureka 基础架构
Eureka 交互流程及原理
图来自官网
Eureka
通过⼼跳检测、健康检查和客户端缓存等机制,提⾼系统的灵活性、可
伸缩性和可⽤性。
3. Eureka应用及高可用集群
3.1 搭建单例Eureka Server服务注册中心
lagou-service-resume 8080-----
lagou-service-autodeliver 8090----
lagou-cloud-eureka-server 8761----
基于
Maven
构建
SpringBoot
⼯程,在
SpringBoot
⼯程之上搭建
EurekaServer服务 (
lagou-cloud-eureka-server-8761)
lagou-parent
中引⼊
Spring Cloud
依赖
Spring Cloud
是⼀个综合的项⽬,下⾯有很多⼦项⽬,⽐如
eureka⼦项⽬(版本号
1.x.x
)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
当前⼯程
pom.xml
中引⼊依赖
<dependencies>
<!--Eureka server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
注意:在⽗⼯程的
pom
⽂件中⼿动引⼊
jaxb
的
jar
,因为
Jdk9
之后默认没有加载该模
块,
EurekaServer
使⽤到,所以需要⼿动导⼊,否则
EurekaServer
服务⽆法启动
⽗⼯程
pom.xml
<!--引⼊Jaxb,开始-->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency> <dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency> <dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency> <dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.2.10-b140310.1920</version>
</dependency> <dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!--引⼊Jaxb,结束-->
application.yml
#Eureka server服务端⼝
server:
port: 8761
spring:
application:
name: lagou-cloud-eureka-server # 应⽤名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
instance:
hostname: localhost
client:
service-url: # 客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka: false # ⾃⼰就是服务不需要注册⾃⼰
fetch-registry: false #⾃⼰就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
在SpringBoot
启动类上,使⽤
@EnableEurekaServer
声明当前项⽬为EurekaServer服务。
执⾏启动类
LagouCloudEurekaServerApplication
的
main
函数。
访问
http://127.0.0.1:8761
,如果看到如下⻚⾯(
Eureka注册中⼼后台),则表明
EurekaServer
发布成功。
3.2 搭建Eureka Server HA高可用集群
(
1
)修改本机
host
属性
由于是在个⼈计算机中进⾏测试很难模拟多主机的情况,
Eureka
配置
server集群时需要执⾏
host
地址。 所以需要修改个⼈电脑中
host
地址
127.0.0.1 LagouCloudEurekaServerA
127.0.0.1 LagouCloudEurekaServerB
(
2
)修改
lagou-cloud-eureka-server
⼯程中的
yml
配置⽂件
#指定应⽤名称
spring:
application:
name: lagou-cloud-eureka-server
---
#第⼀个profile,后期启动spring-boot项⽬时,可通过命令参数指定
spring:
profiles: LagouCloudEurekaServerA
server:
port: 8761
eureka:
instance:
hostname: LagouCloudEurekaServerA
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://LagouCloudEurekaServerB:8762/eureka
---
#第⼆个profile,后期启动spring-boot项⽬时,可通过命令参数指定
spring:
profiles: LagouCloudEurekaServerB
server:
port: 8762
eureka:
instance:
hostname: LagouCloudEurekaServerB
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://LagouCloudEurekaServerA:8761/eureka
说明
- 在⼀个实例中,把另外的实例作为了集群中的镜像节点,那么这个http://LagouCloudEurekaServerB:8762/eureka URL 中的 LagouCloudEurekaServerB 就要和其它个profifile 中的 eureka.instance.hostname 保持⼀致。
- register-with-eureka 和 fetch-registry 在单节点时设置为了 false, 因为只有⼀台 Eureka Server,并不需要⾃⼰注册⾃⼰,⽽现在有了集群,可以在集 群的其他节点中注册本服务
(
3
)启动两次该
SpringBoot
项⽬,分别使⽤两个不同的
profifiles
(
4
)
访问两个EurekaServer的管理台⻚⾯http://lagoucloudeurekaservera:8761/ 和http://lagoucloudeurekaserverb:8762/会发现注册中⼼ LAGOU-CLOUD-EUREKA-SERVER 已经有两个节点,并且 registered-replicas (相邻集群复制节点)中已经包含对⽅
3.3 微服务提供者—>注册到Eureka Server集群
1.⽗⼯程中引⼊
spring-cloud-commons
依赖
2.pom
⽂件引⼊坐标,添加
eureka client
的相关坐标
3.配置
application.yml
⽂件
在
application.yml
中添加
Eureka Server
⾼可⽤集群的地址及相关配置
eureka:
client:
serviceUrl: # eureka server的路径
defaultZone:http://lagoucloudeurekaservera:8761/eureka/,http://lagoucloudeurekaserverb:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写⼀台,因为各个 eureka server 可以同步注册表
instance:
#使⽤ip注册,否则会使⽤主机名注册了(此处考虑到对⽼版本的兼容,新版本经过实验都是ip)
prefer-ip-address: true
#⾃定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
instance-id: ${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}:@project.vers
ion@
经验:⾃定义实例显示格式,加上版本号,便于多版本管理
4.
启动类添加注解
5.启动类执⾏,在
Eureka Server
后台界⾯可以看到注册的服务实例
3.4 微服务消费者—>注册到Eureka Server集群
1.
pom
⽂件引⼊坐标,添加
eureka client
的相关坐标
2.
配置
application.yml
⽂件
server:
port: 8090
eureka:
client:
serviceUrl: # eureka server的路径
defaultZone:
http://lagoucloudeurekaservera:8761/eureka/,http://lagoucloudeur
ekaserverb:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写⼀台,因为各个 eureka server 可以同步注册表
instance:
#使⽤ip注册,否则会使⽤主机名注册了(此处考虑到对⽼版本的兼容,新版本经过实验都是ip)
prefer-ip-address: true
#⾃定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
instance-id: ${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}:@project.vers
ion@
spring:
application:
name: lagou-service-autodeliver
3.在启动类添加注解@EnableDiscoveryClient,开启服务发现