4、服务注册中心-Eureka

本文详细介绍了Spring Cloud Eureka在服务注册与发现中的应用,包括Eureka Server的搭建、Eureka Client的配置,以及如何将微服务注册到Eureka集群,实现高可用。此外,还提到了Eureka的自我保护机制和负载均衡配置。
摘要由CSDN通过智能技术生成

系列文章目录

1、父工程创建
2、支付模块构建和热部署
3、消费者订单模块
4、服务注册中心-Eureka
5、zookeeper没学习
6、服务注册中心-Consul
7、Eureka、Consul异同
8、服务调用-Ribbon
9、服务调用-OpenFeign

10、服务降级-Hystrix
11、服务降级-Hystrix(二)
12、服务熔断-Hystrix
13、服务网关-Gateway
14-17 在git上做配置中心,没有学习
17、请求链路跟踪-Sleuth
18、Spring Cloud Alibaba-Nacos注册中心与配置中心
19、Spring Cloud Alibaba-Nacos集群和持久化配置
20、Sentinel流控
21、Sentinel熔断降级、热点key限流
22、SentinelResource配置
23、Sentinel 服务熔断与持久化


1. 服务注册中心

  • Eureka
  • Zookeeper
  • Consul
  • Nacos

2. Eurake基础知识

Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。

在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)
在这里插入图片描述
Eureka的两个组件 Eureka Server和Eureka Client

2.1 Eureka Server

Eureka Server用来服务注册

各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

2.2 EurekaClient

EurekaClient通过注册中心进行访问

它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

3. Eurake服务端

3.1 新建模块

新建一个名为cloud-eureka-server7001的maven工程

3.2 更改pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2021</artifactId>
        <groupId>com.chzu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入commons模块 -->
        <dependency>
            <groupId>com.chzu</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

</project>

3.3 写YML

server:
  port: 7001

eureka:
  instance:
    #eurake服务端实例名称
    hostname: localhost
  client:
    #false表示不会向注册中心注册自己
    register-with-eureka: false
    #false 表示自己就是注册中心,职责是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置eurake server 交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.4 主启动类

package com.chzu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

4. 微服务8001注册到注册中心

cloud-provider-payment8001将注册进EurekaServer成为服务提供者,提供服务

修改cloud-provider-payment8001

4.1 修改POM

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

4.2 修改YML

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost7001/eureka

4.3 修改启动类

主启动类上添加 @EnableEurekaClient 注解

4.4 测试

启动cloud-eureka-server7001与cloud-provider-payment8001,访问http://localhost:7001
Instances currently registered with Eureka中显示服务的信息。
你可以在yml中配置服务的application

spring:
  application:
    name: cloud-payment-service

4.5 自我保护机制

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARELESSER THAN THRESHOLD AND HENCFT ARE NOT BEING EXPIRED JUST TO BE SAFE.
下面会讲怎样处理。

5. 微服务80注册到注册中心

cloud-consumer-order80将注册进EurekaServer成为服务的消费者

修改cloud-consumer-order80

5.1 修改POM

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

5.2 修改YML

spring:
  application:
    name: cloud-consumer-order80
    
eureka:
  client:
    #将自己注册进EurekaServer
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

5.3 修改启动类

主启动类上添加 @EnableEurekaClient 注解

5.4 测试

启动cloud-eureka-server7001、cloud-provider-payment8001和cloud-consumer-order80,访问http://localhost:7001
Instances currently registered with Eureka中显示服务的信息。

6. Eurake集群搭建

在这里插入图片描述
问题:微服务RPC远程服务调用最核心的是什么,如果只有一个注册中心,万一它出故障了,会导致整个为服务环境不可用。
高可用,实现eureka集群,负载均衡+故障容错

6.1 新建微模块

新建一个和cloud-eureka-server7001 相同的微服务cloud-eureka-server7002

6.2修改yml

cloud-eureka-server7002yml中的defaultone修改为http://localhost:7001/eureka/

server:
  port: 7002

eureka:
  instance:
    #eurake服务端实例名称
    hostname: eureka7002
  client:
    #false表示不会向注册中心注册自己
    register-with-eureka: false
    #false 表示自己就是注册中心,职责是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置eurake server 交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka/

