欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

程序员文章站 2022-03-14 09:48:53
...

Spring Cloud 微服务

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

版本选择

Spring Cloud 与 Spring Boot 需要选择匹配的版本;

https://start.spring.io/actuator/info

具体可参考官网:https://spring.io/

此次我们选择的版本是,spring boot 2.3.3.RELEASE + spring cloud Hoxton.SR8

示例:

父工程依赖:

我们可以将通用的 jar 包在父 pom 中声明并指定版本号。这样做的好处就是:如果有多个子项目都引用同一个依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层的父容器里更新,而不需要一个一个子项目的修改;另外如果某个子项目需要另外的一个版本,只需要在自己的 pom 中声明 version 即可。

注意:

  • dependencyManagement 里只是声明依赖,并不会实现引入,因此子项目需要显示的声明所需要的依赖。
  • 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖,并且没有指定具体版本,才会从父项目中继承该项,并且 versionscope 都读取自父pom。
  • 如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。
<!-- 统一管理jar包版本 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.boot.version>2.3.3.RELEASE</spring.boot.version>
    <spring.cloud.version>Hoxton.SR8</spring.cloud.version>

    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.18.12</lombok.version>
    <mysql.version>8.0.19</mysql.version>
    <druid.version>1.1.10</druid.version>
    <mybatis.plus.version>3.3.2</mybatis.plus.version>
</properties>

<!-- 子模块继承后,提供作用:锁定版本 + 子modlue 不用写groupId 和 version -->
<dependencyManagement>
    <dependencies>
        <!--spring boot 2.3.3.RELEASE-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud Hoxton.SR8-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

服务注册与发现

Spring Cloud 入门 — Eureka 服务注册中心

简介

在微服务架构中往往会有一个注册中心,当服务器启动的时候,每个微服务都会把当前自己服务的信息,比如【服务Ip地址,端口等】以别名的方式注册到注册中心上。注册中心维护着服务别名与服务实例的对应关系【一个服务别名下可能有多个实例】,当有的服务需要调用其他服务时,可以以别名的方式去注册中心获取到服务实例【服务的实际地址:ip+port】,然后再实现本地 RPC 调用 RPC 远程调用框架。

Spring Cloud Netflix Eureka是Spring Cloud Netflix子项目的核心组件之一,主要用于微服务架构中的服务治理。Eureka包含两个组件:Eureka Server 和 Eureka Client

  • Eureka Server 提供服务注册服务

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

  • Eureka Client 通过注册中心进行访问

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

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Eureka注册中心模块
创建注册中心模块
  • 引入 pom 依赖

    <!--引入Eureka server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 添加 application.yml 配置

    server:
      port: 7001
      
    spring:
      application:
      	# 指定服务名称
        name: eureka-registery
    
    eureka:
      instance:
        #eureka 服务端的实例名称
        hostname: localhost
      client:
        #表示不向注册中心注册自己
        register-with-eureka: false
        #false 表示自己端就是注册中心 职责是维护服务实例 并不需要检索服务
        fetch-registry: false
        service-url:
          # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
          defaultZone: http://localhost:7001/eureka
    
  • 主启动:添加@EnableEurekaServer注解来启用Euerka注册中心功能

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

使用 IDEA【2020.2】 的 Run Dashboard来运行SpringCloud应用

  • 快捷键 Alt + 8 或 View --> Tool Windows —> Services

  • 或者将以下这段配置考入到 .idea 目录下的 workspace.xml 中

    <component name="RunDashboard">
        <option name="configurationTypes">
            <set>
                <option value="Application" />
                <option value="SpringBootApplicationConfigurationType" />
            </set>
        </option>
    </component>
    

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

启动服务,显示如下图:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

访问服务;如我的:http://localhost:7001/ ,可以看到注册中心已经创建成功

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

集群
  • 修改配置

在生产环境中为了实现高可用,一般注册中心都是采用集群搭建的;如果是单机的,一旦注册中心出了点问题会影响整个应用系统。所有我们需要搭建注册中心集群【下面演示搭建两个注册中心,实际生产中最好大于3个节点】。

修改 原有注册中心 application.yml 配置名为 application-one.yml 并复制一份修改名称为 application-two.yml,如下图:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

修改 yml 配置文件内容

application-one.yml

server:
  port: 7001

spring:
  # 指定服务名称
  application:
    name: eureka-registery

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

application-two.yml

server:
  port: 7002

spring:
  # 指定服务名称
  application:
    name: eureka-registery

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

