一、Eureka是什么?
Eureka是Netflix开发的服务发现框架,集成在其子项目spring-cloud-netflix中,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。
Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。
三大角色:
Eureka server:提供服务者。
service provider:服务生产方,将自身服务注册到eureka中,从而使服务消费方能够找到。
service consumer:服务消费者,eureka中获取注册服务列表,从而找到消费服务。
Eureka包含两个组件: Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka属于CAP中AP
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错)
在分布式系统中都绕不开CAP理论,一个分布式系统最多只能同时满足这三项中的两项。
CAP理论关注粒度是数据,而不是整体系统设计的策略。
什么是AP架构
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。结论:违背了一致性C的要求,只满足可用性和分区容错,即AP。
二、什么是服务注册和发现
Eureka采用了C/S的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Sever并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用.
RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))。
Eureka系统框架:
三、什么是服务治理
服务治理是主要针对分布式服务框架的微服务,处理服务调用之间的关系、服务发布和发现、故障监控与处理,服务的参数配置、服务降级和熔断、服务使用率监控、实现服务发现与注册等。
为什么需要服务治理:
过多的服务URL配置困难。
负载均衡分配节点压力过大的情况下,需要部署集群。
服务依赖混乱,启动顺序不清晰。
过多服务,导致性能指标分析难度较大,需要监控。
故障定位与排查难度较大。
四、Eureka单机构建
注意在复制粘贴配置文件的时候配置前后的空格和缩进
注册中心
注册中心端口7001
1.在pom.xml文件中添加eureka server依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.在application.yml添加配置
server:
port: 7001 #端口
# 单机版
eureka:
instance:
hostname: localhost #eureka服务端的实例名字 单机服务名称
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机服务地址
3.需要在启动类上添加 @EnableEurekaServer 注解
4.然后启动,访问 http://localhost:7001 会出现如下界面。出现就说明启动成功。
服务提供者
服务提供者端口8001
1.在pom.xml文件中添加eureka client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在application.yml添加配置
server:
port: 8001 #端口
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka #单机版
instance:
instance-id: cloud-provider-payment8001
prefer-ip-address: true #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip
3,.需要在启动类上添加**@EnableEurekaClient**注解
服务消费者
消费者端口80
1.在pom.xml文件中添加依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.application.yml文件中添加配置
server:
port: 80
spring:
application:
name: cloud-order- service
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
instance:
instance-id: cloud-consumer-order80
prefer-ip-address: true #访问路径可以显示IP地址
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka #单机版
3.创建RestTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.先将注册中心启动,在启动服务提供者,启动成功后访问会看见注册中心所有服务的信息。
5.创建测试类,使用RestTemplate进行测试
public class OrderController {
//单机情况下,直接ip加地址
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
}
6.浏览器访问http://localhost/consumer/payment/get/32。
五、Eureka集群构建
微服务RPC远程服务调用最核心的是什么?
高可用,试想你的注册中心只有一个only one,它出故障了那就没得玩了,会导致整个为服务环境不可用,所以搭建Eureka注册中心集群,实现负载均衡+故障容错。
环境搭建,注册中心2个,访问提供者2个。
注册中心
注册中心端口为7001和7002
1.对应模块添加对应依赖
在7001和7002的pom.xml模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.在application.yml文件中编写配置
两个注册中心的配置都差不多,区别就是端口、hostname、defaultZone属性值不一样。
现在是模拟的是2台机器做在集群,如果是三台,就需要在defaultZone修改,让三台机器相互注册。
如添加了一台机器(7003),那7001的defaultZone就应该是:defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka,注册中心之间用</font color=red>逗号分割。
7001:
server:
port: 7001
#集群版
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/ #这个是集群版开启 互相注册
7002:
server:
port: 7002
#集群版
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
添加本地映射
找到C:\Windows\System32\drivers\etc路径下的hosts文件
如果没有hosts文件,看 这篇文章。
在hosts文件中添加如下配置,如果添加了机器,然后将配置添加到文件即可。
然后启动注册中心7001和7002。访问http://localhost:7001/、http://localhost:7002/、http://eureka7001.com:7001/、http://eureka7002.com:7002/都成功,说明注册中心集群搭建成功。
服务提供者
服务提供端口为8001和8002
1.在8001和8002的pom.xml模块添加依赖
在8001和8002的pom.xml模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在application.yml文件中编写配置
注意:这里的服务提供者是搭建的集群,如果提供者不需要集群,则删除(8001或8002)其中一个即可
8001:
server:
port: 8001
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: cloud-provider-payment8001
prefer-ip-address: true #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip
8002:
server:
port: 8002
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: cloud-provider-payment8002
prefer-ip-address: true #访问路径可以显示IP地址
如果注册中心添加了机器,那在对应的defaultZone添加机器地址即可。
如添加了一台机器(8003),服务之间用逗号隔开,defaultZone属性值为:defaultZone: http://eureka8001.com:8001/eureka,http://eureka8002.com:8002/eureka,http://eureka8003.com:8003/eureka
服务消费者
消费者端口80
1.在pom.xml文件中添加依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.application.yml文件中添加配置
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
instance:
instance-id: cloud-consumer-order80
prefer-ip-address: true #访问路径可以显示IP地址
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
3.创建RestTemplate
@Configuration
public class ApplicationContextConfig {
// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,
// 需要在配置文件配置之后,代码中才可以依赖注入
// 当前文件就是spring的配置文件
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.先将注册中心启动,在启动服务提供者,启动成功后访问会看见注册中心所有服务的信息。
5.创建测试类,使用RestTemplate进行测试
public class OrderController {
//单机情况下,直接ip加地址
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
}
6.浏览器访问http://localhost/consumer/payment/get/32,多刷新几次,可以看见serverPort在变化说明集群搭建成功。