4.1 Eureka的概念
4.1.1 什么是Eureka
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
4.1.2 Eureka的用途
Eureka相当于一个服务注册和发现的中心,Eureka的客户端连接到Eureka的服务端并通过心跳包保持连接,服务端就可以通过这种方式来判断各个微服务是否正常运行,并且能够动态的将非正常运行的微服务实例节点移出。
4.2 Eureka单机模式构建
4.2.1 IDEA生成EurekaServer端服务注册中心
4.2.1.1 新建模块
新建一个Module:Cloud-Eureka-Server-7001,包含 Eureka Server服务
4.2.1.2 application.yml中进行配置
server:
port: 7001
spring:
application:
name: cloud-eureka-server-7001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 不向注册中心注册自己(本身是服务端)
fetch-registry: false
service-url:
# 设置 Eureka Server交互地址 (查询服务和注册服务都要依赖这个地址)
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.2.1.3 在SpringBoot启动类中添加注解
添加 @EnableEurekaServer
注解
4.2.1.4 访问Eureka的Web面板
通过访问 http://localhost:7001/ 即可查看Eureka当前状态
4.2.2 Cloud-Provider-Payment-8001微服务注册进入Eureka
4.2.2.1 在Payment微服务的pom.xml中添加dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
4.2.2.2 添加相关配置文件至application.yml
eureka:
client:
register-with-eureka: true # 向注册中心注册自己(本身是客户端)
fetch-registry: true # 抓取已有的注册信息
service-url:
# 设置 Eureka Server交互地址 (查询服务和注册服务都要依赖这个地址)
defaultZone: http://localhost:7001/eureka/
4.2.2.3 添加@EnableEurekaClient注解
4.2.3 Cloud-Consumer-Order-80微服务注册进入Eureka
与4.2.2步骤类似^_^
4.3 Eureka集群环境部署
4.3.1 Eureka集群原理
Eureka集群依据”互相注册“原理,所有集群中的单节点相互注册,相互守望,对外是作为一个整体。
4.3.2 Eureka Server 集群部署记录
-
先按照单机版的环境Cloud-Eureka-Server-7001,新建Cloud-Eureka-Server-7002模块
-
本地hosts修改
127.0.0.1 eureka7001.test # 7001服务端 127.0.0.1 eureka7002.test # 7002服务端
-
7001、7002 的 application.yml修改
eureka: instance: hostname: eureka7001.test client: register-with-eureka: false # 不向注册中心注册自己(本身是服务端) fetch-registry: false service-url: # 设置 Eureka Server交互地址 (查询服务和注册服务都要依赖这个地址) defaultZone: http://eureka7002.test:7002/eureka/
eureka: instance: hostname: eureka7002.test client: register-with-eureka: false # 不向注册中心注册自己(本身是服务端) fetch-registry: false service-url: # 设置 Eureka Server交互地址 (查询服务和注册服务都要依赖这个地址) defaultZone: http://eureka7001.test:7001/eureka/
-
分别启动两个 Cloud-Eureka-Server 即可
4.4 微服务使用Eureka集群注册与发现
4.4.1 微服务注册进入Eureka集群
只需要修改微服务对应的 Application.yml即可
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true # 向注册中心注册自己(本身是客户端)
fetch-registry: true # 抓取已有的注册信息
service-url:
# 设置 Eureka Server交互地址 (查询服务和注册服务都要依赖这个地址)
defaultZone: http://eureka7001.test:7001/eureka/,http://eureka7002.test:7002/eureka/
4.4.2 Cloud-Provider-Payment微服务提供者集群搭建
4.4.2.1 微服务提供者集群部署
基于Cloud-Provider-Payment-8001,搭建Cloud-Provider-Payment-8002微服务
4.4.2.2 Cloud-Consumer-Order-80微服务消费者重构
-
修改 Cloud-Consumer-Order-80 中 Controller 之前固定写的PAYMENT_URL
private static final String PAYMENT_URL = "http://localhost:8001";
替换为
private static final String PAYMENT_URL = "http://cloud-payment-service";
-
RestTemplate开启@LoadBalanced注解,负载均衡支持
-
再次访问Order的相关API,可以发现已经成功实现了负载均衡!
4.5 Actuator微服务信息完善
Application.yml添加如下配置
instance:
instance-id: payment8001
prefer-ip-address: true
4.6 Eureka Discovery 服务发现
在Payment服务中使用Discovery Client的示例
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
services.forEach(x -> log.info("Service: " + x));
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
instances.forEach(x -> log.info(
"Instance: " + x.getInstanceId() + "," + x.getHost() + "," + x.getPort() + "," + x.getUri()
));
return this.discoveryClient;
}
4.7 Eureka 自我保护机制
Eureka的自我保护特性主要用于减少在网络分区或者不稳定状况下的不一致性问题。
Eureka在运行期间会统计心跳失败的比例,在15分钟内是否低于85%,如果出现了低于的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务。
5. ZooKeeper\Consul等注册中心
配置方式与Eureka大同小异
文章评论