这里我们通过两个注册中心互相注册,搭建了注册中心的双节点集群,由于 defaultZone 使用了域名,所以还需在本机的host文件中配置一下【如果有多个节点,则 defaultZone 中需要配置除了自己外的其它所有节点,中间用 “,” 号分隔,如:http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka,http://eureka7004.com:7004/eureka 这个是配置 eureka7001.com 且节点为4个时的配置】。

修改本地 host 文件,目录为 C:\Windows\System32\drivers\etc ,首先修改文件的属性去掉只读的勾选,在编辑 host 文件,添加如下配置:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】
.Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

修改完成后,记住将 host 文件属性再改为只读,防止被修改;以上的配置主要作用是:当访问 eureka7001.com 与 eureka7002.com 会被代理到 127.0.0.1 的IP地址【也就是本地】。

  • 启动服务

在 idea 中我们可以通过 copy 服务并指定 配置文件来将同一个应用启动为两个服务,具体如下:

  • 修改原有的服务,并指定运行的配置文件【主要只要填写 application- 后面的就行了】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

  • copy 修改后的服务,并修改名称 与 运行的配置文件

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

  • 然后启动这两个服务,如下图

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

  • 浏览器访问【鼠标点击显示的端口即可(7001、7002)】,出现如下图结果,则配置成功;其中 DS Replicas 为集群中其它的节点。

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】
Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Eureka服务提供者模块
创建服务提供者模块
  • 引入 pom 依赖

    <!-- 引入 eureka client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 添加 application.yml 配置

    server:
      port: 8001
    spring:
      application:
        name: payment-provider
    
    eureka:
      client:
        #表示是否将自己注册进 Eureka Server服务 默认为true
        register-with-eureka: true
        #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url: # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
          #单机
          #      defaultZone: http://localhost:7001/eureka  
          #集群
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka 
      instance:
        instance-id: payment8001
        ## 当调用getHostname获取实例的hostname时,返回ip而不是host名
        prefer-ip-address: true
    
    
    
  • 主启动:添加@EnableDiscoveryClient注解表明是一个Eureka客户端

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class PaymentProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(PaymentProviderApplication.class, args);
        }
    }
    
  • 业务类

    为了方便测试,我们这里就不写 service dao 层了,直接模拟几条数据。

    @RestController
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        public static HashMap<Long, Payment> hashMap = new HashMap<>();
        static {
            hashMap.put(1L, new Payment(1L, "link-bd6fb5d9fc03459e885dfc2f4f74c239"));
            hashMap.put(2L, new Payment(2L, "link-a588ec6a216f43baa573feb64e0d0dc4"));
            hashMap.put(3L, new Payment(3L, "link-2f9342d7eb8940269bd9e2260cff227d"));
        }
    
        @GetMapping("/paymentSQL/{id}")
        public CommonResult<Payment> paymentSql(@PathVariable("id") Long id) {
            Payment payment = hashMap.get(id);
            CommonResult<Payment> result = new CommonResult(200,"form myql serverPort: "+serverPort, payment);
            return result;
        }
    }
    
    
测试

启动服务,刷新注册中心即可看到该服务已经注册到了 注册中心中

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

此时我们访问 http://localhost:8001/paymentSQL/1 ,结果如下:可以看到能够正常访问

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

集群

为了查看到负载均衡【默认轮询】的效果我们需要集群 服务提供者,和集群注册中心的方法类似:

修改 原有服务提供者 application.yml 配置名为 application-one.yml 并复制一份修改名称为 application-two.yml,具体配置如下:

application-one.yml

server:
  port: 8001
spring:
  application:
    name: payment-provider


eureka:
  client:
    #表示是否将自己注册进 Eureka Server服务 默认为true
    register-with-eureka: true
    #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url: # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8001
    ## 当调用getHostname获取实例的hostname时,返回ip而不是host名
    prefer-ip-address: true

application-two.yml

server:
  port: 8002
spring:
  application:
    name: payment-provider


eureka:
  client:
    #表示是否将自己注册进 Eureka Server服务 默认为true
    register-with-eureka: true
    #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url: # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
  	# 自定义节点名称
    instance-id: payment8002
    ## 当调用getHostname获取实例的hostname时,返回ip而不是host名
    prefer-ip-address: true

修改原有的服务,并指定运行的配置文件

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

copy 修改后的服务,并修改名称 与 运行的配置文件

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

启动这两个服务提供者,在 Eureka Server 即可看到服务注册信息,如下图:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

测试:访问 http://localhost:8001/paymentSQL/1 与 http://localhost:8002/paymentSQL/1 可以看到访问正常。

[Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Eureka服务消费者模块
创建消费者模块
  • 引入 pom 依赖

    <!-- 引入 eureka client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 添加 application.yml 配置文件

    server:
      port: 80
    spring:
      application:
        name: order-consumer
    
    eureka:
      client:
        #表示是否将自己注册进 Eureka Server服务 默认为true
        register-with-eureka: true
        #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      instance:
        instance-id: order80
        prefer-ip-address: true
    
  • 主启动

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class OrderConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderConsumerApplication.class, args);
        }
    }
    
  • 添加配置类注入RestTemplate 并指定负载均衡规则【默认轮询】

    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        @LoadBalanced  //赋予默认的负载均衡规则
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
  • 业务类

    @RestController
    @Slf4j
    public class OrderController {
    
        /**
         * payment-provider:服务别名
         */
        public static final String PAYMENT_URL = "http://PAYMENT-PROVIDER";
    
        @Resource
        private RestTemplate restTemplate;
    
    
        @GetMapping("/consumer/paymentSql/{id}")
        public CommonResult getPayment(@PathVariable("id") Long id){
            return restTemplate.getForObject(PAYMENT_URL + "/paymentSQL/" + id, CommonResult.class);
        }
    
    }
    
测试

启动服务,我们可以看到服务已经注册到了 Eureka 注册中心中,如下图:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

访问:http://localhost/consumer/paymentSql/1 ,多访问几次,我们可以看到默认使用 轮询 的负载均衡策略,轮流的访问 8001 与 8002 服务,如下图:

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Eureka 的自我保护机制
概述

保护模式主要用于一组客户端和 Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server 将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。一句话:某时某刻一个微服务不可用了,Eureka 不会立即清理,依旧会对该微服务的信息进行保存。

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

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

为什么会产生 Eureka 自我保护机制?

为了防止 EurekaClient 可以正常运行,但是与 EurekaServer 网络不通的情况下,EurekaServer 不会立刻将 EurekaClient 服务剔除。

什么是自我保护模式?

默认情况下,如果 EurekaServer 在一定时间内没有接收到某个微服务实例的心跳,EurekaServer 将会注销实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与 EurekaServer 之间无法正常通信,以上行为可能变得非常危险了—因为微服务本身是健康的,此时本不应该注销这个服务。Eureka 通过 “自我保护模式” 来解决这个问题—当 EurekaServer 节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

自我保护机制:默认情况下 EurekaClient 会定时向 EurekaServer 端发送心跳包,如果 EurekaServer 在一定时间内(默认90秒)没有收到心跳包,就会注销服务;但是在在短时间内 (90秒) 内丢失大量服务实例的心跳时,Eureka 会开启自我保护机制,不会剔除服务;这种现象主要是为了应对 EurekaServer 网络不通时,接收不到 EurekaClient 客户端发送的心跳时的场景【即客户端正常,但是注册中心网络异常或网络波动大导致的通讯问题】;

它的设计哲学就是:宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。

综上:自我保护模式是一种应对网络异常的安全措施。它的架构哲学是宁可同时保留所有微服务(健康的服务和不健康的服务)也不盲目的注销任何健康的服务。使用自我保护模式,可以让 Eureka 集群更加的健壮、稳定。

关闭 Eureka 的自我保护机制

注册中心修改配置【注意两个都要改,这里给出了7001的示例】

eureka:
  instance:
    #eureka 服务端的实例名称
    hostname: eureka7001.com
  client:
    #表示不向注册中心注册自己
    register-with-eureka: false
    #false 表示自己端就是注册中心 职责是维护服务实例 并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      defaultZone: http://eureka7002.com:7002/eureka
  server:
    #关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    #剔除的间隔时间 单位毫秒(默认90秒)
    eviction-interval-timer-in-ms: 2000

服务提供者修改配置【注意两个都要改,这里给出了8001的示例】

eureka:
  client:
    #表示是否将自己注册进 Eureka Server服务 默认为true
    register-with-eureka: true
    #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url: # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8001
    ## 当调用getHostname获取实例的hostname时,返回ip而不是host名
    prefer-ip-address: true
   # Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
    lease-renewal-interval-in-seconds: 10
   # Eureka服务端在收到最后一次心跳后的等待时间上限,单位秒(默认90秒)
    lease-expiration-duration-in-seconds: 30

修改完成后,重启服务;出现如下提示,则自我保护机制关闭成功。

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】


给Eureka注册中心添加认证
修改注册中心

添加 pom 依赖

<!--security-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

修改 yml 配置【两个都要改】

application-one.yml

server:
  port: 7001

spring:
  # 指定服务名称
  application:
    name: eureka-registery
  security:
    # 配置spring security登录用户名和密码
    user:
      name: akieay
      password: 1qaz2wsx

