什么是服务治理?
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册与发现?
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Sever并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息上比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka提供服务的注册和发现,Eureka有Eureka Server和Eureka Client,每一个Eureka Client启动时会向Eureka Server注册自己的信息。对于Eureka Client分为提供者和消费者,提供者根据Eureka Server服务列表来取消费者信息。Eureka Client会定期向Eureka Server发送心跳,Eureka Server根据心跳判断服务是否断开。 Eureka默认情况下是开始自我保护模式,就是在一定的时间内虽然eureka client没有发送心跳信息,但是eureka server不会注销该实例,以防可以是网络分区故障发生的情况。
Eureka Server和Eureka Client
Eureka Server提供服务注册服务:各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问:是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
创建cloud-eureka-server7001
Pom文件填入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.yaml?
server:
port: 7001
eureka:
?#eureka实例
instance:
? hostname: localhost
?#eureka server本省也是一个client,如果是集群的话,所以这里需要进行client的配置
client:
? ?#这里表示不将该server端注册进注册中心
? register-with-eureka: false
? ?#这里表示不需要取检索服务,因为本身是注册中心,但是对于集群是可以设置的
? fetch-registry: false
? ?#表示用户可以查看注册中的地址或者其他服务注册进入的地址,这个地址可以是多个
? service-url:
? ? defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
主启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
? ?public static void main(String[] args) {
? ? ? ?SpringApplication.run(EurekaMain7001.class,args);
? }
}
@EnableEurekaServer标注是server端。
测试
添加pom文件
<dependency>
? ?<groupId>org.springframework.cloud</groupId>
? ?<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yaml
eureka:
client:
? ?#是否从Eurekaserver抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
? fetch-registry: true
? ?#是否注册自己
? register-with-eureka: true
? service-url:
? ? defaultZone: http://localhost:7001/eureka
主启动类
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
? ?public static void main(String[] args) {
? ? ? ?SpringApplication.run(PaymentMain8001.class,args);
? }
}
测试
添加pom文件
<dependency>
? ?<groupId>org.springframework.cloud</groupId>
? ?<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yaml
eureka:
client:
? ?#是否从Eurekaserver抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
? fetch-registry: true
? ?#是否注册自己
? register-with-eureka: true
? service-url:
? ? defaultZone: http://localhost:7001/eureka
主启动类
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
? ?public static void main(String[] args) {
? ? ? ?SpringApplication.run(OrderMain80.class,args);
? }
}
测试
Eureka集群原理说明 Eureka集群防止单点故障,实现高可用,Eureka集群能实现负载均衡+故障容错。Eureka集群就是Eureka Server相互注册,相互守望。
EurekaServer集群环境构建步骤 1.根据cloud-eureka-server7001构建一个cloud-eureka-server7002项目,作为第二个Eureka Server。 2.修改C:\Windows\System32\drivers\etc\hosts文件
3.cloud-eureka-server7001的yaml文件和cloud-eureka-server7002的yaml文件
server:
port: 7001
eureka:
?#eureka实例
instance:
? hostname: eureka7001.com
?#eureka server本省也是一个client,如果是集群的话,所以这里需要进行client的配置
client:
? ?#这里表示不将该server端注册进注册中心
? register-with-eureka: false
? ?#这里表示不需要取检索服务,因为本身是注册中心,但是对于集群是可以设置的
? fetch-registry: false
? ?#表示用户可以查看注册中的地址或者其他服务注册进入的地址,这个地址可以是多个
? service-url:
? ? defaultZone: http://eureka7002.com:7002/eureka/
server:
port: 7002
?
eureka:
?#eureka实例
instance:
? hostname: eureka7002.com
?#eureka server本省也是一个client,如果是集群的话,所以这里需要进行client的配置
client:
? ?#这里表示不将该server端注册进注册中心
? register-with-eureka: false
? ?#这里表示不需要取检索服务,因为本身是注册中心,但是对于集群是可以设置的
? fetch-registry: false
? ?#表示用户可以查看注册中的地址或者其他服务注册进入的地址,这个地址可以是多个
? service-url:
? ? defaultZone: http://eureka7001.com:7001/eureka/
4.测试
cloud-provider-payment8001和cloud-consumer-order80加入集群
1.修改eureka下面的defaultZone配置
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
2.测试
创建cloud-provider-payment8002并加入集群
1.cloud-provider-payment8002出端口以外,其他与cloud-provider-payment8001一样。
2.修改cloud-provider-payment8001/8002,使其显示端口号
@Value("${server.port}")
private String serverPort;
3.测试
但是:
4.解决办法,修改cloud-consumer-order80项目的controller层
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
新问题(不开启负载均衡):
5.配置负载均衡
@Configuration
public class ApplicationContextConfig {
?
? ?@Bean
? ?@LoadBalanced
? ?public RestTemplate getRestTemplate(){
? ? ? ?return new RestTemplate();
? }
? ?
}
@LoadBalanced开启负载均衡。
测试:
actuator完善需要jar:
<dependency>
? ?<groupId>org.springframework.boot</groupId>
? ?<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
主机名称:服务名称修改
eureka:
instance:
? instance-id: payment8001
访问信息有IP信息提示
eureka:
instance:
? instance-id: order80
? prefer-ip-address: true
测试:
服务发现就是对于注册到eureka的信息进行服务信息获取,查看。
操作:修改cloud-provider-payment8001端口
controller层:
@Resource
private DiscoveryClient discoveryClient;
?
@GetMapping(value = "/payment/discovery")
public Object getDiscovery(){
List<String> services=discoveryClient.getServices();
for (String service : services) {
log.info("*******element:"+service);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getInstanceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
主启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
? ?public static void main(String[] args) {
? ? ? ?SpringApplication.run(PaymentMain8001.class,args);
? }
}
@EnableDiscoveryClient用于服务发现。
测试:
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。 ? Eureka自动开启自我保护机制,一旦有服务宕机或者断开,Eureka注册中心不会立即将该服务注销。
**什么是自我保护模式**:默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。综上,**自我保护模式是一种应对网络异常的安全保护措施**。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
怎么禁止自我保护
修改cloud-eureka-server7001的yaml文件:
eureka:
server:
? ?#默认保护机制
? enable-self-preservation: false
? ?#时间间隔2s
? eviction-interval-timer-in-ms: 2000
修改cloud-provider-payment8001的yaml文件:
eureka:
instance:
? instance-id: payment8001
? prefer-ip-address: true
? ?#发送心跳默认30s,设置1s
? lease-renewal-interval-in-seconds: 1
? ?#最后一次心跳等待时间超越系统默认是90s,设置2s
? lease-expiration-duration-in-seconds: 2
测试:(打开8001进行连接,最后断开8001服务,查看eureka server界面)
Eureka停更
官网:Eureka 2.0 (Discontinued)