cloud-eureka-server7001yml中的defaultone修改为http://localhost:7002/eureka/

server:
  port: 7001

eureka:
  instance:
    #eurake服务端实例名称
    hostname: eureka7001
  client:
    #false表示不会向注册中心注册自己
    register-with-eureka: false
    #false 表示自己就是注册中心,职责是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置eurake server 交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7002/eureka/

6.3 服务注册到注册中心

将服务8001微服务,服务80微注册到Eureka集群中
方法是在defaultZone中把两个eurekaServer的地址都写上

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order80

eureka:
  client:
    #将自己注册进EurekaServer
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka

7. 支付微服务集群配置

7.1 新建魔块

参考cloud-provicer-payment8001,新建cloud-provider-payment8002

7.2 流程

步骤 改POM、写YML、主启动、业务类

7.3 修改内容

修改微服务8001、8002的Controller,增加serverPort,因为8001、8002这两个微服务在注册中心的application是一样得,在调用cloud-payment-service时我希望能够知道我们调用的8001还是8002微服务。

    @Autowired
    private PaymentService service;

    @Value("${server.port}")
    private String serverPort;

    @PostMapping(value = "/create")
    public CommonResult create(@RequestBody Payment payment)
    {
        int result = service.create(payment);
        log.info("====插入结果====:"+result);

        if(result > 0)
        {
            return new CommonResult(200,"插入数据成功, serverPort: "+serverPort,result);
        }else{
            return new CommonResult(444,"插入数据失败",null);
        }
    }

7.4 测试

先将Eureka集群先启动,然后在启动其他微服务。这时候访问http://localhost/consumer/payment/get/2肯定是8001(这是废话…(。•ˇ‸ˇ•。)…,毕竟在order80微服务中的PAYMENT_URL是写死的)

负载均衡

  1. 将order80微服务Controller中的PAYMENT_URL改变
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";//微服务名称与EurekaServer中的相同
  1. 在order80的ApplicationContextConfig中配置负载均衡
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced//负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}
  1. 测试
    先启动EurekaServer集群在启动其他服务。
    访问http://localhost/consumer/payment/get/20,反复访问,端口号8001、8002交替出现。实现了负载均衡。
    效果图:
    在这里插入图片描述

8. Eureka中的细节完善

8.1 主机名称修改

修改后在EurekaServer的页面中可读性更高

eureka:
  instance:
    #修改主机名称
    instance-id: payment8002

8.2 访问信息ip显示修改

当鼠标移动到上一步修改的主机上时,页面左下角会显示ip地址

eureka:
  instance:
    #修改主机名称
    instance-id: payment8002
    #显示主机ip地址
    prefer-ip-address: true

9. 服务发现

通过服务发现可以获得的在EurekaServer上注册的服务的信息,如主机名称、端口号

9.1 修改payment8001的Controller

	@Resource
    private DiscoveryClient discoveryClient;
    
     @GetMapping(value = "/discovery")
    public Object discovery()
    {
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element: "+element);
        }

        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }

        return this.discoveryClient;
    }

9.2 修改payment8001的主启动类

//在主启动类上添加注解
@EnableDiscoveryClient

9.3 测试

访问http://localhost:8001/payment/discovery
可以发现输出的内容就是在注册中心中注册的“CLOUD-PAYMENT-SERVICE”的信息

10. Eureka自我保护知识

10.1 Eureka 保护模式

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THANTHRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUSTTO BE SAFE

进入保护模式后,eureka会尝试保护其服务注册表中的信息,不在删除服务注册表中的数据,也就是不会注销任何微服务( 某时刻一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务信息进行保存,属于CAP里面的AP )

10.2 如何禁止自我保护

  • 服务端
eureka:  
    server:    
#关闭自我保护模式    
        enable-self-preservation: false    
#清理间隔    
        eviction-interval-timer-in-ms: 2000
  • 客户端
eureka:
    instance:  
    #eureka 客户端向服务端发送心跳时间间隔单位为秒  
    lease-renewal-interval-in-seconds: 1  
    #服务上限,服务端收到最后一次心跳时间后两秒后若收不到心跳就剔除服务  
    lease-expiration-duration-in-seconds: 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值