eureka:
  instance:
    #eureka 服务端的实例名称
    hostname: eureka7001.com
  client:
    #表示不向注册中心注册自己
    register-with-eureka: false
    #false 表示自己端就是注册中心 职责是维护服务实例 并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7002.com:7002/eureka
  server:
    #关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    #剔除的间隔时间 单位毫秒(默认90秒)
    eviction-interval-timer-in-ms: 2000

application-two.yml

server:
  port: 7002

spring:
  # 指定服务名称
  application:
    name: eureka-registery
  security:
    # 配置spring security登录用户名和密码
    user:
      name: akieay
      password: 1qaz2wsx

eureka:
  instance:
    #eureka 服务端的实例名称
    hostname: eureka7002.com
  client:
    #表示不向注册中心注册自己
    register-with-eureka: false
    #false 表示自己端就是注册中心 职责是维护服务实例 并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7001.com:7001/eureka
  server:
    #关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    #剔除的间隔时间 单位毫秒(默认90秒)
    eviction-interval-timer-in-ms: 2000

添加配置文件 WebSecurityConfig 拦截所有的 /eureka/ 开头的请求

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/actuator/**").permitAll()
                .anyRequest()
                .authenticated().and().httpBasic();
    }
}

重启注册中心并访问,这时可以看到需要登录了。

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

修改 Eureka 客户端模块

由于注册中心添加了认证,这时注册服务需要添加用户名与密码认证才能将服务注册到 eureka 注册中心中,所以需要修改 Eureka 客户端【包含 服务提供者 和 服务消费者,因为它们都是 EurekaClien】。

配置文件中需要修改注册中心地址,格式为:

http:http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka

服务提供者修改 yml 配置【主要是修改 defaultZone,两个文件的改动都一样,这里给出其中一个 】

spring:
  application:
    name: payment-provider
  security:
    # 配置spring security登录用户名和密码
    user:
      name: akieay
      password: 1qaz2wsx

eureka:
  client:
    #表示是否将自己注册进 Eureka Server服务 默认为true
    register-with-eureka: true
    #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url: # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7001.com:7001/eureka,http://${spring.security.user.name}:${spring.security.user.password}@eureka7002.com:7002/eureka
  instance:
    instance-id: payment8001
    ## 当调用getHostname获取实例的hostname时,返回ip而不是host名
    prefer-ip-address: true
   # Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
    lease-renewal-interval-in-seconds: 10
   # Eureka服务端在收到最后一次心跳后的等待时间上限,单位秒(默认90秒)
    lease-expiration-duration-in-seconds: 30

服务消费者 yml 配置修改

spring:
  application:
    name: order-consumer
  security:
    # 配置spring security登录用户名和密码
    user:
      name: akieay
      password: 1qaz2wsx

eureka:
  client:
    #表示是否将自己注册进 Eureka Server服务 默认为true
    register-with-eureka: true
    #f是否从Eureka Server抓取已有的注册信息,默认是true。单点无所谓,集群必需设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 设置与 Eureka Server 交互的地址 查询服务与注册服务都需要这个地址
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7001.com:7001/eureka,http://${spring.security.user.name}:${spring.security.user.password}@eureka7002.com:7002/eureka
  instance:
    instance-id: order80
    prefer-ip-address: true

修改完成后,重启服务,登录 Eureka 注册中心,即可看到服务已经注册到了注册中心,也能够正常调用。

Spring Cloud 入门 --- Eureka 服务注册中心【随笔】

Eureka的常用配置
eureka:
  client: #eureka客户端配置
    register-with-eureka: true #是否将自己注册到eureka服务端上去
    fetch-registry: true #是否获取eureka服务端上注册的服务列表
    service-url:
      defaultZone: http://localhost:8001/eureka/ # 指定注册中心地址
    enabled: true # 启用eureka客户端
    registry-fetch-interval-seconds: 30 #定义去eureka服务端获取服务列表的时间间隔
  instance: #eureka客户端实例配置
  	instance-id: payment8001  #客户端id
  	hostname: localhost #服务主机名称
  	prefer-ip-address: false #是否优先使用ip来作为主机名
    lease-renewal-interval-in-seconds: 30 #Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
    lease-expiration-duration-in-seconds: 90 #Eureka服务端在收到最后一次心跳后的等待时间上限,单位秒(默认90秒)
    metadata-map:
      zone: shenzhen #所在区域
  server: #eureka服务端配置
    enable-self-preservation: false #关闭eureka服务端的保护机制
    eviction-interval-timer-in-ms: 2000 #剔除的间隔时间 单位毫秒(默认90秒)

相关标签: spring cloud