服务注册中心-Eureka
1、Eureka概述
Eureka是以前Spring Cloud官方推荐的基于AP原则设计的服务注册中心、在高可用方面更具优势、其有服务端和客户端区分、均可以做集群。
客户端模块启动后向服务端注册、并通过心跳机制维持连接、服务端负责维护者一个注册表、存储所有可用的服务节点信息、在一定时间内没有收到客户端的心跳时、则会将该节点信息注销掉。另外服务端默认开启自我保护机制、防止网络波动等异常对服务的影响。
下面我将从以下几个模块来介绍Eureka的使用:
2、环境准备、简单的生产消费者模型、
3、增加Eureka模块、搭建简单的单机版服务生产消费模型
4、Eureka服务端和客户端集群搭建
5、Eureka的常用配置和注意事项
6、其他热门的注册中心
7、注意事项、常见大坑
2、环境准备
搭建一个Maven聚合工程、在父工程POM文件中打包方式为POM、锁定常用依赖的版本信息和其他共用配置。
新建一个生产者子模块、模块名:cloud-provider-user-8001、添加Spring Boot核心依赖、配置yml端口、启动类标注@SpringBootApplication注解、编写一个简单的Controller类和一个简单的方法映射供前端访问、如@GetMapping(value = " /provider/{id} ")。
新建一个消费者模块、模块名:cloud-consumer-user-80、添加Spring Boot核心依赖、配置yml端口、启动类标注@SpringBootApplication注解、编写一个简单的Controller类和一个简单的方法映射供前端访问、如@GetMapping(value = " /consumer/provider/{id} ")。比生产者多了一层consumer路径。
接着我们可以在消费者通过Spring提供给我们的 RestTemplate 来通过IP地址+端口+请求路径实现远程访问生产者的方法、如getForObject等方法并传入目标url和其他参数、
测试:访问localhost:8001/provider/1和localhost:80/consumer/provider/1、完成准备工作
3、整合Eureka
我们需要单独一个模块来搭建Eureka服务端、启动后等待Eureka客户端的注册、
首先新建一个模块、模块名:cloud-eureka-server-7001、
3.1、Eureka服务端搭建
3.1.1、POM配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.1.2、YML配置
server:
port: 7001
eureka:
instance:
#eureka服务端的实例名称、在C:\Windows\System32\drivers\etc\hosts做域名映射
hostname: eureka7001.com
client:
#Eureka服务端的标配、表示不注册自己和不抓取服务列表。
register-with-eureka: false
fetch-registry: false
service-url:
#配置与客户端交互地址
defaultZone: http://eureka7001.com:7001/eureka/
3.1.3、启动类配置
加上@EnableEurekaServer注解表明当前为Eureka服务端。
至此、Eureka服务端搭建完成。
3.2、消费者和生产者模块修改
它们的修改都是相同的、修改步骤还是、新增依赖、新增YML配置、新增启动类注解
3.2.1、POM文件新增
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2.2、YML新增
eureka:
client:
#客户端标配、表示向服务端注册自己和向服务都抓取服务
register-with-eureka: true
fetchRegistry: true
#服务端的交互地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka
3.2.3、启动类配置
加上@EnableDiscoveryClient或者@EnableEurekaClient注解
推荐使用@EnableDiscoveryClient、因为他的适用面比后者更广。
至此我们的Eureka客户端就搭建完成了、我们可以通过RestTemplate来以IP地址+服务名称+请求URI来访问远程生产者服务了。但前提是在RestTemplate Bean的创建方法上加上@LoadBalanced、如下所示:
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
4、集群搭建
4.1、服务端集群搭建
Eureka服务端集群其实是Eureka服务端相互注册的配置、我向你注册、你也向我注册。我们只需要将 cloud-eureka-server-7001模块复制一份、然后修改YML配置即可、比如新建一个cloud-eureka-server-7002模块、POM文件和启动类与7001同、下面我们来看看YML文件的不同、
eureka:
instance:
#eureka服务端的实例名称、在C:\Windows\System32\drivers\etc\hosts做域名映射
hostname: eureka7001.com
client:
#Eureka服务端的标配、表示不注册自己和不抓取服务列表。
register-with-eureka: false
fetch-registry: false
service-url:
#单机就是提供7001自己的交互地址
# defaultZone: http://eureka7001.com:7001/eureka/
**#集群指向其它Eureka服务端的交互地址、如果有多个、则用逗号隔开。
#这里7001服务端向7002服务端注册自己
defaultZone: http://eureka7002.com:7002/eureka/**
如果有看Spring Cloud微服务入门、实战和进阶的同学、不推荐使用书上提供的集群搭建方法、那样会新增很多的配置文件和代码。。。。
4.2、客户端集群搭建
服务端集群搭建后、就有多个注册中心、仅仅它们的端口并不相同、就像一个街上有了多个劳务中介、用人公司只在一个中介那注册可能会招聘效率低下、劳动者只在一个中介那注册也容易错误心仪的工作岗位、所以客户端的集群搭建便是将该服务注册到所有的Eureka服务端。
这里也仅仅需要更改YML配置、如下所示:
eureka:
client:
register-with-eureka: true #向Eureka注册自己
fetchRegistry: true #向Eureka抓取服务
#向多个服务端注册时、中间仅需逗号隔开。
**service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka**
5、Eureka常用配置
5.1采用IP注册实例并自定实例格式
5.1.1、YML配置
eureka:
instance:
#开启采用ip注册
prefer-ip-address: true
#在这里定义实例名
instance-id: payment8001
5.1.2、区别如下
如图所示、通过向Eureka注册两个服务、在Eureka管理界面就能在Status栏目下看到2个实例名、左边采用默认实例注册、实例名为ip地址+服务名+端口形式、右边采用Ip注册、实例名为我们所定义的那样、隐藏了ip和端口信息。
5.2、关闭自我保护
在测试学习阶段、自我保护机制会影响我们对配置结果的判断、所以建议学习阶段关闭自我保护、在项目上线运行期间、自我保护机制对维护服务的可用性和防止网络波动等异常有着很大的作用
eureka.server.enableSelfPreservation=false
另外还能配置心跳周期等数值。
5.3、自定义实例跳转列表
当我们点击某个服务名下的实例名时、会访问IP+Port/info请求、这个请求我们默认是没有配置的、所以会404、我们可以通过在YML内定义该实例的一些初始属性、来让运维人员对该实例的一些信息进行了解。
#配置当前服务实例的info信息
info:
app.name: eureka-provide-8001
company.name: www.laoyang.com
build.artifactId: spring-cloud-eureka-provide-9001
build.version: 0.0.1
5.4、其他拓展
元数据、健康检查、服务监控等、拓展知识、课后了解
6、其他注册中心
目前Eureka版本已经停止维护、未来如何尚不可知、但幸运的是、目前流行着很多可供服务注册的框架、如Zookeeper、Consul、
7、注意事项、常见大坑
服务名不可使用下划线、建议使用短横杠、否则ZK将无法解析、Eureka应该同理、